]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mqueue: don't use kmalloc with KMALLOC_MAX_SIZE
authorKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Thu, 31 May 2012 23:26:31 +0000 (16:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 1 Jun 2012 00:49:31 +0000 (17:49 -0700)
KMALLOC_MAX_SIZE is not a good threshold.  It is extremely high and
problematic.  Unfortunately, some silly drivers depend on this and we
can't change it.  But any new code needn't use such extreme ugly high
order allocations.  It brings us awful fragmentation issues and system
slowdown.

Signed-off-by: KOSAKI Motohiro <mkosaki@jp.fujitsu.com>
Acked-by: Doug Ledford <dledford@redhat.com>
Acked-by: Joe Korty <joe.korty@ccur.com>
Cc: Amerigo Wang <amwang@redhat.com>
Cc: Serge E. Hallyn <serue@us.ibm.com>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Joe Korty <joe.korty@ccur.com>
Cc: Manfred Spraul <manfred@colorfullife.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
ipc/mqueue.c

index f8eba5e46c5a4bba21aea4b23b58044dd0842004..6828e2c93cef5c7a79ad7135ae386e2c2421fd3e 100644 (file)
@@ -153,7 +153,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb,
                        info->attr.mq_msgsize = attr->mq_msgsize;
                }
                mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *);
-               if (mq_msg_tblsz > KMALLOC_MAX_SIZE)
+               if (mq_msg_tblsz > PAGE_SIZE)
                        info->messages = vmalloc(mq_msg_tblsz);
                else
                        info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL);
@@ -266,7 +266,7 @@ static void mqueue_evict_inode(struct inode *inode)
        spin_lock(&info->lock);
        for (i = 0; i < info->attr.mq_curmsgs; i++)
                free_msg(info->messages[i]);
-       if (info->attr.mq_maxmsg * sizeof(struct msg_msg *) > KMALLOC_MAX_SIZE)
+       if (is_vmalloc_addr(info->messages))
                vfree(info->messages);
        else
                kfree(info->messages);