On Wed, Feb 01, 2023 at 10:44:22AM -0800, Song Liu wrote: > static ssize_t show_datasize(struct module_attribute *mattr, > struct module_kobject *mk, char *buffer) > { > - return sprintf(buffer, "%u\n", mk->mod->data_layout.size); > + unsigned int size = 0; > + > + for_class_mod_mem_type(type, core) { > + if (type == MOD_TEXT) > + continue; isn't this the same as: for_class_mod_mem_type(type, core_data) ? > + size += mk->mod->mem[type].size; > + } > + return sprintf(buffer, "%u\n", size); > } > - lockdep_free_key_range(mod->data_layout.base, mod->data_layout.size); > + for_class_mod_mem_type(type, core) { > + lockdep_free_key_range(mod->mem[type].base, > + mod->mem[type].size); > + } Why the core_data to core change? Specifically the difference seems to be you now include text. Now, we shouldn't be having lockdep keys in text, so it's harmless, still a bit weird. Anyway, looks real good to me otherwise. Thanks!