I propose to deprecate the kmem(9) interface and go back to the
malloc(9) interface.


1. The main difference is that the malloc(9) interface enables
   attribution of memory usage: how many bytes have been used for this
   purpose vs that purpose, partitioned by named malloc tags like
   M_MBUF or M_ACPI.  The conversion to the kmem(9) interface lost all
   this valuable diagnostic information.

   I've personally spent probably dozens of hours over the last year
   or two puzzling over `vmstat -m' output to guess which subsystem
   might be leaking memory based on allocation sizes and which
   kmem-NNNNN pool looks fishy.  This is extremely frustrating and a
   huge waste of time to recover information we used to gather and
   report systematically.

2. A secondary difference is reduced diffs from FreeBSD and OpenBSD
   drivers if we use malloc(9).

3. A small difference is that kmem(9) distinguishes legacy allocation
   from interrupt context, kmem_intr_alloc/free, from front ends that
   forbid that, kmem_alloc/free.

   I'm not sure this has provided much valuable diagnostic
   information, but it has provided a lot of frustrating crashes.  If
   we want the same frustrating crashes we could introduce an M_INTR
   flag which is mandatory when calling malloc from interrupt context.

Note: I am NOT proposing any substantive changes to the implementation
of the allocator -- I'm just proposing that we go back to the old
_interface_, using the new pool-cache-based _implementation_, and to
add lightweight per-CPU, per-tag usage counting to the malloc and free
paths.

Nor am I suggesting changing anything about uvm_km(9), pool_cache(9),
or anything else -- just changing kmem_alloc(N, KM_[NO]SLEEP) back to
malloc(N, T, M_NOWAIT/WAITOK) and kmem_free(P, N) back to free(P, T),
or possibly free(P, T, N) like OpenBSD does.

Thoughts?


I asked for rationale for the kmem(9) interface last year, and none of
the answers gave any compelling reason to have changed interfaces in
the first place or to finish the conversion now:

https://mail-index.netbsd.org/tech-kern/2022/10/29/msg028498.html

As far as I can tell, we just spent umpteen hundreds of hours on
engineering effort over the last decade to convert various drivers and
subsystems from malloc(9) to kmem(9), in exchange for the loss of
valuable diagnostic information about leaks, for increased cost to
porting drivers, and for crashes when old subsystems newly converted
to kmem(9) still allocate from interrupt context.

Reply via email to