From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Allen Webb <allenwebb@google.com>
Cc: "linux-modules@vger.kernel.org" <linux-modules@vger.kernel.org>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Luis Chamberlain <mcgrof@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>
Subject: Re: [PATCH v6 3/5] Implement modalias sysfs attribute for modules
Date: Mon, 5 Dec 2022 16:51:53 +0100 [thread overview]
Message-ID: <Y44TmanpxDjrwax9@kroah.com> (raw)
In-Reply-To: <20221202224744.1447448-3-allenwebb@google.com>
On Fri, Dec 02, 2022 at 04:47:42PM -0600, Allen Webb wrote:
> When the modalias attribute is read, invoke a subsystem-specific
> callback for each driver registered by the specific module.
>
> The intent of the new modalias attribute is to expose the
> match-id-based modaliases to userspace for builtin and loaded kernel
> modules.
>
> Signed-off-by: Allen Webb <allenwebb@google.com>
> ---
> include/linux/device/bus.h | 7 +++++
> kernel/module/sysfs.c | 57 +++++++++++++++++++++++++++++++++++++-
> 2 files changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h
> index 82a5583437099..cce0bedec63d9 100644
> --- a/include/linux/device/bus.h
> +++ b/include/linux/device/bus.h
> @@ -61,6 +61,10 @@ struct fwnode_handle;
> * this bus.
> * @dma_cleanup: Called to cleanup DMA configuration on a device on
> * this bus.
> + * @drv_to_modalias: Called to convert the matching IDs in a
> + * struct device_driver to their corresponding modaliases.
> + * Note that the struct device_driver is expected to belong
> + * to this bus.
If the driver was not part of this bus, that just wouldn't work at all
so I don't think you need to say this.
And what is the format here? New lines? structures?
> * @pm: Power management operations of this bus, callback the specific
> * device driver's pm-ops.
> * @iommu_ops: IOMMU specific operations for this bus, used to attach IOMMU
> @@ -107,6 +111,9 @@ struct bus_type {
> int (*dma_configure)(struct device *dev);
> void (*dma_cleanup)(struct device *dev);
>
> + ssize_t (*drv_to_modalias)(struct device_driver *drv, char *buf,
> + size_t count);
> +
> const struct dev_pm_ops *pm;
>
> const struct iommu_ops *iommu_ops;
> diff --git a/kernel/module/sysfs.c b/kernel/module/sysfs.c
> index 8dafec7455fbe..651c677c4ab96 100644
> --- a/kernel/module/sysfs.c
> +++ b/kernel/module/sysfs.c
> @@ -5,6 +5,8 @@
> * Copyright (C) 2008 Rusty Russell
> */
>
> +#include <linux/device/bus.h>
> +#include <linux/device/driver.h>
That feels wrong, modules shouldn't care about busses or drivers.
Why can't this all be in the driver core instead?
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/fs.h>
> @@ -240,11 +242,64 @@ static inline void add_notes_attrs(struct module *mod, const struct load_info *i
> static inline void remove_notes_attrs(struct module *mod) { }
> #endif /* CONFIG_KALLSYMS */
>
> +/* Track of the buffer and module identity in callbacks when walking the list of
> + * drivers for each bus.
> + */
> +struct modalias_bus_print_state {
> + struct module_kobject *mk;
> + char *buf;
> + size_t count;
> + ssize_t len;
> +};
> +
> +static int print_modalias_for_drv(struct device_driver *drv, void *p)
> +{
> + struct modalias_bus_print_state *s = p;
> + struct module_kobject *mk = s->mk;
> + ssize_t len;
> + /* Skip drivers that do not match this module. */
Always use checkpatch.pl on your changes before sening them out :(
> + if (mk->mod) {
> + if (mk->mod != drv->owner)
> + return 0;
> + } else if (!mk->kobj.name || !drv->mod_name ||
> + strcmp(mk->kobj.name, drv->mod_name))
> + return 0;
> +
> + if (drv->bus && drv->bus->drv_to_modalias) {
> + len = drv->bus->drv_to_modalias(drv, s->buf + s->len,
> + s->count - s->len);
> + if (len < 0)
> + return len;
> + s->len += len;
> + }
> + return 0;
> +}
> +
> +static int print_modalias_for_bus(struct bus_type *type, void *p)
> +{
> + return bus_for_each_drv(type, NULL, p, print_modalias_for_drv);
> +}
> +
> static ssize_t module_modalias_read(struct file *filp, struct kobject *kobj,
> struct bin_attribute *bin_attr,
> char *buf, loff_t pos, size_t count)
> {
> - return 0;
> + struct module_kobject *mk = container_of(kobj, struct module_kobject,
> + kobj);
> + struct modalias_bus_print_state state = {mk, buf, count, 0};
You allocate this on the stack?
> + int error = 0;
No need to initialize this.
> +
> + if (pos != 0)
> + return -EINVAL;
Why?
> +
> + error = bus_for_each(&state, print_modalias_for_bus);
So for every module attribute, we walk all busses in the system? Why
not the bus that this module has a driver for instead?
thanks,
greg k-h
next prev parent reply other threads:[~2022-12-05 15:52 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CAJzde07w6U83U_63eaF0-6zaq0cOkaymuLb3CBZ++JQi+Y9JdA@mail.gmail.com>
2022-12-01 21:16 ` [PATCH v5 0/1] Fix CONFIG_USB=y && CONFIG_MODULES not set Allen Webb
2022-12-02 12:45 ` Greg Kroah-Hartman
2022-12-02 12:46 ` Greg Kroah-Hartman
2022-12-01 21:16 ` [PATCH v5 1/1] modules: add modalias file to sysfs for modules Allen Webb
2022-12-02 12:49 ` Greg Kroah-Hartman
2022-12-02 22:45 ` [PATCH v6 0/5] Add sysfs match-id modalias attribute for USB modules Allen Webb
2022-12-02 22:47 ` [PATCH v6 1/5] module: Add empty modalias sysfs attribute Allen Webb
2022-12-02 22:47 ` [PATCH v6 2/5] drivers: Add bus_for_each for iterating over the subsystems Allen Webb
2022-12-03 18:07 ` Christophe Leroy
2022-12-05 15:45 ` Greg Kroah-Hartman
2022-12-02 22:47 ` [PATCH v6 3/5] Implement modalias sysfs attribute for modules Allen Webb
2022-12-03 18:12 ` Christophe Leroy
2022-12-05 15:51 ` Greg Kroah-Hartman [this message]
2022-12-02 22:47 ` [PATCH v6 4/5] docs: Add entry for /sys/module/*/modalias Allen Webb
2022-12-02 22:47 ` [PATCH v6 5/5] drivers: Implement module modaliases for USB Allen Webb
2022-12-03 18:25 ` Christophe Leroy
2022-12-04 8:27 ` Greg Kroah-Hartman
2022-12-05 15:53 ` Greg Kroah-Hartman
2022-12-03 18:05 ` [PATCH v6 1/5] module: Add empty modalias sysfs attribute Christophe Leroy
2022-12-05 15:42 ` Greg Kroah-Hartman
2022-12-11 10:44 ` [PATCH v5 1/1] modules: add modalias file to sysfs for modules kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y44TmanpxDjrwax9@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=allenwebb@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-modules@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mcgrof@kernel.org \
--cc=rafael@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.