On Wed, Nov 23, 2022 at 06:01:47PM +0100, Greg Kroah-Hartman wrote:
On Wed, Nov 23, 2022 at 12:25:32PM -0400, Jason Gunthorpe wrote:
On Wed, Nov 23, 2022 at 04:37:59PM +0100, Greg Kroah-Hartman wrote:
static inline struct device *__kobj_to_dev(struct kobject *kobj) { return container_of(kobj, struct device, kobj); }
static inline const struct device *__kobj_to_dev_const(const struct kobject *kobj) { return container_of(kobj, const struct device, kobj); }
/*
- container_of() will happily take a const * and spit back a non-const * as it
- is just doing pointer math. But we want to be a bit more careful in the
- driver code, so manually force any const * of a kobject to also be a const *
- to a device.
*/ #define kobj_to_dev(kobj) \ _Generic((kobj), \ const struct kobject *: __kobj_to_dev_const, \ struct kobject *: __kobj_to_dev)(kobj)
Want me to do the same thing here as well?
It would be nice to have a shared macro code gen all of the above instead of copy and pasting it. Then maybe other cases beyond struct device could adopt const too..
I think I tried to create such a beast, but failed, so ended up open-coding it in a few places in the USB headers already. I can try it again, but the redirection gets tricky (defines creating defines...)
This seems OK:
#define generic_container_of(in_type, in, out_type, out_member) \ _Generic(in, \ const in_type *: ((const out_type *)container_of(in, out_type, out_member)), \ in_type *: ((out_type *)container_of(in, out_type, out_member)) \ )
#define kobj_to_dev(__kobj) \ generic_container_of(struct kobject, __kobj, struct device, kobj)
Jason