Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <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>

authored by

KOSAKI Motohiro and committed by
Linus Torvalds
fd1f87d2 e6315bb1

+2 -2
+2 -2
ipc/mqueue.c
··· 153 153 info->attr.mq_msgsize = attr->mq_msgsize; 154 154 } 155 155 mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *); 156 - if (mq_msg_tblsz > KMALLOC_MAX_SIZE) 156 + if (mq_msg_tblsz > PAGE_SIZE) 157 157 info->messages = vmalloc(mq_msg_tblsz); 158 158 else 159 159 info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL); ··· 266 266 spin_lock(&info->lock); 267 267 for (i = 0; i < info->attr.mq_curmsgs; i++) 268 268 free_msg(info->messages[i]); 269 - if (info->attr.mq_maxmsg * sizeof(struct msg_msg *) > KMALLOC_MAX_SIZE) 269 + if (is_vmalloc_addr(info->messages)) 270 270 vfree(info->messages); 271 271 else 272 272 kfree(info->messages);