• Peter Chen's avatar
    usb: chipidea: udc: add software sg list support · e48aa1eb
    Peter Chen authored
    The chipidea controller doesn't support short transfer for sg list,
    so we still keep setting IOC per TD, otherwise, there will be no interrupt
    for short transfer. Each TD has five entries for data buffer, each data
    buffer could be non-countinuous 4KB buffer, so it could handle
    up to 5 sg buffers one time. The benefit of this patch is avoiding
    OOM for low memory system(eg, 256MB) during large USB transfers, see
    below for detail. The non-sg handling has not changed.
    
    ufb: page allocation failure: order:4, mode:0x40cc0(GFP_KERNEL|__GFP_COMP),
    nodemask=(null),cpuset=/,mems_allowed=0
    CPU: 2 PID: 370 Comm: ufb Not tainted 5.4.3-1.1.0+g54b3750d61fd #1
    Hardware name: NXP i.MX8MNano DDR4 EVK board (DT)
    Call trace:
     dump_backtrace+0x0/0x140
     show_stack+0x14/0x20
     dump_stack+0xb4/0xf8
     warn_alloc+0xec/0x158
     __alloc_pages_slowpath+0x9cc/0x9f8
     __alloc_pages_nodemask+0x21c/0x280
     alloc_pages_current+0x7c/0xe8
     kmalloc_order+0x1c/0x88
     __kmalloc+0x25c/0x298
     ffs_epfile_io.isra.0+0x20c/0x7d0
     ffs_epfile_read_iter+0xa8/0x188
     new_sync_read+0xe4/0x170
     __vfs_read+0x2c/0x40
     vfs_read+0xc8/0x1a0
     ksys_read+0x68/0xf0
     __arm64_sys_read+0x18/0x20
     el0_svc_common.constprop.0+0x68/0x160
     el0_svc_handler+0x20/0x80
     el0_svc+0x8/0xc
    Mem-Info:
    active_anon:2856 inactive_anon:5269 isolated_anon:12
     active_file:5238 inactive_file:18803 isolated_file:0
     unevictable:0 dirty:22 writeback:416 unstable:0
     slab_reclaimable:4073 slab_unreclaimable:3408
     mapped:727 shmem:7393 pagetables:37 bounce:0
     free:4104 free_pcp:118 free_cma:0
    Node 0 active_anon:11436kB inactive_anon:21076kB active_file:20988kB inactive_file:75216kB unevictable:0kB isolated(ano
    Node 0 DMA32 free:16820kB min:1808kB low:2260kB high:2712kB active_anon:11436kB inactive_anon:21076kB active_file:2098B
    lowmem_reserve[]: 0 0 0
    Node 0 DMA32: 508*4kB (UME) 242*8kB (UME) 730*16kB (UM) 21*32kB (UME) 5*64kB (UME) 2*128kB (M) 0*256kB 0*512kB 0*1024kB
    Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB
    Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=32768kB
    Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
    Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=64kB
    31455 total pagecache pages
    0 pages in swap cache
    Swap cache stats: add 0, delete 0, find 0/0
    Free swap  = 0kB
    Total swap = 0kB
    65536 pages RAM
    0 pages HighMem/MovableOnly
    10766 pages reserved
    0 pages cma reserved
    0 pages hwpoisoned
    Reviewed-by: default avatarJun Li <jun.li@nxp.com>
    Signed-off-by: default avatarPeter Chen <peter.chen@nxp.com>
    e48aa1eb
udc.h 2.28 KB