From: Omar Sandoval <osandov@osandov.com>
To: David Hildenbrand <david@redhat.com>
Cc: Israel Batista <linux@israelbatista.dev.br>,
akpm@linux-foundation.org, linux-mm@kvack.org,
linux-debuggers@vger.kernel.org,
Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Subject: Re: [PATCH] mm: Convert memory block states (MEM_*) macros to enum
Date: Mon, 27 Oct 2025 11:15:35 -0700 [thread overview]
Message-ID: <aP-2x314BKks2_N9@telecaster> (raw)
In-Reply-To: <811fd675-b231-45e4-b9d5-636fe63bde6b@redhat.com>
On Mon, Oct 27, 2025 at 10:29:15AM +0100, David Hildenbrand wrote:
> On 26.10.25 17:22, Israel Batista wrote:
> > The MEM_* constants indicating the state of the memory block are
> > currently defined as macros, meaning their definitions will be omitted
> > from the debuginfo on most kernel builds. This makes it harder for
> > debuggers to correctly map the block state at runtime, which can be
> > quite useful when analysing errors related to memory hot plugging and
> > unplugging with tools such as drgn and eBPF.
> >
> > Converting the constants to an enum will ensure the correct information
> > is emitted by the compiler and available for the debugger, without needing
> > to hard-code them into the debugger and track their changes.
> >
> > Signed-off-by: Israel Batista <linux@israelbatista.dev.br>
> > ---
> > include/linux/memory.h | 16 +++++++++-------
> > 1 file changed, 9 insertions(+), 7 deletions(-)
> >
> > diff --git a/include/linux/memory.h b/include/linux/memory.h
> > index ba1515160894..8feba3bfcd18 100644
> > --- a/include/linux/memory.h
> > +++ b/include/linux/memory.h
> > @@ -89,13 +89,15 @@ int arch_get_memory_phys_device(unsigned long start_pfn);
> > unsigned long memory_block_size_bytes(void);
> > int set_memory_block_size_order(unsigned int order);
> > -/* These states are exposed to userspace as text strings in sysfs */
> > -#define MEM_ONLINE (1<<0) /* exposed to userspace */
> > -#define MEM_GOING_OFFLINE (1<<1) /* exposed to userspace */
> > -#define MEM_OFFLINE (1<<2) /* exposed to userspace */
> > -#define MEM_GOING_ONLINE (1<<3)
> > -#define MEM_CANCEL_ONLINE (1<<4)
> > -#define MEM_CANCEL_OFFLINE (1<<5)
> > +enum mem_states {
> > + /* These states are exposed to userspace as text strings in sysfs */
> > + MEM_ONLINE = (1<<0), /* exposed to userspace */
> > + MEM_GOING_OFFLINE = (1<<1), /* exposed to userspace */
> > + MEM_OFFLINE = (1<<2), /* exposed to userspace */
> > + MEM_GOING_ONLINE = (1<<3),
> > + MEM_CANCEL_ONLINE = (1<<4),
> > + MEM_CANCEL_OFFLINE = (1<<5),
> > +};
> > struct memory_notify {
> > unsigned long start_pfn;
>
> CCing Lorenzo, we recently had a discussion about such conversions.
Yeah, I've been asking people to send out these conversions as we
encounter them in drgn, but ONLY when the absence of a value in the
kernel debugging symbols causes actual problems for drgn. I want it to
be clear that we're not spamming these just to cause churn. This is an
unfortunate corner case of debug info that leaves us with no other
option.
> The states are mutually exclusive (so no flags), so I wonder if we can just
> drop the (1<< X) setting completely.
FWIW, putting my C standard committee hat on, there is nothing wrong
with combining flags in an enum. C11 is silent on the matter, but C23
made this explicit. Quoting 6.7.3.3, paragraph 16: "After possible
lvalue conversion a value of the enumerated type behaves the same as the
value with the underlying type, in particular with all aspects of
promotion, conversion, and arithmetic." Lorenzo may have been thinking
of the stricter rules in C++.
Of course, semantically, it makes more sense to use distinct values in
cases like this where the values are not actually flags.
> IIRC, these values are not exposed to
> user space, only the corresponding names are, see state_show().
>
>
> Won't the compiler now complain that e.g., kcore_callback() does snot handle
> all cases? (no default statement)
Only if the controlling expression of the switch statement actually has
the enum type. All existing code uses unsigned long, so the compiler
doesn't care.
> --
> Cheers
>
> David / dhildenb
>
>
next prev parent reply other threads:[~2025-10-27 18:15 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-26 16:22 Israel Batista
2025-10-27 9:29 ` David Hildenbrand
2025-10-27 18:15 ` Omar Sandoval [this message]
2025-10-27 19:16 ` David Hildenbrand
2025-10-27 19:46 ` Lorenzo Stoakes
2025-10-27 23:34 ` Omar Sandoval
2025-10-28 16:06 ` David Hildenbrand
2025-10-28 16:33 ` Lorenzo Stoakes
2025-10-28 17:40 ` Omar Sandoval
2025-10-27 23:53 ` Israel Batista
2025-10-28 16:34 ` Lorenzo Stoakes
2025-10-28 19:06 ` Israel Batista
2025-10-28 19:13 ` Lorenzo Stoakes
2025-10-27 18:18 ` Omar Sandoval
2025-10-27 19:17 ` David Hildenbrand
2025-10-27 23:41 ` Israel Batista
2025-10-28 6:51 ` Omar Sandoval
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aP-2x314BKks2_N9@telecaster \
--to=osandov@osandov.com \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=linux-debuggers@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@israelbatista.dev.br \
--cc=lorenzo.stoakes@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox