xfs: can't use kmem_zalloc() for attribute buffers
authorDave Chinner <dchinner@redhat.com>
Thu, 12 May 2022 05:12:57 +0000 (15:12 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 12 May 2022 05:12:57 +0000 (15:12 +1000)
commit45ff8b471cdc58701a7ba5c5dcd8dfc57ae06829
tree36dc8d8d0387718127c2cac40ce5b526623e97f6
parent51e6104fdb95f377c8741794778319bd413f4fff
xfs: can't use kmem_zalloc() for attribute buffers

Because heap allocation of 64kB buffers will fail:

....
 XFS: fs_mark(8414) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8417) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8409) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8428) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8430) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8437) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8433) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8406) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8412) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8432) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
 XFS: fs_mark(8424) possible memory allocation deadlock size 65768 in kmem_alloc (mode:0x2d40)
....

I'd use kvmalloc() instead, but....

- 48.19% xfs_attr_create_intent
  - 46.89% xfs_attri_init
     - kvmalloc_node
- 46.04% __kmalloc_node
   - kmalloc_large_node
      - 45.99% __alloc_pages
 - 39.39% __alloc_pages_slowpath.constprop.0
    - 38.89% __alloc_pages_direct_compact
       - 38.71% try_to_compact_pages
  - compact_zone_order
  - compact_zone
     - 21.09% isolate_migratepages_block
  10.31% PageHuge
  5.82% set_pfnblock_flags_mask
  0.86% get_pfnblock_flags_mask
     - 4.48% __reset_isolation_suitable
  4.44% __reset_isolation_pfn
     - 3.56% __pageblock_pfn_to_page
  1.33% pfn_to_online_page
       2.83% get_pfnblock_flags_mask
     - 0.87% migrate_pages
  0.86% compaction_alloc
       0.84% find_suitable_fallback
 - 6.60% get_page_from_freelist
      4.99% clear_page_erms
    - 1.19% _raw_spin_lock_irqsave
       - do_raw_spin_lock
    __pv_queued_spin_lock_slowpath
- 0.86% __vmalloc_node_range
     0.65% __alloc_pages_bulk

.... this is just yet another reminder of how much kvmalloc() sucks.
So lift xlog_cil_kvmalloc(), rename it to xlog_kvmalloc() and use
that instead....

We also clean up the attribute name and value lengths as they no
longer need to be rounded out to sizes compatible with log vectors.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_attr_item.c
fs/xfs/xfs_log_cil.c
fs/xfs/xfs_log_priv.h