Re: [PATCH] usb: gadget: Don't allocate zero-length buffers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Greg,

W dniu 20.03.2019 o 15:25, Greg KH pisze:
On Wed, Mar 20, 2019 at 01:56:41PM +0100, Andrzej Pietrasiewicz wrote:
Don't actually allocate anything if userspace enqueues a zero-length
buffer. Otherwise vmalloc of zero-sized area will be attempted in
ffs_build_sg_list().

<snip>


Are you sure this is ok?  zero length packets mean something in the USB
protocol :)


Yeah, I do know they do!


What is the problem of trying to allocate a buffer of 0 bytes?

My understanding is that if a zero-length buffer is enqueued, then

nobody will read from it (the read will be zero bytes, to be precise),

so returning ZERO_SIZE_PTR shouldn't hurt. On the other hand,

if scatter-gather mode is used (depends on what the underlying UDC declares)

then ffs_alloc_buffer() takes the ffs_build_sg_list() branch and then vmalloc does

the below:

[   23.637611] some-process: vmalloc: allocation failure: 0 bytes, mode:0x6000c0(GFP_KERNEL), nodemask=
(null)
[   23.642435] CPU: 3 PID: 307 Comm: some-process Not tainted 5.0.0-00048-g762eb03d5d27-dirty #151
[   23.650903] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[   23.656983] [<c0112464>] (unwind_backtrace) from [<c010df90>] (show_stack+0x10/0x14) [   23.664705] [<c010df90>] (show_stack) from [<c0a53914>] (dump_stack+0x98/0xc4) [   23.671906] [<c0a53914>] (dump_stack) from [<c023b18c>] (warn_alloc+0xd0/0x168) [   23.679111] [<c023b18c>] (warn_alloc) from [<c027921c>] (__vmalloc_node_range+0x230/0x25c) [   23.687350] [<c027921c>] (__vmalloc_node_range) from [<c02794e4>] (__vmalloc_node.constprop.12+0x48/0x
50)
[   23.696904] [<c02794e4>] (__vmalloc_node.constprop.12) from [<c0279580>] (vmalloc+0x2c/0x34) [   23.705328] [<c0279580>] (vmalloc) from [<c06a76cc>] (ffs_epfile_io+0x4ac/0x750) [   23.712693] [<c06a76cc>] (ffs_epfile_io) from [<c06a7a24>] (ffs_epfile_write_iter+0xb4/0x168) [   23.721209] [<c06a7a24>] (ffs_epfile_write_iter) from [<c0295004>] (__vfs_write+0x118/0x17c) [   23.729623] [<c0295004>] (__vfs_write) from [<c02951f0>] (vfs_write+0xa4/0x184) [   23.736914] [<c02951f0>] (vfs_write) from [<c0295410>] (ksys_write+0x4c/0xac) [   23.744025] [<c0295410>] (ksys_write) from [<c0101000>] (ret_fast_syscall+0x0/0x28)
[   23.751664] Exception stack(0xec8e1fa8 to 0xec8e1ff0)
[   23.756686] 1fa0:                   00000000 b6b02cc0 00000004 b57fed53 00000000 00000004 [   23.764861] 1fc0: 00000000 b6b02cc0 00000000 00000004 b6b02cc0 00000000 00000000 00000000
[   23.773019] 1fe0: 00000000 b57fed40 00000000 b6de73d0
[   23.779588] Mem-Info:
[   23.780342] active_anon:1530 inactive_anon:4412 isolated_anon:0
[   23.780342]  active_file:3680 inactive_file:3342 isolated_file:0
[   23.780342]  unevictable:0 dirty:18 writeback:0 unstable:0
[   23.780342]  slab_reclaimable:4245 slab_unreclaimable:4430
[   23.780342]  mapped:2496 shmem:4427 pagetables:79 bounce:0
[   23.780342]  free:478387 free_pcp:1242 free_cma:24244
[   23.813879] Node 0 active_anon:6120kB inactive_anon:17648kB active_file:14720kB inactive_file:13368kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:9984kB dirty:72kB writeback:0kB shmem:17708k
B writeback_tmp:0kB unstable:0kB all_unreclaimable? no
[   23.836882] Normal free:696520kB min:3452kB low:4312kB high:5172kB active_anon:0kB inactive_anon:0kB a ctive_file:7576kB inactive_file:1028kB unevictable:0kB writepending:52kB present:786432kB managed:746456k B mlocked:0kB kernel_stack:824kB pagetables:0kB bounce:0kB free_pcp:2624kB local_pcp:508kB free_cma:0kB
[   23.864320] lowmem_reserve[]: 0 9112 9112
[   23.868056] HighMem free:1217028kB min:512kB low:1860kB high:3208kB active_anon:6120kB inactive_anon:1 7648kB active_file:7144kB inactive_file:12340kB unevictable:0kB writepending:20kB present:1264640kB manag ed:1264640kB mlocked:0kB kernel_stack:0kB pagetables:316kB bounce:0kB free_pcp:2336kB local_pcp:800kB fre
e_cma:96976kB
[   23.896900] lowmem_reserve[]: 0 0 0
[   23.900161] Normal: 2*4kB (UM) 23*8kB (UME) 9*16kB (UM) 0*32kB 1*64kB (M) 2*128kB (UM) 2*256kB (ME) 2*
512kB (UE) 0*1024kB 5*2048kB (UME) 167*4096kB (M) = 696464kB
[   23.914775] HighMem: 1*4kB (U) 0*8kB 2*16kB (UC) 1*32kB (U) 1*64kB (C) 3*128kB (UMC) 0*256kB 2*512kB (
UC) 1*1024kB (M) 3*2048kB (UMC) 295*4096kB (MC) = 1217028kB
[   23.929179] 11488 total pagecache pages
[   23.932933] 0 pages in swap cache
[   23.936179] Swap cache stats: add 0, delete 0, find 0/0
[   23.941439] Free swap  = 0kB
[   23.944246] Total swap = 0kB
[   23.947112] 512768 pages RAM
[   23.949974] 316160 pages HighMem/MovableOnly
[   23.954282] 9994 pages reserved
[   23.957357] 24576 pages cma reserved





[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux