On Fri, Sep 18, 2020 at 10:53:36PM -0400, Arvind Sankar wrote:
> I think you can't do this in standard C. It's a GCC extension.
> 
>       A structure containing a flexible array member, or a union
>       containing such a structure (possibly recursively), may not be a
>       member of a structure or an element of an array. (However, these
>       uses are permitted by GCC as extensions.)

I actually have a patch in the works which wants to do this.

 struct pagevec {
-       unsigned char nr;
-       bool percpu_pvec_drained;
-       struct page *pages[PAGEVEC_SIZE];
+       union {
+               struct {
+                       unsigned char sz;
+                       unsigned char nr;
+                       bool percpu_pvec_drained;
+                       struct page *pages[];
+               };
+               void *__p[PAGEVEC_SIZE + 1];
+       };
 };

I don't think ANSI C permits this, but it's useful to be able to declare
a pagevec on the stack and be guaranteed to get enough memory to hold
a useful sized array of pointers (as well as be able to dynamically
allocate a larger pagevec for the cases which want such a thing).

We could certainly split pagevec into a variable length array version
and have a struct stack_pagevec which had the extra padding, but that
involves changing a lot more code.

Reply via email to