Thread (9 messages) 9 messages, 4 authors, 2023-01-30

Re: [PATCH v3] module: replace module_layout with module_memory

From: Song Liu <song@kernel.org>
Date: 2023-01-29 06:04:37
Also in: lkml

On Fri, Jan 27, 2023 at 11:43 PM Christophe Leroy
[off-list ref] wrote:
[...]
quoted
-struct module_layout {
-     /* The actual code + data. */
+enum mod_mem_type {
+     MOD_MEM_TYPE_TEXT,
+     MOD_MEM_TYPE_DATA,
+     MOD_MEM_TYPE_RODATA,
+     MOD_MEM_TYPE_RO_AFTER_INIT,
+     MOD_MEM_TYPE_INIT_TEXT,
+     MOD_MEM_TYPE_INIT_DATA,
+     MOD_MEM_TYPE_INIT_RODATA,
+
+     MOD_MEM_NUM_TYPES,
+     MOD_MEM_TYPE_INVALID = -1,
+};
Ok, so we agreed to keep it as a table with enums. Fair enough.

However, can we try to make it less ugly and more readable ?

I don't thing the enums needs to be prefixed by MOD_MEM_TYPE_
Would be enough with MOD_TEXT, MOD_DATA, MOD_RODATA, MOD_RO_AFTER_INIT,
MOD_INIT_TEXT, MOD_INIT_DATA, MOD_INIT_RODATA, MOD_INVALID.
[...]
quoted
-     /* Core layout: rbtree is accessed frequently, so keep together. */
-     struct module_layout core_layout __module_layout_align;
-     struct module_layout init_layout;
-#ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC
-     struct module_layout data_layout;
-#endif
+     /* rbtree is accessed frequently, so keep together. */
+     struct module_memory mod_mem[MOD_MEM_NUM_TYPES] __module_memory_align;
We are already in a struct called module, so the module_memory struct
could be called mem[MOD_MEM_NUM_TYPES]
quoted
      /* Arch-specific module values */
      struct mod_arch_specific arch;
@@ -573,23 +574,35 @@ bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr);
  bool is_module_percpu_address(unsigned long addr);
  bool is_module_text_address(unsigned long addr);

+static inline bool within_module_mem_type(unsigned long addr,
+                                       const struct module *mod,
+                                       enum mod_mem_type type)
+{
+     const struct module_memory *mod_mem;
+
+     if (WARN_ON_ONCE(type < MOD_MEM_TYPE_TEXT || type >= MOD_MEM_NUM_TYPES))
Here I would rather use 0 instead of  MOD_MEM_TYPE_TEXT because
MOD_MEM_TYPE_TEXT may change in the future.
quoted
+             return false;
+
+     mod_mem = &mod->mod_mem[type];
I can't see the added value of the mod_ prefix.

Would read better as

        mem = &mod->mem[type];

        return (unsigned long)mem->base <= addr && addr < (unsigned
long)mem->base + mem->size;

And could be even more readable as:

        unsigned long base, size;

        base = (unsigned long)mod->mod_mem[type].base;
        size = mod->mod_mem[type].size;

        return base <= addr && addr < base + size;
Yeah, the code does look better with shorter names.

If there is no objection from folks, I will send v4 with these
suggestions next week.

Thanks,
Song
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help