Messages in this thread | | | Date | Fri, 18 Feb 2022 18:14:55 +0100 | Subject | Re: [PATCH] slab: remove __alloc_size attribute from __kmalloc_track_caller | From | Vlastimil Babka <> |
| |
On 2/18/22 14:13, Greg Kroah-Hartman wrote: > Commit c37495d6254c ("slab: add __alloc_size attributes for better > bounds checking") added __alloc_size attributes to a bunch of kmalloc > function prototypes. Unfortunately the change to __kmalloc_track_caller > seems to cause clang to generate broken code and the first time this is > called when booting, the box will crash. > > While the compiler problems are being reworked and attempted to be > solved, let's just drop the attribute to solve the issue now. Once it > is resolved it can be added back.
Could we instead wrap it in some #ifdef that' only true for clang build? That would make the workaround more precise and self-documented. Even better if it can trigger using clang version range and once a fixed clang version is here, it can be updated to stay true for older clangs.
> Fixes: c37495d6254c ("slab: add __alloc_size attributes for better bounds checking") > Cc: stable <stable@vger.kernel.org> > Cc: Kees Cook <keescook@chromium.org> > Cc: Daniel Micay <danielmicay@gmail.com> > Cc: Nick Desaulniers <ndesaulniers@google.com> > Cc: Christoph Lameter <cl@linux.com> > Cc: Pekka Enberg <penberg@kernel.org> > Cc: David Rientjes <rientjes@google.com> > Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Vlastimil Babka <vbabka@suse.cz> > Cc: Nathan Chancellor <nathan@kernel.org> > Cc: linux-mm@kvack.org > Cc: linux-kernel@vger.kernel.org > Cc: llvm@lists.linux.dev > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > --- > include/linux/slab.h | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/include/linux/slab.h b/include/linux/slab.h > index 37bde99b74af..5b6193fd8bd9 100644 > --- a/include/linux/slab.h > +++ b/include/linux/slab.h > @@ -660,8 +660,7 @@ static inline __alloc_size(1, 2) void *kcalloc(size_t n, size_t size, gfp_t flag > * allocator where we care about the real place the memory allocation > * request comes from. > */ > -extern void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller) > - __alloc_size(1); > +extern void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller); > #define kmalloc_track_caller(size, flags) \ > __kmalloc_track_caller(size, flags, _RET_IP_) >
| |