Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/vfio-ccw: Make mdev_types not look like a fake flex array

The vfio-ccw driver and the vfio parent device provided by it (parent)
support just a single mdev_type, and this is not likely to change any
time soon. To match the mdev interfaces nicely initially the choice was
made that mdev_types (which gets passed into mdev_register_parent())
shall be an array of pointers to struct mdev_type with a single element,
and to make things worse it ended up being the last member.

Now the problem with that is that before C99 the usual way to get
something similar to a flexible array member was to use a trailing array
of size 0 or 1. This is what I called fake flex array. For a while now
the community is trying to get rid of fake flex arrays. And while
mdev_types was not a fake flex array but an array of size one, because
it can easily be and probably was mistaken for a fake flex array it got
converted into a real C99 flex array with a compile time known constant
size of one.

As per [1] it was established that "only fake flexible arrays should be
transformed into C99 flex-array members". Since IMHO the entire point of
flex arrays is being flexible about the array size at run time, a C99
flex array is a poor fit for mdev_types. But an array of a size one is
a poor fit as well for the reason stated above, let us try to get rid of
the flex array without introducing back the one sized array.

So, lets make mdev_types a pointer to struct mdev_type and pass in the
address of that pointer as the 4th formal parameter of
mdev_register_parent().

[1] https://lore.kernel.org/lkml/85863d7a-2d8b-4c1b-b76a-e2f40834a7a8@embeddedor.com/

Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Eric Farman <farman@linux.ibm.com>
Link: https://lore.kernel.org/r/20250217100614.3043620-3-pasic@linux.ibm.com
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>

authored by

Halil Pasic and committed by
Vasily Gorbik
fd0c8b33 92d03904

+4 -4
+3 -3
drivers/s390/cio/vfio_ccw_drv.c
··· 171 171 return -ENODEV; 172 172 } 173 173 174 - parent = kzalloc(struct_size(parent, mdev_types, 1), GFP_KERNEL); 174 + parent = kzalloc(sizeof(*parent), GFP_KERNEL); 175 175 if (!parent) 176 176 return -ENOMEM; 177 177 ··· 186 186 187 187 parent->mdev_type.sysfs_name = "io"; 188 188 parent->mdev_type.pretty_name = "I/O subchannel (Non-QDIO)"; 189 - parent->mdev_types[0] = &parent->mdev_type; 189 + parent->mdev_types = &parent->mdev_type; 190 190 ret = mdev_register_parent(&parent->parent, &sch->dev, 191 191 &vfio_ccw_mdev_driver, 192 - parent->mdev_types, 1); 192 + &parent->mdev_types, 1); 193 193 if (ret) 194 194 goto out_unreg; 195 195
+1 -1
drivers/s390/cio/vfio_ccw_private.h
··· 79 79 80 80 struct mdev_parent parent; 81 81 struct mdev_type mdev_type; 82 - struct mdev_type *mdev_types[]; 82 + struct mdev_type *mdev_types; 83 83 }; 84 84 85 85 /**