On Mon, 2023-09-18 at 10:29 +0300, Mike Rapoport wrote: > + > +static void execmem_init_missing(struct execmem_params *p) > +{ > + struct execmem_range *default_range = &p- > >ranges[EXECMEM_DEFAULT]; > + > + for (int i = EXECMEM_DEFAULT + 1; i < EXECMEM_TYPE_MAX; i++) > { > + struct execmem_range *r = &p->ranges[i]; > + > + if (!r->start) { > + r->pgprot = default_range->pgprot; > + r->alignment = default_range->alignment; > + r->start = default_range->start; > + r->end = default_range->end; > + } > + } > +} > + It seems a bit weird to copy all of this. Is it trying to be faster or something? Couldn't it just check r->start in execmem_text/data_alloc() path and switch to EXECMEM_DEFAULT if needed then? The execmem_range_is_data() part that comes later could be added to the logic there too. So this seems like unnecessary complexity to me or I don't see the reason.