lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 222/459] iommu/iova: Silence warnings under memory pressure
    Date
    From: Qian Cai <cai@lca.pw>

    [ Upstream commit 944c9175397476199d4dd1028d87ddc582c35ee8 ]

    When running heavy memory pressure workloads, this 5+ old system is
    throwing endless warnings below because disk IO is too slow to recover
    from swapping. Since the volume from alloc_iova_fast() could be large,
    once it calls printk(), it will trigger disk IO (writing to the log
    files) and pending softirqs which could cause an infinite loop and make
    no progress for days by the ongoimng memory reclaim. This is the counter
    part for Intel where the AMD part has already been merged. See the
    commit 3d708895325b ("iommu/amd: Silence warnings under memory
    pressure"). Since the allocation failure will be reported in
    intel_alloc_iova(), so just call dev_err_once() there because even the
    "ratelimited" is too much, and silence the one in alloc_iova_mem() to
    avoid the expensive warn_alloc().

    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    slab_out_of_memory: 66 callbacks suppressed
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    cache: iommu_iova, object size: 40, buffer size: 448, default order:
    0, min order: 0
    node 0: slabs: 1822, objs: 16398, free: 0
    node 1: slabs: 2051, objs: 18459, free: 31
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    cache: iommu_iova, object size: 40, buffer size: 448, default order:
    0, min order: 0
    node 0: slabs: 1822, objs: 16398, free: 0
    node 1: slabs: 2051, objs: 18459, free: 31
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    cache: iommu_iova, object size: 40, buffer size: 448, default order:
    0, min order: 0
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    node 0: slabs: 697, objs: 4182, free: 0
    node 0: slabs: 697, objs: 4182, free: 0
    node 0: slabs: 697, objs: 4182, free: 0
    node 0: slabs: 697, objs: 4182, free: 0
    node 1: slabs: 381, objs: 2286, free: 27
    node 1: slabs: 381, objs: 2286, free: 27
    node 1: slabs: 381, objs: 2286, free: 27
    node 1: slabs: 381, objs: 2286, free: 27
    node 0: slabs: 1822, objs: 16398, free: 0
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    node 1: slabs: 2051, objs: 18459, free: 31
    node 0: slabs: 697, objs: 4182, free: 0
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    node 1: slabs: 381, objs: 2286, free: 27
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    node 0: slabs: 697, objs: 4182, free: 0
    node 1: slabs: 381, objs: 2286, free: 27
    hpsa 0000:03:00.0: DMAR: Allocating 1-page iova failed
    warn_alloc: 96 callbacks suppressed
    kworker/11:1H: page allocation failure: order:0,
    mode:0xa20(GFP_ATOMIC), nodemask=(null),cpuset=/,mems_allowed=0-1
    CPU: 11 PID: 1642 Comm: kworker/11:1H Tainted: G B
    Hardware name: HP ProLiant XL420 Gen9/ProLiant XL420 Gen9, BIOS U19
    12/27/2015
    Workqueue: kblockd blk_mq_run_work_fn
    Call Trace:
    dump_stack+0xa0/0xea
    warn_alloc.cold.94+0x8a/0x12d
    __alloc_pages_slowpath+0x1750/0x1870
    __alloc_pages_nodemask+0x58a/0x710
    alloc_pages_current+0x9c/0x110
    alloc_slab_page+0xc9/0x760
    allocate_slab+0x48f/0x5d0
    new_slab+0x46/0x70
    ___slab_alloc+0x4ab/0x7b0
    __slab_alloc+0x43/0x70
    kmem_cache_alloc+0x2dd/0x450
    SLUB: Unable to allocate memory on node -1, gfp=0xa20(GFP_ATOMIC)
    alloc_iova+0x33/0x210
    cache: skbuff_head_cache, object size: 208, buffer size: 640, default
    order: 0, min order: 0
    node 0: slabs: 697, objs: 4182, free: 0
    alloc_iova_fast+0x62/0x3d1
    node 1: slabs: 381, objs: 2286, free: 27
    intel_alloc_iova+0xce/0xe0
    intel_map_sg+0xed/0x410
    scsi_dma_map+0xd7/0x160
    scsi_queue_rq+0xbf7/0x1310
    blk_mq_dispatch_rq_list+0x4d9/0xbc0
    blk_mq_sched_dispatch_requests+0x24a/0x300
    __blk_mq_run_hw_queue+0x156/0x230
    blk_mq_run_work_fn+0x3b/0x40
    process_one_work+0x579/0xb90
    worker_thread+0x63/0x5b0
    kthread+0x1e6/0x210
    ret_from_fork+0x3a/0x50
    Mem-Info:
    active_anon:2422723 inactive_anon:361971 isolated_anon:34403
    active_file:2285 inactive_file:1838 isolated_file:0
    unevictable:0 dirty:1 writeback:5 unstable:0
    slab_reclaimable:13972 slab_unreclaimable:453879
    mapped:2380 shmem:154 pagetables:6948 bounce:0
    free:19133 free_pcp:7363 free_cma:0

    Signed-off-by: Qian Cai <cai@lca.pw>
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/iommu/intel-iommu.c | 3 ++-
    drivers/iommu/iova.c | 2 +-
    2 files changed, 3 insertions(+), 2 deletions(-)

    diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
    index dd5db856dcaf9..760a242d0801d 100644
    --- a/drivers/iommu/intel-iommu.c
    +++ b/drivers/iommu/intel-iommu.c
    @@ -3401,7 +3401,8 @@ static unsigned long intel_alloc_iova(struct device *dev,
    iova_pfn = alloc_iova_fast(&domain->iovad, nrpages,
    IOVA_PFN(dma_mask), true);
    if (unlikely(!iova_pfn)) {
    - dev_err(dev, "Allocating %ld-page iova failed", nrpages);
    + dev_err_once(dev, "Allocating %ld-page iova failed\n",
    + nrpages);
    return 0;
    }

    diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
    index c7a914b9bbbc4..0e6a9536eca62 100644
    --- a/drivers/iommu/iova.c
    +++ b/drivers/iommu/iova.c
    @@ -233,7 +233,7 @@ static DEFINE_MUTEX(iova_cache_mutex);

    struct iova *alloc_iova_mem(void)
    {
    - return kmem_cache_zalloc(iova_cache, GFP_ATOMIC);
    + return kmem_cache_zalloc(iova_cache, GFP_ATOMIC | __GFP_NOWARN);
    }
    EXPORT_SYMBOL(alloc_iova_mem);

    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 17:08    [W:4.441 / U:1.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site