
This commit back-ports the auxiliary bus device driver from kernel version 5.11 to the StarlingX kernels, along with the bug fixes to this driver to date. This is necessary, because Intel's out-of-tree ice and iavf drivers, and Mellanox OFED v5.5's out-of-tree drivers rely on the functionality provided by the auxiliary bus driver. However, because the v5.10 kernel baseline used by StarlingX does not have this driver, the out-of-tree drivers would build and install their own version of the driver, named auxiliary.ko. This would cause kernel module symbol resolution errors at run-time when attempting to load ice and mlx5 kernel modules concurrently. Hence, this commit cherry-picks eight patches to add the auxiliary bus device driver to StarlingX's kernels, and adds a ninth patch to enable CONFIG_AUXILIARY_BUS by default. The latter is necessary, because StarlingX does not enable any in-tree kernel modules that 'select' CONFIG_AUXILIARY_BUS, which causes the kernel's build system to automatically disable this option. (None of the cherry-picked patches had merge conflicts.) It should be noted that all affected out-of-tree drivers' build systems are robust enough to detect that the kernel provides an auxiliary.ko driver, so the only out-of-tree driver modification involved changing the ice driver's spec file so that the installation of auxiliary.ko is removed. Testing: - An incremental monolithic build of StarlingX's master branch was successful. This build included currently-unreleased Mellanox OFED v5.5 work as well. - The built ISO image was successfully installed into and bootstrapped in a VM with low-latency profile in All-in-One simplex configuration, and the ability to insert ice, iavf and mlx5 kernel modules concurrently was confirmed. - The same test was repeated with a different VM, this time with the standard (i.e., non-low-latency) profile in All-in-One simplex mode. - The same ISO image was installed onto a 'standard' StarlingX system with two controller and two compute nodes with network adapters managed by Mellanox's OFED drivers. The low-latency profile was used. The Mellanox network adapters are used for inter-node communication in this server set-up. The bootstrap procedure was successful, and the RDMA/Infiniband over Ethernet functionalities of the Mellanox adapters were successfully tested using the Linux RDMA community's perftest package. - The same ISO image was installed onto an All-in-One simplex StarlingX system with an Intel E810 network adapter, managed by the ice driver, which is the system's management (OAM) interface. While the bootstrap of the system ultimately failed, this was due to an unrelated reason, and the network adapter's functionality was not found to be affected by this commit. iperf3 was used on virtual function interfaces (belonging to the same E810 network adapter) manually set up and attached to separate network namespaces, as an additional sanity test. Story: 2009878 Task: 44612 Change-Id: I8acfb0539757a35be3fb099ea2a6f95e05557e4f Signed-off-by: M. Vefa Bicakci <vefa.bicakci@windriver.com>
167 lines
7.6 KiB
Diff
167 lines
7.6 KiB
Diff
From 140f2cd50e9a10afcf10e76719d2810c6f8354a2 Mon Sep 17 00:00:00 2001
|
|
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
Date: Fri, 4 Dec 2020 12:49:28 +0100
|
|
Subject: [PATCH] driver core: auxiliary bus: minor coding style tweaks
|
|
|
|
For some reason, the original aux bus patch had some really long lines
|
|
in a few places, probably due to it being a very long-lived patch in
|
|
development by many different people. Fix that up so that the two files
|
|
all have the same length lines and function formatting styles.
|
|
|
|
Cc: Dan Williams <dan.j.williams@intel.com>
|
|
Cc: Dave Ertman <david.m.ertman@intel.com>
|
|
Cc: Fred Oh <fred.oh@linux.intel.com>
|
|
Cc: Kiran Patil <kiran.patil@intel.com>
|
|
Cc: Leon Romanovsky <leonro@nvidia.com>
|
|
Cc: Martin Habets <mhabets@solarflare.com>
|
|
Cc: Parav Pandit <parav@mellanox.com>
|
|
Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
|
Cc: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
|
|
Cc: Shiraz Saleem <shiraz.saleem@intel.com>
|
|
Link: https://lore.kernel.org/r/X8oiSFTpYHw1xE/o@kroah.com
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
(cherry picked from commit 0d2bf11a6b3e275a526b8d42d8d4a3a6067cf953)
|
|
Signed-off-by: M. Vefa Bicakci <vefa.bicakci@windriver.com>
|
|
---
|
|
drivers/base/auxiliary.c | 58 +++++++++++++++++++----------------
|
|
include/linux/auxiliary_bus.h | 6 ++--
|
|
2 files changed, 35 insertions(+), 29 deletions(-)
|
|
|
|
diff --git a/drivers/base/auxiliary.c b/drivers/base/auxiliary.c
|
|
index c44e85802b43..f303daadf843 100644
|
|
--- a/drivers/base/auxiliary.c
|
|
+++ b/drivers/base/auxiliary.c
|
|
@@ -50,8 +50,8 @@ static int auxiliary_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|
name = dev_name(dev);
|
|
p = strrchr(name, '.');
|
|
|
|
- return add_uevent_var(env, "MODALIAS=%s%.*s", AUXILIARY_MODULE_PREFIX, (int)(p - name),
|
|
- name);
|
|
+ return add_uevent_var(env, "MODALIAS=%s%.*s", AUXILIARY_MODULE_PREFIX,
|
|
+ (int)(p - name), name);
|
|
}
|
|
|
|
static const struct dev_pm_ops auxiliary_dev_pm_ops = {
|
|
@@ -113,16 +113,18 @@ static struct bus_type auxiliary_bus_type = {
|
|
* auxiliary_device_init - check auxiliary_device and initialize
|
|
* @auxdev: auxiliary device struct
|
|
*
|
|
- * This is the first step in the two-step process to register an auxiliary_device.
|
|
+ * This is the first step in the two-step process to register an
|
|
+ * auxiliary_device.
|
|
*
|
|
- * When this function returns an error code, then the device_initialize will *not* have
|
|
- * been performed, and the caller will be responsible to free any memory allocated for the
|
|
- * auxiliary_device in the error path directly.
|
|
+ * When this function returns an error code, then the device_initialize will
|
|
+ * *not* have been performed, and the caller will be responsible to free any
|
|
+ * memory allocated for the auxiliary_device in the error path directly.
|
|
*
|
|
- * It returns 0 on success. On success, the device_initialize has been performed. After this
|
|
- * point any error unwinding will need to include a call to auxiliary_device_uninit().
|
|
- * In this post-initialize error scenario, a call to the device's .release callback will be
|
|
- * triggered, and all memory clean-up is expected to be handled there.
|
|
+ * It returns 0 on success. On success, the device_initialize has been
|
|
+ * performed. After this point any error unwinding will need to include a call
|
|
+ * to auxiliary_device_uninit(). In this post-initialize error scenario, a call
|
|
+ * to the device's .release callback will be triggered, and all memory clean-up
|
|
+ * is expected to be handled there.
|
|
*/
|
|
int auxiliary_device_init(struct auxiliary_device *auxdev)
|
|
{
|
|
@@ -149,16 +151,19 @@ EXPORT_SYMBOL_GPL(auxiliary_device_init);
|
|
* @auxdev: auxiliary bus device to add to the bus
|
|
* @modname: name of the parent device's driver module
|
|
*
|
|
- * This is the second step in the two-step process to register an auxiliary_device.
|
|
+ * This is the second step in the two-step process to register an
|
|
+ * auxiliary_device.
|
|
*
|
|
- * This function must be called after a successful call to auxiliary_device_init(), which
|
|
- * will perform the device_initialize. This means that if this returns an error code, then a
|
|
- * call to auxiliary_device_uninit() must be performed so that the .release callback will
|
|
- * be triggered to free the memory associated with the auxiliary_device.
|
|
+ * This function must be called after a successful call to
|
|
+ * auxiliary_device_init(), which will perform the device_initialize. This
|
|
+ * means that if this returns an error code, then a call to
|
|
+ * auxiliary_device_uninit() must be performed so that the .release callback
|
|
+ * will be triggered to free the memory associated with the auxiliary_device.
|
|
*
|
|
- * The expectation is that users will call the "auxiliary_device_add" macro so that the caller's
|
|
- * KBUILD_MODNAME is automatically inserted for the modname parameter. Only if a user requires
|
|
- * a custom name would this version be called directly.
|
|
+ * The expectation is that users will call the "auxiliary_device_add" macro so
|
|
+ * that the caller's KBUILD_MODNAME is automatically inserted for the modname
|
|
+ * parameter. Only if a user requires a custom name would this version be
|
|
+ * called directly.
|
|
*/
|
|
int __auxiliary_device_add(struct auxiliary_device *auxdev, const char *modname)
|
|
{
|
|
@@ -166,13 +171,13 @@ int __auxiliary_device_add(struct auxiliary_device *auxdev, const char *modname)
|
|
int ret;
|
|
|
|
if (!modname) {
|
|
- pr_err("auxiliary device modname is NULL\n");
|
|
+ dev_err(dev, "auxiliary device modname is NULL\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
ret = dev_set_name(dev, "%s.%s.%d", modname, auxdev->name, auxdev->id);
|
|
if (ret) {
|
|
- pr_err("auxiliary device dev_set_name failed: %d\n", ret);
|
|
+ dev_err(dev, "auxiliary device dev_set_name failed: %d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
@@ -197,9 +202,9 @@ EXPORT_SYMBOL_GPL(__auxiliary_device_add);
|
|
* if it does. If the callback returns non-zero, this function will
|
|
* return to the caller and not iterate over any more devices.
|
|
*/
|
|
-struct auxiliary_device *
|
|
-auxiliary_find_device(struct device *start, const void *data,
|
|
- int (*match)(struct device *dev, const void *data))
|
|
+struct auxiliary_device *auxiliary_find_device(struct device *start,
|
|
+ const void *data,
|
|
+ int (*match)(struct device *dev, const void *data))
|
|
{
|
|
struct device *dev;
|
|
|
|
@@ -217,14 +222,15 @@ EXPORT_SYMBOL_GPL(auxiliary_find_device);
|
|
* @owner: owning module/driver
|
|
* @modname: KBUILD_MODNAME for parent driver
|
|
*/
|
|
-int __auxiliary_driver_register(struct auxiliary_driver *auxdrv, struct module *owner,
|
|
- const char *modname)
|
|
+int __auxiliary_driver_register(struct auxiliary_driver *auxdrv,
|
|
+ struct module *owner, const char *modname)
|
|
{
|
|
if (WARN_ON(!auxdrv->probe) || WARN_ON(!auxdrv->id_table))
|
|
return -EINVAL;
|
|
|
|
if (auxdrv->name)
|
|
- auxdrv->driver.name = kasprintf(GFP_KERNEL, "%s.%s", modname, auxdrv->name);
|
|
+ auxdrv->driver.name = kasprintf(GFP_KERNEL, "%s.%s", modname,
|
|
+ auxdrv->name);
|
|
else
|
|
auxdrv->driver.name = kasprintf(GFP_KERNEL, "%s", modname);
|
|
if (!auxdrv->driver.name)
|
|
diff --git a/include/linux/auxiliary_bus.h b/include/linux/auxiliary_bus.h
|
|
index d67b17606210..fc51d45f106b 100644
|
|
--- a/include/linux/auxiliary_bus.h
|
|
+++ b/include/linux/auxiliary_bus.h
|
|
@@ -70,8 +70,8 @@ void auxiliary_driver_unregister(struct auxiliary_driver *auxdrv);
|
|
#define module_auxiliary_driver(__auxiliary_driver) \
|
|
module_driver(__auxiliary_driver, auxiliary_driver_register, auxiliary_driver_unregister)
|
|
|
|
-struct auxiliary_device *
|
|
-auxiliary_find_device(struct device *start, const void *data,
|
|
- int (*match)(struct device *dev, const void *data));
|
|
+struct auxiliary_device *auxiliary_find_device(struct device *start,
|
|
+ const void *data,
|
|
+ int (*match)(struct device *dev, const void *data));
|
|
|
|
#endif /* _AUXILIARY_BUS_H_ */
|
|
--
|
|
2.29.2
|
|
|