[RFC PATCH v4 00/15] Slab Movable Objects (SMO)

Tobin C. Harding
2019-04-30T03:08:44Z

Hi,

Another iteration of the SMO patch set, updates to this version are
restricted to the dcache patch #14.

Applies on top of Linus' tree (tag: v5.1-rc6).

This is a patch set implementing movable objects within the SLUB
allocator. This is work based on Christopher Lameter's patch set:

https://lore.kernel.org/patchwork/project/lkml/list/?series=377335

The original code logic is from that set and implemented by Christopher.
Clean up, refactoring, documentation, and additional features by myself.
Responsibility for any bugs remaining falls solely with myself.

Changes to this version:

Re-write the dcache Slab Movable Objects isolate/migrate functions.
Based on review/suggestions by Alexander on the last version.

In this version the isolate function loops over the object vector and
builds a shrink list for all objects that have refcount==0 AND are NOT
on anyone else's shrink list. A pointer to this list is returned from
the isolate function and passed to the migrate function (by the SMO
infrastructure). The dentry migration function d_partial_shrink()
simply calls shrink_dentry_list() on the received shrink list pointer
and frees the memory associated with the list_head.

Hopefully if this is all ok I can move on to violating the inode
slab cache :)

FWIW testing on a VM in Qemu brings this mild benefit to the dentry slab
cache with no _apparent_ negatives.

CONFIG_SLUB_DEBUG=y
CONFIG_SLUB=y
CONFIG_SLUB_CPU_PARTIAL=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_SLUB_STATS=y
CONFIG_SMO_NODE=y
CONFIG_DCACHE_SMO=y

[root@vm ~]# slabinfo dentry -r | head -n 13

Slabcache: dentry Aliases: 0 Order : 1 Objects: 38585
** Reclaim accounting active
** Defragmentation at 30%

Sizes (bytes) Slabs Debug Memory
------------------------------------------------------------------------
Object : 192 Total : 2582 Sanity Checks : On Total: 21151744
SlabObj: 528 Full : 2547 Redzoning : On Used : 7408320
SlabSiz: 8192 Partial: 35 Poisoning : On Loss : 13743424
Loss : 336 CpuSlab: 0 Tracking : On Lalig: 12964560
Align : 8 Objects: 15 Tracing : Off Lpadd: 702304

[root@vm ~]# slabinfo dentry --shrink
[root@vm ~]# slabinfo dentry -r | head -n 13

Slabcache: dentry Aliases: 0 Order : 1 Objects: 38426
** Reclaim accounting active
** Defragmentation at 30%

Sizes (bytes) Slabs Debug Memory
------------------------------------------------------------------------
Object : 192 Total : 2578 Sanity Checks : On Total: 21118976
SlabObj: 528 Full : 2547 Redzoning : On Used : 7377792
SlabSiz: 8192 Partial: 31 Poisoning : On Loss : 13741184
Loss : 336 CpuSlab: 0 Tracking : On Lalig: 12911136
Align : 8 Objects: 15 Tracing : Off Lpadd: 701216

Please note, this dentry shrink implementation is 'best effort', results
vary. This is as is expected. We are trying to unobtrusively shrink
the dentry cache.

thanks,
Tobin.

Tobin C. Harding (15):
slub: Add isolate() and migrate() methods
tools/vm/slabinfo: Add support for -C and -M options
slub: Sort slab cache list
slub: Slab defrag core
tools/vm/slabinfo: Add remote node defrag ratio output
tools/vm/slabinfo: Add defrag_used_ratio output
tools/testing/slab: Add object migration test module
tools/testing/slab: Add object migration test suite
xarray: Implement migration function for objects
tools/testing/slab: Add XArray movable objects tests
slub: Enable moving objects to/from specific nodes
slub: Enable balancing slabs across nodes
dcache: Provide a dentry constructor
dcache: Implement partial shrink via Slab Movable Objects
dcache: Add CONFIG_DCACHE_SMO

Documentation/ABI/testing/sysfs-kernel-slab | 14 +
fs/dcache.c | 110 ++-
include/linux/slab.h | 71 ++
include/linux/slub_def.h | 10 +
lib/radix-tree.c | 13 +
lib/xarray.c | 49 ++
mm/Kconfig | 14 +
mm/slab_common.c | 2 +-
mm/slub.c | 819 ++++++++++++++++++--
tools/testing/slab/Makefile | 10 +
tools/testing/slab/slub_defrag.c | 567 ++++++++++++++
tools/testing/slab/slub_defrag.py | 451 +++++++++++
tools/testing/slab/slub_defrag_xarray.c | 211 +++++
tools/vm/slabinfo.c | 51 +-
14 files changed, 2299 insertions(+), 93 deletions(-)
create mode 100644 tools/testing/slab/Makefile
create mode 100644 tools/testing/slab/slub_defrag.c
create mode 100755 tools/testing/slab/slub_defrag.py
create mode 100644 tools/testing/slab/slub_defrag_xarray.c

--
2.21.0