patch "usb: devio, do not warn when allocation fails" added to usb-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
usb: devio, do not warn when allocation fails
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
70f7ca9a0262784d0b80727860a63d64ab228e7bMon Sep 17 00:00:00 2001
From: Jiri Slaby <[email protected]>
Date: Wed, 15 Jun 2016 15:56:11 +0200
Subject: usb: devio, do not warn when allocation fails
usbdev_mmap allocates a buffer. The size of the buffer is determined by a user. So with this code (no need to be root):
int fd = open("/dev/bus/usb/001/001", O_RDONLY);
mmap(NULL, 0x800000, PROT_READ, MAP_SHARED, fd, 0);we can see a warning:
WARNING: CPU: 0 PID: 21771 at ../mm/page_alloc.c:3563 __alloc_pages_slowpath+0x1036/0x16e0() ... Call Trace: [<ffffffff8117a3ae>] ? warn_slowpath_null+0x2e/0x40 [<ffffffff815178b6>] ? __alloc_pages_slowpath+0x1036/0x16e0 [<ffffffff81516880>] ? warn_alloc_failed+0x250/0x250 [<ffffffff8151226b>] ? get_page_from_freelist+0x75b/0x28b0 [<ffffffff815184e3>] ? __alloc_pages_nodemask+0x583/0x6b0 [<ffffffff81517f60>] ? __alloc_pages_slowpath+0x16e0/0x16e0 [<ffffffff810565d4>] ? dma_generic_alloc_coherent+0x104/0x220 [<ffffffffa0269e56>] ? hcd_buffer_alloc+0x1d6/0x3e0 [usbcore] [<ffffffffa0269c80>] ? hcd_buffer_destroy+0xa0/0xa0 [usbcore] [<ffffffffa0228f05>] ? usb_alloc_coherent+0x65/0x90 [usbcore] [<ffffffffa0275c05>] ? usbdev_mmap+0x1a5/0x770 [usbcore]
...
Allocations like this one should be marked as __GFP_NOWARN. So do so.
The size could be also clipped by something like:
if (size >= (1 << (MAX_ORDER + PAGE_SHIFT - 1))) return -ENOMEM;
But I think the overall limit of 16M (by usbfs_increase_memory_usage) is enough, so that we only silence the warning here.
--- drivers/usb/core/devio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/core/devio.c +2 -1
@@ -241,7 +241,8 @@ static int usbdev_mmap(struct file *file, struct vm_area_struct *vma) goto error_decrease_mem; } - mem =usb_alloc_coherent (ps->dev, size,GFP_USER , &dma_handle); + mem =usb_alloc_coherent (ps->dev, size,GFP_USER | __GFP_NOWARN, + &dma_handle);if (!mem) { ret = -ENOMEM ; goto error_free_usbm;
Signature · 1 line
2.9.2