[PATCH 7/8] drivers: maintain const when converting from struct driver
Ahmad Fatoum
a.fatoum at pengutronix.de
Mon May 5 23:34:45 PDT 2025
In preparation for making the struct driver parameter to the match
callbacks const, introduce container_of_const and make use of it instead
of normal container in upcasting macros.
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
include/acpi.h | 5 +----
include/efi/efi-device.h | 5 +----
include/linux/container_of.h | 14 ++++++++++++++
include/linux/virtio.h | 10 ++--------
4 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/include/acpi.h b/include/acpi.h
index fc0da30610a6..fa94d972e3fe 100644
--- a/include/acpi.h
+++ b/include/acpi.h
@@ -125,10 +125,7 @@ struct acpi_driver {
extern struct bus_type acpi_bus;
-static inline struct acpi_driver *to_acpi_driver(struct driver *drv)
-{
- return container_of(drv, struct acpi_driver, driver);
-}
+#define to_acpi_driver(drv) container_of_const((drv), struct acpi_driver, driver)
#define device_acpi_driver(drv) \
register_efi_driver_macro(device, acpi, drv)
diff --git a/include/efi/efi-device.h b/include/efi/efi-device.h
index 5d2110356fd4..a8fc99a0e12b 100644
--- a/include/efi/efi-device.h
+++ b/include/efi/efi-device.h
@@ -33,10 +33,7 @@ static inline struct efi_device *to_efi_device(struct device *dev)
return container_of(dev, struct efi_device, dev);
}
-static inline struct efi_driver *to_efi_driver(struct driver *drv)
-{
- return container_of(drv, struct efi_driver, driver);
-}
+#define to_efi_driver(drv) container_of_const((drv), struct efi_driver, driver)
static inline int efi_driver_register(struct efi_driver *efidrv)
{
diff --git a/include/linux/container_of.h b/include/linux/container_of.h
index 2f4944b791b8..8669ef0154d9 100644
--- a/include/linux/container_of.h
+++ b/include/linux/container_of.h
@@ -21,6 +21,20 @@
"pointer type mismatch in container_of()"); \
((type *)(__mptr - offsetof(type, member))); })
+
+/**
+ * container_of_const - cast a member of a structure out to the containing
+ * structure and preserve the const-ness of the pointer
+ * @ptr: the pointer to the member
+ * @type: the type of the container struct this is embedded in.
+ * @member: the name of the member within the struct.
+ */
+#define container_of_const(ptr, type, member) \
+ _Generic(ptr, \
+ const typeof(*(ptr)) *: ((const type *)container_of(ptr, type, member)),\
+ default: ((type *)container_of(ptr, type, member)) \
+ )
+
/**
* container_of_safe - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index 3d4c88336055..eb4293003294 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -43,10 +43,7 @@ struct virtio_device {
u32 status_param;
};
-static inline struct virtio_device *dev_to_virtio(struct device *_dev)
-{
- return container_of(_dev, struct virtio_device, dev);
-}
+#define dev_to_virtio(_dev) container_of_const(_dev, struct virtio_device, dev)
void virtio_add_status(struct virtio_device *dev, unsigned int status);
int register_virtio_device(struct virtio_device *dev);
@@ -96,10 +93,7 @@ struct virtio_driver {
void (*config_changed)(struct virtio_device *dev);
};
-static inline struct virtio_driver *drv_to_virtio(struct driver *drv)
-{
- return container_of(drv, struct virtio_driver, driver);
-}
+#define drv_to_virtio(__drv) container_of_const(__drv, struct virtio_driver, driver)
int virtio_driver_register(struct virtio_driver *drv);
--
2.39.5
More information about the barebox
mailing list