[RFC] A Framework for Allocator Partitioning Hints

I was curious if I can get it to work for the Linux kernel. Here’s a prototype:

Critically, the Linux kernel’s macro-based wrapfest of the kmalloc* functions meant that automatic instrumentation is not the best approach, as by the time we actually call the inner kmalloc, the compiler wouldn’t see the original call expression anymore.

For that, the builtin approach actually makes a lot of sense. I found a builtin with this design worked best:

 [...] `__builtin_alloc_token_infer(<malloc-args>, ...)` to allow
 compile-time querying of the token ID, where the builtin arguments
 mirror those normally passed to any allocation function. The argument
 expressions are unevaluated operands. For type-based token modes, the
 same type inference logic is used as for untyped allocation calls.

The current Clang implementation is found here: GitHub - melver/llvm-project at alloc-token - in particular, the builtin can be used independently of -fsanitize=alloc-token, but otherwise shares all the inference (frontend) and token ID calculation (middle-end).

With all that, I can boot that kernel, and /proc/slabinfo shows me:

/proc/slabinfo
kmalloc-part-15-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-15-4k      0      4  12288    2    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-15-2k      5     10   6144    5    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-15-1k     11     20   3072   10    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-15-512     39     42   1536   21    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-15-256     24     84    768   21    4 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-15-128      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-15-64     95    128    256   32    2 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-15-32     51     75    160   25    1 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-15-16      0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-15-8      0      0    112   36    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-15-192     13     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-15-96    196    216    224   36    2 : tunables    0    0    0 : slabdata      6      6      0
kmalloc-part-14-8k      2      3  24576    1    8 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-14-4k      7      8  12288    2    8 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-14-2k     13     25   6144    5    8 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-part-14-1k    237    240   3072   10    8 : tunables    0    0    0 : slabdata     24     24      0
kmalloc-part-14-512     10     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-14-256     42     42    768   21    4 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-14-128     28     42    384   21    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-14-64    257    288    256   32    2 : tunables    0    0    0 : slabdata      9      9      0
kmalloc-part-14-32    496    500    160   25    1 : tunables    0    0    0 : slabdata     20     20      0
kmalloc-part-14-16     25     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-14-8      2     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-14-192     26     42    384   21    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-14-96    230    252    224   36    2 : tunables    0    0    0 : slabdata      7      7      0
kmalloc-part-13-8k      0      1  24576    1    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-13-4k      1      2  12288    2    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-13-2k      1      5   6144    5    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-13-1k     27     30   3072   10    8 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-13-512    188    189   1536   21    8 : tunables    0    0    0 : slabdata      9      9      0
kmalloc-part-13-256      7     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-13-128     35     42    384   21    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-13-64    437    448    256   32    2 : tunables    0    0    0 : slabdata     14     14      0
kmalloc-part-13-32     24     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-13-16     78    128    128   32    1 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-13-8      0      0    112   36    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-13-192     24     42    384   21    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-13-96      8     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-12-8k      2      2  24576    1    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-12-4k      0      0  12288    2    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-12-2k     28     30   6144    5    8 : tunables    0    0    0 : slabdata      6      6      0
kmalloc-part-12-1k     18     20   3072   10    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-12-512     45     63   1536   21    8 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-12-256    439    609    768   21    4 : tunables    0    0    0 : slabdata     29     29      0
kmalloc-part-12-128      7     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-12-64    228    256    256   32    2 : tunables    0    0    0 : slabdata      8      8      0
kmalloc-part-12-32     78    100    160   25    1 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-12-16      5     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-12-8      4     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-12-192    394    567    384   21    2 : tunables    0    0    0 : slabdata     27     27      0
kmalloc-part-12-96     44     72    224   36    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-11-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-11-4k      0      0  12288    2    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-11-2k      2      5   6144    5    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-11-1k     51     60   3072   10    8 : tunables    0    0    0 : slabdata      6      6      0
kmalloc-part-11-512    143    147   1536   21    8 : tunables    0    0    0 : slabdata      7      7      0
kmalloc-part-11-256      0     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-11-128      2     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-11-64    109    128    256   32    2 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-11-32     18     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-11-16      0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-11-8      0      0    112   36    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-11-192     10     42    384   21    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-11-96    370    432    224   36    2 : tunables    0    0    0 : slabdata     12     12      0
kmalloc-part-10-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-10-4k     13     14  12288    2    8 : tunables    0    0    0 : slabdata      7      7      0
kmalloc-part-10-2k      6     10   6144    5    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-10-1k     13     20   3072   10    8 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-10-512     82     84   1536   21    8 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-10-256     99    105    768   21    4 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-part-10-128     60     63    384   21    2 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-10-64     55     64    256   32    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-10-32    110    125    160   25    1 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-part-10-16     10     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-10-8      1     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-10-192      2     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-10-96     18     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-09-4k     10     10  12288    2    8 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-part-09-2k      5      5   6144    5    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-1k      4     10   3072   10    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-512     16     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-256      0     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-128      0     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-64    116    128    256   32    2 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-09-32     60     75    160   25    1 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-09-16      0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-09-8     10     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-09-192    338    357    384   21    2 : tunables    0    0    0 : slabdata     17     17      0
kmalloc-part-09-96     80    108    224   36    2 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-08-8k      6      6  24576    1    8 : tunables    0    0    0 : slabdata      6      6      0
kmalloc-part-08-4k      7     10  12288    2    8 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-part-08-2k    110    115   6144    5    8 : tunables    0    0    0 : slabdata     23     23      0
kmalloc-part-08-1k     26     30   3072   10    8 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-08-512     13     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-08-256    424    441    768   21    4 : tunables    0    0    0 : slabdata     21     21      0
kmalloc-part-08-128     80     84    384   21    2 : tunables    0    0    0 : slabdata      4      4      0
kmalloc-part-08-64    206    224    256   32    2 : tunables    0    0    0 : slabdata      7      7      0
kmalloc-part-08-32     63     75    160   25    1 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-08-16    137    160    128   32    1 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-part-08-8      7     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-08-192      3     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-08-96   1817   1836    224   36    2 : tunables    0    0    0 : slabdata     51     51      0
kmalloc-part-07-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-07-4k      0      2  12288    2    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-07-2k      0      0   6144    5    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-07-1k      0     10   3072   10    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-07-512      0     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-07-256      0     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-07-128      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-07-64     68     96    256   32    2 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-part-07-32      9     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-07-16      0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-07-8     14     72    112   36    1 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-07-192      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-07-96      2     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-06-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-4k      0      0  12288    2    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-2k      0      0   6144    5    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-1k      0      0   3072   10    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-512      0      0   1536   21    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-256      0      0    768   21    4 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-128      2     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-06-64      2     32    256   32    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-06-32      1     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-06-16      5     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-06-8      5     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-06-192      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-06-96      1     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-05-8k      1      1  24576    1    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-05-4k      1      2  12288    2    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-05-2k      1      5   6144    5    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-05-1k      0      0   3072   10    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-512      0      0   1536   21    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-256      8     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-05-128      1     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-05-64      0      0    256   32    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-32      0      0    160   25    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-16      0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-8      0      0    112   36    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-192      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-05-96      3     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-04-4k     13     14  12288    2    8 : tunables    0    0    0 : slabdata      7      7      0
kmalloc-part-04-2k      3      5   6144    5    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-1k      3     10   3072   10    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-512      3     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-256     10     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-128     24     42    384   21    2 : tunables    0    0    0 : slabdata      2      2      0
kmalloc-part-04-64      0     32    256   32    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-32     13     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-16      0     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-8      2     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-192      0     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-04-96      0     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-03-4k      1      2  12288    2    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-2k      0      5   6144    5    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-1k      0     10   3072   10    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-512      0     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-256      0     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-128      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-03-64      9     32    256   32    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-32      9     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-16      2     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-8      4     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-192      0     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-03-96      0     36    224   36    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-02-4k      1      2  12288    2    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-2k      0      0   6144    5    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-02-1k      1     10   3072   10    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-512      2     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-256      1     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-128      6     21    384   21    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-64      0      0    256   32    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-02-32      0      0    160   25    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-02-16      2     32    128   32    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-02-8      0      0    112   36    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-02-192      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-02-96      0      0    224   36    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-8k      0      0  24576    1    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-4k      0      0  12288    2    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-2k      0      0   6144    5    8 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-1k      2     10   3072   10    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-01-512      0     21   1536   21    8 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-01-256      0      0    768   21    4 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-128      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-64     27     32    256   32    2 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-01-32      5     25    160   25    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-01-16      0      0    128   32    1 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-8      1     36    112   36    1 : tunables    0    0    0 : slabdata      1      1      0
kmalloc-part-01-192      0      0    384   21    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-part-01-96      0      0    224   36    2 : tunables    0    0    0 : slabdata      0      0      0
kmalloc-8k             4      8  24576    1    8 : tunables    0    0    0 : slabdata      8      8      0
kmalloc-4k            25     28  12288    2    8 : tunables    0    0    0 : slabdata     14     14      0
kmalloc-2k            94    100   6144    5    8 : tunables    0    0    0 : slabdata     20     20      0
kmalloc-1k           138    140   3072   10    8 : tunables    0    0    0 : slabdata     14     14      0
kmalloc-512          146    168   1536   21    8 : tunables    0    0    0 : slabdata      8      8      0
kmalloc-256           37     63    768   21    4 : tunables    0    0    0 : slabdata      3      3      0
kmalloc-128           91    105    384   21    2 : tunables    0    0    0 : slabdata      5      5      0
kmalloc-64           660    800    256   32    2 : tunables    0    0    0 : slabdata     25     25      0
kmalloc-32           933    950    160   25    1 : tunables    0    0    0 : slabdata     38     38      0
kmalloc-16          1806   1824    128   32    1 : tunables    0    0    0 : slabdata     57     57      0
kmalloc-8           1712   1764    112   36    1 : tunables    0    0    0 : slabdata     49     49      0
kmalloc-192          140    189    384   21    2 : tunables    0    0    0 : slabdata      9      9      0
kmalloc-96           122    180    224   36    2 : tunables    0    0    0 : slabdata      5      5      0
kmem_cache_node      465    480    256   32    2 : tunables    0    0    0 : slabdata     15     15      0
kmem_cache           464    483    384   21    2 : tunables    0    0    0 : slabdata     23     23      0

You can see that the caches >=08 (pointer-containing objects) and cache 0/NORMAL (bag of bytes / no type inferred) contain the majority of objects.