2020-05-01 20:52:23

by Mathieu Poirier

[permalink] [raw]
Subject: [PATCH v3 0/2] rpmsg: core: Add support for name extension

This patchset adds the capability to supplement the base definition
published by an rpmsg_driver with a postfix description so that it
is easy to differentiate entities that use the same name service.

The first patch is the same as in v2, the second patch adds a function
helper to retrieve an rpmsg device name postfix so that clients don't
end up writing their own implementation.

Applies cleanly on rproc-next (2fb75ceaf71a).

Thanks,
Mathieu

[1]. https://patchwork.kernel.org/patch/11429713/

Mathieu Poirier (2):
rpmsg: core: Add wildcard match for name service
rpmsg: core: Add support to retrieve name extension

drivers/rpmsg/rpmsg_core.c | 112 ++++++++++++++++++++++++++++++++++++-
include/linux/rpmsg.h | 12 ++++
2 files changed, 123 insertions(+), 1 deletion(-)

--
2.20.1


2020-05-01 20:53:51

by Mathieu Poirier

[permalink] [raw]
Subject: [PATCH v3 2/2] rpmsg: core: Add support to retrieve name extension

After adding support for rpmsg device name extension, this patch
provides a function that returns the extension portion of an rpmsg
device name. That way users of the name extension functionality don't
have to write the same boiler plate code to extract the information.

Suggested-by: Suman Anna <[email protected]>
Signed-off-by: Mathieu Poirier <[email protected]>
---
drivers/rpmsg/rpmsg_core.c | 92 ++++++++++++++++++++++++++++++++++++++
include/linux/rpmsg.h | 12 +++++
2 files changed, 104 insertions(+)

diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c
index bfd25978fa35..86b6d26907ad 100644
--- a/drivers/rpmsg/rpmsg_core.c
+++ b/drivers/rpmsg/rpmsg_core.c
@@ -439,6 +439,98 @@ static int rpmsg_dev_match(struct device *dev, struct device_driver *drv)
return of_driver_match_device(dev, drv);
}

+/**
+ * rpmsg_device_get_name_extension() - get the name extension of a rpmsg device
+ * @rpdev: the rpmsg device to work with
+ * @skip: how many characters in the extension should be skipped over
+ *
+ * With function rpmsg_id_match() allowing for extension of the base driver name
+ * in order to differentiate services, this function returns the extension part
+ * of an rpmsg device name. As such and with the following rpmsg driver device
+ * id table and rpmsg device names:
+ *
+ * static struct rpmsg_device_id rpmsg_driver_sample_id_table[] = {
+ * { .name = "rpmsg-client-sample" },
+ * { },
+ * }
+ *
+ * rpdev1->id.name == "rpmsg-client-sample";
+ * rpdev2->id.name == "rpmsg-client-sample_instance0";
+ *
+ * Calling rpmsg_device_get_name_extension() will yields the following:
+ *
+ * rpmsg_device_get_name_extension(rpdev1, 0) == NULL;
+ * rpmsg_device_get_name_extension(rpdev2, 0) == "_instance0";
+ * rpmsg_device_get_name_extension(rpdev2, 1) == "instance0";
+ *
+ *
+ * Note: The name extension should be free'd using kfree_const().
+ *
+ * Return: the name extension if found, NULL if not found and an error
+ * code otherwise.
+ */
+const char *rpmsg_device_get_name_extension(struct rpmsg_device *rpdev,
+ unsigned int skip)
+{
+ const char *drv_name, *dev_name, *extension;
+ const struct rpmsg_device_id *ids;
+ struct device *dev = &rpdev->dev;
+ struct rpmsg_driver *rpdrv;
+ bool match = false;
+ unsigned int i;
+
+ if (!dev->driver)
+ return ERR_PTR(-EINVAL);
+
+ rpdrv = to_rpmsg_driver(dev->driver);
+
+ /*
+ * No point in going further if the device and the driver don't
+ * have a name or a table to work with.
+ */
+ if (!rpdev->id.name[0] || !rpdrv->id_table)
+ return ERR_PTR(-EINVAL);
+
+ ids = rpdrv->id_table;
+ dev_name = rpdev->id.name;
+
+ /*
+ * See if any name in the driver's table match the beginning
+ * of the rpmsg device's name.
+ */
+ for (i = 0; ids[i].name[0]; i++) {
+ drv_name = ids[i].name;
+ if (strncmp(drv_name,
+ dev_name, strlen(drv_name)) == 0) {
+ match = true;
+ break;
+ }
+ }
+
+ if (!match)
+ return NULL;
+
+ /* No name extension to return if device and driver are the same */
+ if (strlen(dev_name) == strlen(drv_name))
+ return NULL;
+
+ /*
+ * Make sure we were not requested to skip past the end
+ * of the device name.
+ */
+ if (strlen(drv_name) + skip >= strlen(dev_name))
+ return ERR_PTR(-EINVAL);
+
+ /*
+ * Move past the base name published by the driver and
+ * skip any extra characters if needed.
+ */
+ extension = dev_name + strlen(drv_name) + skip;
+
+ return kstrdup_const(extension, GFP_KERNEL);
+}
+EXPORT_SYMBOL(rpmsg_device_get_name_extension);
+
static int rpmsg_uevent(struct device *dev, struct kobj_uevent_env *env)
{
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h
index 9fe156d1c018..5770c3fb3924 100644
--- a/include/linux/rpmsg.h
+++ b/include/linux/rpmsg.h
@@ -135,6 +135,9 @@ int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
__poll_t rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
poll_table *wait);

+const char *rpmsg_device_get_name_extension(struct rpmsg_device *dev,
+ unsigned int skip);
+
#else

static inline int register_rpmsg_device(struct rpmsg_device *dev)
@@ -242,6 +245,15 @@ static inline __poll_t rpmsg_poll(struct rpmsg_endpoint *ept,
return 0;
}

+const char *rpmsg_device_get_name_extension(struct rpmsg_device *dev,
+ unsigned int skip)
+{
+ /* This shouldn't be possible */
+ WARN_ON(1);
+
+ return NULL;
+}
+
#endif /* IS_ENABLED(CONFIG_RPMSG) */

/* use a macro to avoid include chaining to get THIS_MODULE */
--
2.20.1

2020-05-02 16:22:05

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] rpmsg: core: Add support to retrieve name extension

Hi Mathieu,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on linux/master v5.7-rc3 next-20200501]
[cannot apply to rpmsg/for-next]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Mathieu-Poirier/rpmsg-core-Add-support-for-name-extension/20200502-050248
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 052c467cb58748e302a95546925928e637025acc
config: x86_64-fedora-25 (attached as .config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <[email protected]>

All errors (new ones prefixed by >>):

ld: drivers/net/wireless/ath/wcn36xx/smd.o: in function `rpmsg_device_get_name_extension':
>> include/linux/rpmsg.h:250: multiple definition of `rpmsg_device_get_name_extension'; drivers/net/wireless/ath/wcn36xx/main.o:include/linux/rpmsg.h:250: first defined here

vim +250 include/linux/rpmsg.h

247
248 const char *rpmsg_device_get_name_extension(struct rpmsg_device *dev,
249 unsigned int skip)
> 250 {
251 /* This shouldn't be possible */
252 WARN_ON(1);
253
254 return NULL;
255 }
256

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (1.66 kB)
.config.gz (51.40 kB)
Download all attachments