On Fri, May 26, 2023 at 8:20 PM Kent Overstreet <kent.overstreet@xxxxxxxxx> wrote: > [...] > > > void jitalloc_update(void *dst, void *src, size_t len) > > > { > > > if (text_poke_available) { > > > text_poke(...); > > > } else { > > > unprotect(); > > > memcpy(); > > > protect(); > > > } > > > } > > > > I think this doesn't work for sub page allocation? > > Perhaps I elided too much - it does if you add a single lock. You can't > do that if it's not a common helper. Actually, sub page allocation is not the problem. The problem is with unprotect() and protect(), as they require global TLB flush. > > > At the end of all this, we will have modules running from huge pages, data > > and text. It will give significant performance benefit when some key driver > > cannot be compiled into the kernel. > > Yeah, I've seen the numbers for the perf impact of running as a module > due to the extra TLB overhead - but Mike's recent data was showing that > this doesn't matter nearly as much as data as it does for text. > > > > Also - module_memory_fill_type(), module_memory_invalidate_type() - I > > > know these are for BPF, but could you explain why we need them in the > > > external interface here? Could they perhaps be small helpers in the bpf > > > code that use something like jitalloc_update()? > > > > These are used by all users, not just BPF. 1/3 uses them in > > kernel/module/main.c. I didn't use them in 3/3 as it is arch code, but I can > > use them instead of text_poke_* (and that is probably better code style). > > As I am writing the email, I think I should use it in ftrace.c (2/3) to avoid > > the __weak function. > > Ok. Could we make it clearer why they're needed and what they're for? > > I know bpf fills in invalid instructions initially; I didn't read > through enough code to find the "why", and let's document that to save > other people the same effort. > > And do they really need to be callbacks in mod_alloc_params...? If we want to call them from common code, they will either be callback or some __weak functions. > > Do we need the other things in mod_alloc_params/vmalloc_params? > - your granularity field says it's for specifying PAGE/PMD size: we > definitely do not want that. We've had way too much code along the > lines of "implement hugepages for x", we need to stop doing that. > It's an internal mm/ detail. We don't need "granularity" yet. We will need them with the binpack allocator. > - vmalloc_params: we need gfp_t and pgprot_t, but those should be > normal arguments. start/end/vm_flags? They seem like historical > module baggage, can we get rid of them? All these fields are needed by some of the module_alloc()s for different archs. I am not an expert of all the archs, so I cannot say whether some of them are not needed. [...] > > I don't really think module code is very messy at the moment. If > > necessary, we can put module_alloc_type related code in a > > separate file. > > Hey, it's been organized since I last looked at it :) But I tihink this > belongs in mm/, not module code. I don't have a strong preference for this (at the moment). If we agree it belongs to mm/, we sure can move it. Thanks, Song