diff options
author | KOSAKI Motohiro <[email protected]> | 2012-05-31 16:26:31 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2012-05-31 17:49:31 -0700 |
commit | fd1f87d24d492fda464bedf10a5dd5174ff9b065 (patch) | |
tree | fe2de6c714277ee2ea739d1bfa81a0e539f0a46a | |
parent | e6315bb154e778391ce64b194756bd3d108dadf6 (diff) |
mqueue: don't use kmalloc with KMALLOC_MAX_SIZE
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 <[email protected]>
Acked-by: Doug Ledford <[email protected]>
Acked-by: Joe Korty <[email protected]>
Cc: Amerigo Wang <[email protected]>
Cc: Serge E. Hallyn <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Joe Korty <[email protected]>
Cc: Manfred Spraul <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | ipc/mqueue.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index f8eba5e46c5a..6828e2c93cef 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -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); |