Thanks a lot for the tips.

I updated the 2 testing cases per your suggestion, they work well.

I will send the 3rd version of the patch soon.

Qing

> On Sep 10, 2024, at 11:42, Martin Uecker <uec...@tugraz.at> wrote:
> 
> Am Dienstag, dem 10.09.2024 um 13:51 +0000 schrieb Qing Zhao:
>>   #define alloc(P, FAM, COUNT) ({ \
>>     typeof(P) __p; \
>>     size_t __size = sizeof(*P) + sizeof(*P->FAM) * COUNT; \
>>     __p = kmalloc(__size, GFP); \
>>     typeof(_Generic(__builtin_counted_by_ref(__p->FAM), \
>>     void *: (size_t *)NULL, \
>>     default: __builtin_counted_by_ref(__p->FAM))) \
>>       ret = __builtin_counted_by_ref(__p->FAM); \
>>     if (ret) \
>>       *ret = COUNT; \
>>     P = __p; \
>>   })
> 
> Maybe not too relevant for your patch, but I would use
> something like this
> 
> #define alloc(P, FAM, COUNT) ({ \
>  __auto_type __p = &(P); \
>  __auto_type __c = (COUNT); \
>  size_t __size = sizeof(*(*__p)) + sizeof(*(*__p)->FAM) * __c; \
>  if ((*__p = malloc(__size))) { \ 
>    __auto_type ret = __builtin_counted_by_ref((*__p)->FAM); \
>     *_Generic(ret, void *: &(size_t){0}, default: ret) = __c; \    
>  } \
> })
> 
> to have brackets around the macro arguments to avoid accidents,
> to reduce compile time due to multiple evaluation of the macro
> arguments, and to avoid warnings for the null pointer dereference
> on clang.
> 
> (Actually, I would also cast the sizes to a signed type
> immediately to catch overflows with UBSan, but I kept
> size_t here.)
> 
> Martin
> 
> 

Reply via email to