lkml.org 
[lkml]   [2021]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v2 01/50] wilc1000: don't hold txq_spinlock while initializing AC queue limits
Date
The wilc_tx_queue_status queue is relatively large and there is
absolutely no need to initialize it while holding a spinlock.

Signed-off-by: David Mosberger-Tang <davidm@egauge.net>
---
.../net/wireless/microchip/wilc1000/netdev.h | 1 -
.../net/wireless/microchip/wilc1000/wlan.c | 32 +++++++++++--------
2 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/microchip/wilc1000/netdev.h b/drivers/net/wireless/microchip/wilc1000/netdev.h
index a067274c20144..f4fc2cc392bd0 100644
--- a/drivers/net/wireless/microchip/wilc1000/netdev.h
+++ b/drivers/net/wireless/microchip/wilc1000/netdev.h
@@ -202,7 +202,6 @@ struct wilc_tx_queue_status {
u16 end_index;
u16 cnt[NQUEUES];
u16 sum;
- bool initialized;
};

struct wilc {
diff --git a/drivers/net/wireless/microchip/wilc1000/wlan.c b/drivers/net/wireless/microchip/wilc1000/wlan.c
index fb5633a05fd51..c4da14147dd04 100644
--- a/drivers/net/wireless/microchip/wilc1000/wlan.c
+++ b/drivers/net/wireless/microchip/wilc1000/wlan.c
@@ -12,6 +12,8 @@

#define WAKE_UP_TRIAL_RETRY 10000

+static const u8 factors[NQUEUES] = {1, 1, 1, 1};
+
static inline bool is_wilc1000(u32 id)
{
return (id & (~WILC_CHIP_REV_FIELD)) == WILC_1000_BASE_ID;
@@ -283,10 +285,23 @@ static int wilc_wlan_txq_add_cfg_pkt(struct wilc_vif *vif, u8 *buffer,
return 1;
}

+static void init_q_limits(struct wilc *wl)
+{
+ struct wilc_tx_queue_status *q = &wl->tx_q_limit;
+ int i;
+
+ for (i = 0; i < AC_BUFFER_SIZE; i++)
+ q->buffer[i] = i % NQUEUES;
+
+ for (i = 0; i < NQUEUES; i++) {
+ q->cnt[i] = AC_BUFFER_SIZE * factors[i] / NQUEUES;
+ q->sum += q->cnt[i];
+ }
+ q->end_index = AC_BUFFER_SIZE - 1;
+}
+
static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
{
- u8 factors[NQUEUES] = {1, 1, 1, 1};
- u16 i;
unsigned long flags;
struct wilc_tx_queue_status *q = &wl->tx_q_limit;
u8 end_index;
@@ -294,17 +309,6 @@ static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
bool ret = false;

spin_lock_irqsave(&wl->txq_spinlock, flags);
- if (!q->initialized) {
- for (i = 0; i < AC_BUFFER_SIZE; i++)
- q->buffer[i] = i % NQUEUES;
-
- for (i = 0; i < NQUEUES; i++) {
- q->cnt[i] = AC_BUFFER_SIZE * factors[i] / NQUEUES;
- q->sum += q->cnt[i];
- }
- q->end_index = AC_BUFFER_SIZE - 1;
- q->initialized = 1;
- }

end_index = q->end_index;
q->cnt[q->buffer[end_index]] -= factors[q->buffer[end_index]];
@@ -1484,6 +1488,8 @@ int wilc_wlan_init(struct net_device *dev)
goto fail;
}

+ init_q_limits(wilc);
+
if (!wilc->tx_buffer)
wilc->tx_buffer = kmalloc(WILC_TX_BUFF_SIZE, GFP_KERNEL);

--
2.25.1
\
 
 \ /
  Last update: 2021-12-23 02:14    [W:0.203 / U:0.144 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site