From 857c1d4204235ba304fe4e089a9aa9dbf4ef047e Mon Sep 17 00:00:00 2001
From: Oliver Neukum <oneukum@suse.com>
Date: Mon, 14 Mar 2022 15:12:45 +0100
Subject: [PATCH] kABI: fix rndis_parameters locking
Patch-mainline: Never (kABI fixup)
References: git-fixes
We cannot add a lock to an embedded structure.
Use a global lock.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
drivers/usb/gadget/function/rndis.c | 16 ++++++++--------
drivers/usb/gadget/function/rndis.h | 1 -
2 files changed, 8 insertions(+), 9 deletions(-)
--- a/drivers/usb/gadget/function/rndis.c
+++ b/drivers/usb/gadget/function/rndis.c
@@ -55,6 +55,7 @@ MODULE_PARM_DESC (rndis_debug, "enable d
#define rndis_debug 0
#endif
+static DEFINE_SPINLOCK(suse_rndis_params_lock);
#ifdef CONFIG_USB_GADGET_DEBUG_FILES
#define NAME_TEMPLATE "driver/rndis-%03d"
@@ -922,7 +923,6 @@ struct rndis_params *rndis_register(void
params->resp_avail = resp_avail;
params->v = v;
INIT_LIST_HEAD(¶ms->resp_queue);
- spin_lock_init(¶ms->resp_lock);
pr_debug("%s: configNr = %d\n", __func__, i);
return params;
@@ -1016,14 +1016,14 @@ void rndis_free_response(struct rndis_pa
{
rndis_resp_t *r, *n;
- spin_lock(¶ms->resp_lock);
+ spin_lock(&suse_rndis_params_lock);
list_for_each_entry_safe(r, n, ¶ms->resp_queue, list) {
if (r->buf == buf) {
list_del(&r->list);
kfree(r);
}
}
- spin_unlock(¶ms->resp_lock);
+ spin_unlock(&suse_rndis_params_lock);
}
EXPORT_SYMBOL_GPL(rndis_free_response);
@@ -1033,17 +1033,17 @@ u8 *rndis_get_next_response(struct rndis
if (!length) return NULL;
- spin_lock(¶ms->resp_lock);
+ spin_lock(&suse_rndis_params_lock);
list_for_each_entry_safe(r, n, ¶ms->resp_queue, list) {
if (!r->send) {
r->send = 1;
*length = r->length;
- spin_unlock(¶ms->resp_lock);
+ spin_unlock(&suse_rndis_params_lock);
return r->buf;
}
}
- spin_unlock(¶ms->resp_lock);
+ spin_unlock(&suse_rndis_params_lock);
return NULL;
}
EXPORT_SYMBOL_GPL(rndis_get_next_response);
@@ -1060,9 +1060,9 @@ static rndis_resp_t *rndis_add_response(
r->length = length;
r->send = 0;
- spin_lock(¶ms->resp_lock);
+ spin_lock(&suse_rndis_params_lock);
list_add_tail(&r->list, ¶ms->resp_queue);
- spin_unlock(¶ms->resp_lock);
+ spin_unlock(&suse_rndis_params_lock);
return r;
}
--- a/drivers/usb/gadget/function/rndis.h
+++ b/drivers/usb/gadget/function/rndis.h
@@ -174,7 +174,6 @@ typedef struct rndis_params {
void (*resp_avail)(void *v);
void *v;
struct list_head resp_queue;
- spinlock_t resp_lock;
} rndis_params;
/* RNDIS Message parser and other useless functions */