On Wed, Aug 18, 2021 at 08:42:59PM -0400, Dennis Zhou wrote: > On Wed, Aug 18, 2021 at 02:40:20PM -0700, Kees Cook wrote: > > As already done in GrapheneOS, add the __alloc_size attribute for > > appropriate percpu allocator interfaces, to provide additional hinting > > for better bounds checking, assisting CONFIG_FORTIFY_SOURCE and other > > compiler optimizations. > > Can you elaborate a little bit for me how this works for percpu? In any > case that's not uniprocessor, any modification is done through address > accessors and not on the returned percpu pointer. Is the metadata kept > by gcc/clang able to transpire the percpu pointer accessors? That's an excellent point. :P I haven't tested it through the accessors, but I guess it's possible that this is only useful for UP, and even then, only where the access is very close to the "allocation", maybe like: char __percpu *test_buf; char *buf; test_var = __alloc_percpu(16, __alignof__(char)); buf = per_cpu_ptr(test_buf, get_cpu()); ... buf[20] = '!'; -Kees > > Thanks, > Dennis > > > > > Co-developed-by: Daniel Micay <danielmicay@xxxxxxxxx> > > Signed-off-by: Daniel Micay <danielmicay@xxxxxxxxx> > > Cc: Dennis Zhou <dennis@xxxxxxxxxx> > > Cc: Tejun Heo <tj@xxxxxxxxxx> > > Cc: Christoph Lameter <cl@xxxxxxxxx> > > Cc: linux-mm@xxxxxxxxx > > Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx> > > --- > > include/linux/percpu.h | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/include/linux/percpu.h b/include/linux/percpu.h > > index 5e76af742c80..119f41815b32 100644 > > --- a/include/linux/percpu.h > > +++ b/include/linux/percpu.h > > @@ -123,6 +123,7 @@ extern int __init pcpu_page_first_chunk(size_t reserved_size, > > pcpu_fc_populate_pte_fn_t populate_pte_fn); > > #endif > > > > +__alloc_size(1) > > extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); > > extern bool __is_kernel_percpu_address(unsigned long addr, unsigned long *can_addr); > > extern bool is_kernel_percpu_address(unsigned long addr); > > @@ -131,7 +132,9 @@ extern bool is_kernel_percpu_address(unsigned long addr); > > extern void __init setup_per_cpu_areas(void); > > #endif > > > > +__alloc_size(1) > > extern void __percpu *__alloc_percpu_gfp(size_t size, size_t align, gfp_t gfp); > > +__alloc_size(1) > > extern void __percpu *__alloc_percpu(size_t size, size_t align); > > extern void free_percpu(void __percpu *__pdata); > > extern phys_addr_t per_cpu_ptr_to_phys(void *addr); > > -- > > 2.30.2 > > -- Kees Cook