• Jiri Slaby's avatar
    usb: devio, do not warn when allocation fails · 70f7ca9a
    Jiri Slaby authored
    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.
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Steinar H. Gunderson <sesse@google.com>
    Cc: Markus Rechberger <mrechberger@gmail.com>
    Fixes: f7d34b44 (USB: Add support for usbfs zerocopy.)
    Cc: 4.6+ <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    70f7ca9a
devio.c 65.4 KB