This patch series splits and improves the previously submitted single patch by breaking it into four independent, logical changes following kernel submission etiquette.
Link: https://lore.kernel.org/r/d683962c-e8b7-4adc-9902-483976197637@riscstar.com Link: https://lore.kernel.org/r/5773d200-1d9d-4d6e-b01e-10d962ee9e8e@quicinc.com Link: https://lore.kernel.org/r/4f47df18-e98c-4f23-afde-3fa8e9fd0f86@quicinc.com Link: https://lore.kernel.org/r/202504010829.vIzweYue-lkp@intel.com Link: https://lore.kernel.org/r/202504011217.iRb2Bbls-lkp@intel.com
All changes are isolated, reviewed, and tested.
Patches included: 1. Replace deprecated strncpy() with strscpy() in firmware.c 2. Replace sprintf() with sysfs_emit() in sysfs show functions 3. Refactor gb_loopback_fn() into smaller helpers 4. Fulfill TODO by splitting get_topology() logic in audio_gb.c
v1 feedback from maintainers highlighted the need to split changes and avoid unrelated whitespace or formatting edits. These recommendations have been carefully addressed in this version.
Signed-off-by: Ganesh Kumar Pittala ganeshkpittala@gmail.com
Ganesh Kumar Pittala (4): staging: greybus: replace deprecated strncpy with strscpy in firmware.c staging: greybus: replace sprintf with sysfs_emit in sysfs show functions staging: greybus: refactor gb_loopback_fn into smaller helper functions staging: greybus: split gb_audio_gb_get_topology into helper functions
.../greybus/Documentation/firmware/firmware.c | 6 +- drivers/staging/greybus/arche-apb-ctrl.c | 11 +- drivers/staging/greybus/arche-platform.c | 11 +- drivers/staging/greybus/audio_gb.c | 36 +++- .../staging/greybus/audio_manager_module.c | 13 +- drivers/staging/greybus/gbphy.c | 3 +- drivers/staging/greybus/light.c | 5 +- drivers/staging/greybus/loopback.c | 167 ++++++++++-------- 8 files changed, 145 insertions(+), 107 deletions(-)
This patch replaces the use of the deprecated strncpy() function with strscpy() in drivers/staging/greybus/Documentation/firmware/firmware.c.
The strscpy() API is the recommended safer alternative that guarantees NUL-termination and avoids potential buffer overflows, making it more robust for handling string operations in kernel space.
This change improves code safety and aligns the driver with current kernel coding practices.
Signed-off-by: Ganesh Kumar Pittala ganeshkpittala@gmail.com --- drivers/staging/greybus/Documentation/firmware/firmware.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/greybus/Documentation/firmware/firmware.c b/drivers/staging/greybus/Documentation/firmware/firmware.c index 765d69faa9cc..f37904b914d2 100644 --- a/drivers/staging/greybus/Documentation/firmware/firmware.c +++ b/drivers/staging/greybus/Documentation/firmware/firmware.c @@ -63,7 +63,7 @@ static int update_intf_firmware(int fd) intf_load.major = 0; intf_load.minor = 0;
- strncpy((char *)&intf_load.firmware_tag, firmware_tag, + strscpy((char *)&intf_load.firmware_tag, firmware_tag, GB_FIRMWARE_U_TAG_MAX_SIZE);
ret = ioctl(fd, FW_MGMT_IOC_INTF_LOAD_AND_VALIDATE, &intf_load); @@ -101,7 +101,7 @@ static int update_backend_firmware(int fd) /* Get Backend Firmware Version */ printf("Getting Backend Firmware Version\n");
- strncpy((char *)&backend_fw_info.firmware_tag, firmware_tag, + strscpy((char *)&backend_fw_info.firmware_tag, firmware_tag, GB_FIRMWARE_U_TAG_MAX_SIZE);
retry_fw_version: @@ -129,7 +129,7 @@ static int update_backend_firmware(int fd) /* Try Backend Firmware Update over Unipro */ printf("Updating Backend Firmware\n");
- strncpy((char *)&backend_update.firmware_tag, firmware_tag, + strscpy((char *)&backend_update.firmware_tag, firmware_tag, GB_FIRMWARE_U_TAG_MAX_SIZE);
retry_fw_update:
On 4/13/2025 12:32 AM, Ganesh Kumar Pittala wrote:
This patch replaces the use of the deprecated strncpy() function with strscpy() in drivers/staging/greybus/Documentation/firmware/firmware.c.
Review: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#descr...
Especially: Describe your changes in imperative mood, e.g. “make xyzzy do frotz” instead of “[This patch] makes xyzzy do frotz” or “[I] changed xyzzy to do frotz”, as if you are giving orders to the codebase to change its behaviour.
This patch replaces deprecated uses of sprintf() with the safer sysfs_emit() helper in multiple sysfs show functions across the Greybus staging drivers.
The sysfs_emit() API is designed specifically for sysfs usage and ensures proper formatting, length checks, and termination, aligning with current kernel best practices.
Affected files: - audio_manager_module.c - loopback.c (sysfs-related only) - arche-platform.c - arche-apb-ctrl.c - light.c - gbphy.c
Signed-off-by: Ganesh Kumar Pittala ganeshkpittala@gmail.com --- drivers/staging/greybus/arche-apb-ctrl.c | 11 ++++++----- drivers/staging/greybus/arche-platform.c | 11 ++++++----- drivers/staging/greybus/audio_manager_module.c | 13 +++++++------ drivers/staging/greybus/gbphy.c | 3 ++- drivers/staging/greybus/light.c | 5 +++-- drivers/staging/greybus/loopback.c | 15 ++++++++------- 6 files changed, 32 insertions(+), 26 deletions(-)
diff --git a/drivers/staging/greybus/arche-apb-ctrl.c b/drivers/staging/greybus/arche-apb-ctrl.c index 90ab32638d3f..9862188e8367 100644 --- a/drivers/staging/greybus/arche-apb-ctrl.c +++ b/drivers/staging/greybus/arche-apb-ctrl.c @@ -17,6 +17,7 @@ #include <linux/pm.h> #include <linux/regulator/consumer.h> #include <linux/spinlock.h> +#include <linux/sysfs.h> #include "arche_platform.h"
static void apb_bootret_deassert(struct device *dev); @@ -299,16 +300,16 @@ static ssize_t state_show(struct device *dev,
switch (apb->state) { case ARCHE_PLATFORM_STATE_OFF: - return sprintf(buf, "off%s\n", + return sysfs_emit(buf, "off%s\n", apb->init_disabled ? ",disabled" : ""); case ARCHE_PLATFORM_STATE_ACTIVE: - return sprintf(buf, "active\n"); + return sysfs_emit(buf, "active\n"); case ARCHE_PLATFORM_STATE_STANDBY: - return sprintf(buf, "standby\n"); + return sysfs_emit(buf, "standby\n"); case ARCHE_PLATFORM_STATE_FW_FLASHING: - return sprintf(buf, "fw_flashing\n"); + return sysfs_emit(buf, "fw_flashing\n"); default: - return sprintf(buf, "unknown state\n"); + return sysfs_emit(buf, "unknown state\n"); } }
diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c index d48464390f58..2e706c1169d5 100644 --- a/drivers/staging/greybus/arche-platform.c +++ b/drivers/staging/greybus/arche-platform.c @@ -21,6 +21,7 @@ #include <linux/time.h> #include <linux/greybus.h> #include <linux/of.h> +#include <linux/sysfs.h> #include "arche_platform.h"
#if IS_ENABLED(CONFIG_USB_HSIC_USB3613) @@ -374,15 +375,15 @@ static ssize_t state_show(struct device *dev,
switch (arche_pdata->state) { case ARCHE_PLATFORM_STATE_OFF: - return sprintf(buf, "off\n"); + return sysfs_emit(buf, "off\n"); case ARCHE_PLATFORM_STATE_ACTIVE: - return sprintf(buf, "active\n"); + return sysfs_emit(buf, "active\n"); case ARCHE_PLATFORM_STATE_STANDBY: - return sprintf(buf, "standby\n"); + return sysfs_emit(buf, "standby\n"); case ARCHE_PLATFORM_STATE_FW_FLASHING: - return sprintf(buf, "fw_flashing\n"); + return sysfs_emit(buf, "fw_flashing\n"); default: - return sprintf(buf, "unknown state\n"); + return sysfs_emit(buf, "unknown state\n"); } }
diff --git a/drivers/staging/greybus/audio_manager_module.c b/drivers/staging/greybus/audio_manager_module.c index 4a4dfb42f50f..781144be4eec 100644 --- a/drivers/staging/greybus/audio_manager_module.c +++ b/drivers/staging/greybus/audio_manager_module.c @@ -6,6 +6,7 @@ */
#include <linux/slab.h> +#include <linux/sysfs.h>
#include "audio_manager.h" #include "audio_manager_private.h" @@ -76,7 +77,7 @@ static void gb_audio_module_release(struct kobject *kobj) static ssize_t gb_audio_module_name_show(struct gb_audio_manager_module *module, struct gb_audio_manager_module_attribute *attr, char *buf) { - return sprintf(buf, "%s", module->desc.name); + return sysfs_emit(buf, "%s\n", module->desc.name); }
static struct gb_audio_manager_module_attribute gb_audio_module_name_attribute = @@ -85,7 +86,7 @@ static struct gb_audio_manager_module_attribute gb_audio_module_name_attribute = static ssize_t gb_audio_module_vid_show(struct gb_audio_manager_module *module, struct gb_audio_manager_module_attribute *attr, char *buf) { - return sprintf(buf, "%d", module->desc.vid); + return sysfs_emit(buf, "%d\n", module->desc.vid); }
static struct gb_audio_manager_module_attribute gb_audio_module_vid_attribute = @@ -94,7 +95,7 @@ static struct gb_audio_manager_module_attribute gb_audio_module_vid_attribute = static ssize_t gb_audio_module_pid_show(struct gb_audio_manager_module *module, struct gb_audio_manager_module_attribute *attr, char *buf) { - return sprintf(buf, "%d", module->desc.pid); + return sysfs_emit(buf, "%d\n", module->desc.pid); }
static struct gb_audio_manager_module_attribute gb_audio_module_pid_attribute = @@ -104,7 +105,7 @@ static ssize_t gb_audio_module_intf_id_show(struct gb_audio_manager_module *modu struct gb_audio_manager_module_attribute *attr, char *buf) { - return sprintf(buf, "%d", module->desc.intf_id); + return sysfs_emit(buf, "%d\n", module->desc.intf_id); }
static struct gb_audio_manager_module_attribute @@ -115,7 +116,7 @@ static ssize_t gb_audio_module_ip_devices_show(struct gb_audio_manager_module *m struct gb_audio_manager_module_attribute *attr, char *buf) { - return sprintf(buf, "0x%X", module->desc.ip_devices); + return sysfs_emit(buf, "0x%X\n", module->desc.ip_devices); }
static struct gb_audio_manager_module_attribute @@ -126,7 +127,7 @@ static ssize_t gb_audio_module_op_devices_show(struct gb_audio_manager_module *m struct gb_audio_manager_module_attribute *attr, char *buf) { - return sprintf(buf, "0x%X", module->desc.op_devices); + return sysfs_emit(buf, "0x%X\n", module->desc.op_devices); }
static struct gb_audio_manager_module_attribute diff --git a/drivers/staging/greybus/gbphy.c b/drivers/staging/greybus/gbphy.c index 6adcad286633..72d72aa7cb0f 100644 --- a/drivers/staging/greybus/gbphy.c +++ b/drivers/staging/greybus/gbphy.c @@ -14,6 +14,7 @@ #include <linux/slab.h> #include <linux/device.h> #include <linux/greybus.h> +#include <linux/sysfs.h>
#include "gbphy.h"
@@ -31,7 +32,7 @@ static ssize_t protocol_id_show(struct device *dev, { struct gbphy_device *gbphy_dev = to_gbphy_dev(dev);
- return sprintf(buf, "0x%02x\n", gbphy_dev->cport_desc->protocol_id); + return sysfs_emit(buf, "0x%02x\n", gbphy_dev->cport_desc->protocol_id); } static DEVICE_ATTR_RO(protocol_id);
diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c index e509fdc715db..db0e98faec08 100644 --- a/drivers/staging/greybus/light.c +++ b/drivers/staging/greybus/light.c @@ -12,6 +12,7 @@ #include <linux/module.h> #include <linux/slab.h> #include <linux/greybus.h> +#include <linux/sysfs.h> #include <media/v4l2-flash-led-class.h>
#define NAMES_MAX 32 @@ -173,7 +174,7 @@ static ssize_t fade_##__dir##_show(struct device *dev, \ struct led_classdev *cdev = dev_get_drvdata(dev); \ struct gb_channel *channel = get_channel_from_cdev(cdev); \ \ - return sprintf(buf, "%u\n", channel->fade_##__dir); \ + return sysfs_emit(buf, "%u\n", channel->fade_##__dir); \ } \ \ static ssize_t fade_##__dir##_store(struct device *dev, \ @@ -220,7 +221,7 @@ static ssize_t color_show(struct device *dev, struct device_attribute *attr, struct led_classdev *cdev = dev_get_drvdata(dev); struct gb_channel *channel = get_channel_from_cdev(cdev);
- return sprintf(buf, "0x%08x\n", channel->color); + return sysfs_emit(buf, "0x%08x\n", channel->color); }
static ssize_t color_store(struct device *dev, struct device_attribute *attr, diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c index 1f19323b0e1a..c194afea941a 100644 --- a/drivers/staging/greybus/loopback.c +++ b/drivers/staging/greybus/loopback.c @@ -26,6 +26,7 @@ #include <linux/atomic.h> #include <linux/pm_runtime.h> #include <linux/greybus.h> +#include <linux/sysfs.h> #include <asm/div64.h>
#define NSEC_PER_DAY 86400000000000ULL @@ -125,7 +126,7 @@ static ssize_t field##_show(struct device *dev, \ char *buf) \ { \ struct gb_loopback *gb = dev_get_drvdata(dev); \ - return sprintf(buf, "%u\n", gb->field); \ + return sysfs_emit(buf, "%u\n", gb->field); \ } \ static DEVICE_ATTR_RO(field)
@@ -137,8 +138,8 @@ static ssize_t name##_##field##_show(struct device *dev, \ struct gb_loopback *gb = dev_get_drvdata(dev); \ /* Report 0 for min and max if no transfer succeeded */ \ if (!gb->requests_completed) \ - return sprintf(buf, "0\n"); \ - return sprintf(buf, "%" #type "\n", gb->name.field); \ + return sysfs_emit(buf, "0\n"); \ + return sysfs_emit(buf, "%" #type "\n", gb->name.field); \ } \ static DEVICE_ATTR_RO(name##_##field)
@@ -158,7 +159,7 @@ static ssize_t name##_avg_show(struct device *dev, \ rem = do_div(avg, count); \ rem *= 1000000; \ do_div(rem, count); \ - return sprintf(buf, "%llu.%06u\n", avg, (u32)rem); \ + return sysfs_emit(buf, "%llu.%06u\n", avg, (u32)rem); \ } \ static DEVICE_ATTR_RO(name##_avg)
@@ -173,7 +174,7 @@ static ssize_t field##_show(struct device *dev, \ char *buf) \ { \ struct gb_loopback *gb = dev_get_drvdata(dev); \ - return sprintf(buf, "%" #type "\n", gb->field); \ + return sysfs_emit(buf, "%" #type "\n", gb->field); \ } \ static ssize_t field##_store(struct device *dev, \ struct device_attribute *attr, \ @@ -199,7 +200,7 @@ static ssize_t field##_show(struct device *dev, \ char *buf) \ { \ struct gb_loopback *gb = dev_get_drvdata(dev); \ - return sprintf(buf, "%u\n", gb->field); \ + return sysfs_emit(buf, "%u\n", gb->field); \ } \ static DEVICE_ATTR_RO(field)
@@ -209,7 +210,7 @@ static ssize_t field##_show(struct device *dev, \ char *buf) \ { \ struct gb_loopback *gb = dev_get_drvdata(dev); \ - return sprintf(buf, "%" #type "\n", gb->field); \ + return sysfs_emit(buf, "%" #type "\n", gb->field); \ } \ static ssize_t field##_store(struct device *dev, \ struct device_attribute *attr, \
This patch refactors the gb_loopback_fn() function in loopback.c by splitting large blocks of logic into well-named static helpers to improve clarity, readability, and maintainability.
The control flow remains unchanged. No functional modifications are introduced.
This aligns with kernel coding style guidelines for long functions and helps future contributors understand and modify loopback behavior more easily.
Signed-off-by: Ganesh Kumar Pittala ganeshkpittala@gmail.com --- drivers/staging/greybus/loopback.c | 152 ++++++++++++++++------------- 1 file changed, 82 insertions(+), 70 deletions(-)
diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c index c194afea941a..1e3644ede1b6 100644 --- a/drivers/staging/greybus/loopback.c +++ b/drivers/staging/greybus/loopback.c @@ -832,105 +832,117 @@ static void gb_loopback_async_wait_to_send(struct gb_loopback *gb) kthread_should_stop()); }
-static int gb_loopback_fn(void *data) +static bool gb_loopback_should_stop(struct gb_loopback *gb, + struct gb_bundle *bundle) +{ + if (!gb->type) { + gb_pm_runtime_put_autosuspend(bundle); + wait_event_interruptible(gb->wq, + gb->type || kthread_should_stop()); + if (kthread_should_stop()) + return true; + gb_pm_runtime_get_sync(bundle); + } + return kthread_should_stop(); +} + +static void gb_loopback_handle_completion(struct gb_loopback *gb, + struct gb_bundle *bundle) +{ + gb_loopback_async_wait_all(gb); + + mutex_lock(&gb->mutex); + if (gb->iteration_count == gb->iteration_max) { + gb->type = 0; + gb->send_count = 0; + sysfs_notify(&gb->dev->kobj, NULL, "iteration_count"); + dev_dbg(&bundle->dev, "load test complete\n"); + } else { + dev_dbg(&bundle->dev, "continuing on with new test set\n"); + } + mutex_unlock(&gb->mutex); +} + +static void gb_loopback_dispatch_operation(struct gb_loopback *gb, int type, + u32 size) { int error = 0; - int us_wait = 0; - int type; - int ret; - u32 size;
+ if (gb->async) { + if (type == GB_LOOPBACK_TYPE_PING) + error = gb_loopback_async_ping(gb); + else if (type == GB_LOOPBACK_TYPE_TRANSFER) + error = gb_loopback_async_transfer(gb, size); + else if (type == GB_LOOPBACK_TYPE_SINK) + error = gb_loopback_async_sink(gb, size); + + if (error) { + gb->error++; + gb->iteration_count++; + } + } else { + if (type == GB_LOOPBACK_TYPE_PING) + error = gb_loopback_sync_ping(gb); + else if (type == GB_LOOPBACK_TYPE_TRANSFER) + error = gb_loopback_sync_transfer(gb, size); + else if (type == GB_LOOPBACK_TYPE_SINK) + error = gb_loopback_sync_sink(gb, size); + + if (error) + gb->error++; + gb->iteration_count++; + gb_loopback_calculate_stats(gb, !!error); + } +} + +static void gb_loopback_delay_if_needed(int us_wait) +{ + if (us_wait) { + if (us_wait < 20000) + usleep_range(us_wait, us_wait + 100); + else + msleep(us_wait / 1000); + } +} + +static int gb_loopback_fn(void *data) +{ + int us_wait = 0, type; + u32 size; struct gb_loopback *gb = data; struct gb_bundle *bundle = gb->connection->bundle;
- ret = gb_pm_runtime_get_sync(bundle); - if (ret) - return ret; + if (gb_pm_runtime_get_sync(bundle)) + return -EIO;
while (1) { - if (!gb->type) { - gb_pm_runtime_put_autosuspend(bundle); - wait_event_interruptible(gb->wq, gb->type || - kthread_should_stop()); - ret = gb_pm_runtime_get_sync(bundle); - if (ret) - return ret; - } - - if (kthread_should_stop()) + if (gb_loopback_should_stop(gb, bundle)) break;
- /* Limit the maximum number of in-flight async operations */ gb_loopback_async_wait_to_send(gb); if (kthread_should_stop()) break;
mutex_lock(&gb->mutex);
- /* Optionally terminate */ if (gb->send_count == gb->iteration_max) { mutex_unlock(&gb->mutex); - - /* Wait for synchronous and asynchronous completion */ - gb_loopback_async_wait_all(gb); - - /* Mark complete unless user-space has poked us */ - mutex_lock(&gb->mutex); - if (gb->iteration_count == gb->iteration_max) { - gb->type = 0; - gb->send_count = 0; - sysfs_notify(&gb->dev->kobj, NULL, - "iteration_count"); - dev_dbg(&bundle->dev, "load test complete\n"); - } else { - dev_dbg(&bundle->dev, - "continuing on with new test set\n"); - } - mutex_unlock(&gb->mutex); + gb_loopback_handle_completion(gb, bundle); continue; } + size = gb->size; us_wait = gb->us_wait; type = gb->type; if (ktime_to_ns(gb->ts) == 0) gb->ts = ktime_get();
- /* Else operations to perform */ - if (gb->async) { - if (type == GB_LOOPBACK_TYPE_PING) - error = gb_loopback_async_ping(gb); - else if (type == GB_LOOPBACK_TYPE_TRANSFER) - error = gb_loopback_async_transfer(gb, size); - else if (type == GB_LOOPBACK_TYPE_SINK) - error = gb_loopback_async_sink(gb, size); - - if (error) { - gb->error++; - gb->iteration_count++; - } - } else { - /* We are effectively single threaded here */ - if (type == GB_LOOPBACK_TYPE_PING) - error = gb_loopback_sync_ping(gb); - else if (type == GB_LOOPBACK_TYPE_TRANSFER) - error = gb_loopback_sync_transfer(gb, size); - else if (type == GB_LOOPBACK_TYPE_SINK) - error = gb_loopback_sync_sink(gb, size); - - if (error) - gb->error++; - gb->iteration_count++; - gb_loopback_calculate_stats(gb, !!error); - } + gb_loopback_dispatch_operation(gb, type, size); + gb->send_count++; mutex_unlock(&gb->mutex);
- if (us_wait) { - if (us_wait < 20000) - usleep_range(us_wait, us_wait + 100); - else - msleep(us_wait / 1000); - } + gb_loopback_delay_if_needed(us_wait); }
gb_pm_runtime_put_autosuspend(bundle);
On Sun, Apr 13, 2025 at 07:32:19AM +0000, Ganesh Kumar Pittala wrote:
This patch refactors the gb_loopback_fn() function in loopback.c by splitting large blocks of logic into well-named static helpers to improve clarity, readability, and maintainability.
The control flow remains unchanged. No functional modifications are introduced.
This aligns with kernel coding style guidelines for long functions and helps future contributors understand and modify loopback behavior more easily.
Signed-off-by: Ganesh Kumar Pittala ganeshkpittala@gmail.com
drivers/staging/greybus/loopback.c | 152 ++++++++++++++++------------- 1 file changed, 82 insertions(+), 70 deletions(-)
diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c index c194afea941a..1e3644ede1b6 100644 --- a/drivers/staging/greybus/loopback.c +++ b/drivers/staging/greybus/loopback.c @@ -832,105 +832,117 @@ static void gb_loopback_async_wait_to_send(struct gb_loopback *gb) kthread_should_stop()); } -static int gb_loopback_fn(void *data) +static bool gb_loopback_should_stop(struct gb_loopback *gb,
struct gb_bundle *bundle)
+{
- if (!gb->type) {
gb_pm_runtime_put_autosuspend(bundle);
wait_event_interruptible(gb->wq,
gb->type || kthread_should_stop());
if (kthread_should_stop())
return true;
gb_pm_runtime_get_sync(bundle);
- }
- return kthread_should_stop();
+}
+static void gb_loopback_handle_completion(struct gb_loopback *gb,
struct gb_bundle *bundle)
+{
- gb_loopback_async_wait_all(gb);
- mutex_lock(&gb->mutex);
- if (gb->iteration_count == gb->iteration_max) {
gb->type = 0;
gb->send_count = 0;
sysfs_notify(&gb->dev->kobj, NULL, "iteration_count");
dev_dbg(&bundle->dev, "load test complete\n");
- } else {
dev_dbg(&bundle->dev, "continuing on with new test set\n");
- }
- mutex_unlock(&gb->mutex);
+}
+static void gb_loopback_dispatch_operation(struct gb_loopback *gb, int type,
u32 size)
{ int error = 0;
- int us_wait = 0;
- int type;
- int ret;
- u32 size;
- if (gb->async) {
if (type == GB_LOOPBACK_TYPE_PING)
error = gb_loopback_async_ping(gb);
else if (type == GB_LOOPBACK_TYPE_TRANSFER)
error = gb_loopback_async_transfer(gb, size);
else if (type == GB_LOOPBACK_TYPE_SINK)
error = gb_loopback_async_sink(gb, size);
if (error) {
gb->error++;
gb->iteration_count++;
}
- } else {
if (type == GB_LOOPBACK_TYPE_PING)
error = gb_loopback_sync_ping(gb);
else if (type == GB_LOOPBACK_TYPE_TRANSFER)
error = gb_loopback_sync_transfer(gb, size);
else if (type == GB_LOOPBACK_TYPE_SINK)
error = gb_loopback_sync_sink(gb, size);
if (error)
gb->error++;
gb->iteration_count++;
gb_loopback_calculate_stats(gb, !!error);
- }
+}
+static void gb_loopback_delay_if_needed(int us_wait) +{
- if (us_wait) {
if (us_wait < 20000)
usleep_range(us_wait, us_wait + 100);
else
msleep(us_wait / 1000);
- }
+}
+static int gb_loopback_fn(void *data) +{
- int us_wait = 0, type;
- u32 size; struct gb_loopback *gb = data; struct gb_bundle *bundle = gb->connection->bundle;
- ret = gb_pm_runtime_get_sync(bundle);
- if (ret)
return ret;
- if (gb_pm_runtime_get_sync(bundle))
return -EIO;
while (1) {
if (!gb->type) {
gb_pm_runtime_put_autosuspend(bundle);
wait_event_interruptible(gb->wq, gb->type ||
kthread_should_stop());
ret = gb_pm_runtime_get_sync(bundle);
if (ret)
return ret;
}
if (kthread_should_stop())
if (gb_loopback_should_stop(gb, bundle)) break;
/* Limit the maximum number of in-flight async operations */
Why is it ok to remove this comment?
And why was this function broken up? Is it confusing such that it now needs subfunctions that are only called once? Now you have to jump around to follow the logic of this big while(1) loop, making it harder to follow.
Remember, we write code for people first, compilers second, and I think you just made it harder for people to manage this code over time as it now takes extra work to determine how it all fits together.
thanks,
greg k-h
This patch addresses the TODO in gb_audio_gb_get_topology() by splitting its logic into two smaller internal helper functions: - gb_audio_get_topology_size() - gb_audio_read_topology()
This improves modularity and readability while preserving the original behavior and interface.
Signed-off-by: Ganesh Kumar Pittala ganeshkpittala@gmail.com --- drivers/staging/greybus/audio_gb.c | 36 +++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/drivers/staging/greybus/audio_gb.c b/drivers/staging/greybus/audio_gb.c index 9d8994fdb41a..92cfd1a6fc10 100644 --- a/drivers/staging/greybus/audio_gb.c +++ b/drivers/staging/greybus/audio_gb.c @@ -8,21 +8,28 @@ #include <linux/greybus.h> #include "audio_codec.h"
-/* TODO: Split into separate calls */ -int gb_audio_gb_get_topology(struct gb_connection *connection, - struct gb_audio_topology **topology) +static int gb_audio_gb_get_topology_size(struct gb_connection *connection, + u16 *size) { - struct gb_audio_get_topology_size_response size_resp; - struct gb_audio_topology *topo; - u16 size; + struct gb_audio_get_topology_size_response resp; int ret;
ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY_SIZE, - NULL, 0, &size_resp, sizeof(size_resp)); + NULL, 0, &resp, sizeof(resp)); if (ret) return ret;
- size = le16_to_cpu(size_resp.size); + *size = le16_to_cpu(resp.size); + return 0; +} + +static int gb_audio_gb_read_topology(struct gb_connection *connection, + struct gb_audio_topology **topology, + u16 size) +{ + struct gb_audio_topology *topo; + int ret; + if (size < sizeof(*topo)) return -ENODATA;
@@ -41,6 +48,19 @@ int gb_audio_gb_get_topology(struct gb_connection *connection,
return 0; } + +int gb_audio_gb_get_topology(struct gb_connection *connection, + struct gb_audio_topology **topology) +{ + u16 size; + int ret; + + ret = gb_audio_gb_get_topology_size(connection, &size); + if (ret) + return ret; + + return gb_audio_gb_read_topology(connection, topology, size); +} EXPORT_SYMBOL_GPL(gb_audio_gb_get_topology);
int gb_audio_gb_get_control(struct gb_connection *connection,
On Sun, Apr 13, 2025 at 07:32:16AM +0000, Ganesh Kumar Pittala wrote:
This patch series splits and improves the previously submitted single patch by breaking it into four independent, logical changes following kernel submission etiquette.
Link: https://lore.kernel.org/r/d683962c-e8b7-4adc-9902-483976197637@riscstar.com Link: https://lore.kernel.org/r/5773d200-1d9d-4d6e-b01e-10d962ee9e8e@quicinc.com Link: https://lore.kernel.org/r/4f47df18-e98c-4f23-afde-3fa8e9fd0f86@quicinc.com Link: https://lore.kernel.org/r/202504010829.vIzweYue-lkp@intel.com Link: https://lore.kernel.org/r/202504011217.iRb2Bbls-lkp@intel.com
All changes are isolated, reviewed, and tested.
How exactly did you test these? What hardware was it run on?
thanks,
greg k-h