Commit fd1f87d2 authored by KOSAKI Motohiro's avatar KOSAKI Motohiro Committed by Linus Torvalds

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: default avatarKOSAKI Motohiro <mkosaki@jp.fujitsu.com>
Acked-by: default avatarDoug Ledford <dledford@redhat.com>
Acked-by: default avatarJoe 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e6315bb1
...@@ -153,7 +153,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, ...@@ -153,7 +153,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb,
info->attr.mq_msgsize = attr->mq_msgsize; info->attr.mq_msgsize = attr->mq_msgsize;
} }
mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *); 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); info->messages = vmalloc(mq_msg_tblsz);
else else
info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL); info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL);
...@@ -266,7 +266,7 @@ static void mqueue_evict_inode(struct inode *inode) ...@@ -266,7 +266,7 @@ static void mqueue_evict_inode(struct inode *inode)
spin_lock(&info->lock); spin_lock(&info->lock);
for (i = 0; i < info->attr.mq_curmsgs; i++) for (i = 0; i < info->attr.mq_curmsgs; i++)
free_msg(info->messages[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); vfree(info->messages);
else else
kfree(info->messages); kfree(info->messages);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment