kernel: ltq-vectoring: Avoid flush_scheduled_work() usage

This fixes some compile warnings for linux 6.6.

Flushing system-wide workqueues is dangerous and will be forbidden.
Replace system_wq with local vectoring_wq.

Signed-off-by: Martin Schiller <ms@dev.tdt.de>
This commit is contained in:
Martin Schiller 2024-05-14 12:52:07 +02:00 committed by Hauke Mehrtens
parent 6ec7711d00
commit c7648273d0
2 changed files with 18 additions and 12 deletions

View File

@ -17,7 +17,7 @@
/* /*
* #################################### * ####################################
@@ -118,9 +121,11 @@ struct erb_head { @@ -118,9 +121,13 @@ struct erb_head {
static struct notifier_block g_netdev_event_handler_nb = {0}; static struct notifier_block g_netdev_event_handler_nb = {0};
static struct net_device *g_ptm_net_dev = NULL; static struct net_device *g_ptm_net_dev = NULL;
@ -25,12 +25,14 @@
+static uint32_t vector_prio = TC_PRIO_CONTROL; +static uint32_t vector_prio = TC_PRIO_CONTROL;
static int g_dbg_enable = 0; static int g_dbg_enable = 0;
+static struct workqueue_struct *vectoring_wq;
+
+DECLARE_WORK(xmit_work, xmit_work_handler); +DECLARE_WORK(xmit_work, xmit_work_handler);
+struct sk_buff_head xmit_queue; +struct sk_buff_head xmit_queue;
/* /*
@@ -129,9 +134,16 @@ static int g_dbg_enable = 0; @@ -129,9 +136,16 @@ static int g_dbg_enable = 0;
* #################################### * ####################################
*/ */
@ -48,7 +50,7 @@
struct sk_buff *skb_list = NULL; struct sk_buff *skb_list = NULL;
struct sk_buff *skb; struct sk_buff *skb;
struct erb_head *erb; struct erb_head *erb;
@@ -179,7 +191,6 @@ static int mei_dsm_cb_func(unsigned int @@ -179,7 +193,6 @@ static int mei_dsm_cb_func(unsigned int
} }
} }
@ -56,7 +58,7 @@
sent_size = 0; sent_size = 0;
segment_code = 0; segment_code = 0;
while ( (skb = skb_list) != NULL ) { while ( (skb = skb_list) != NULL ) {
@@ -197,24 +208,23 @@ static int mei_dsm_cb_func(unsigned int @@ -197,24 +210,23 @@ static int mei_dsm_cb_func(unsigned int
segment_code |= 0xC0; segment_code |= 0xC0;
((struct erb_head *)skb->data)->segment_code = segment_code; ((struct erb_head *)skb->data)->segment_code = segment_code;
@ -75,7 +77,7 @@
- if ( rc == 0 ) - if ( rc == 0 )
- rc = ret; - rc = ret;
+ skb_queue_tail(&xmit_queue, skb); + skb_queue_tail(&xmit_queue, skb);
+ schedule_work(&xmit_work); + queue_work(vectoring_wq, &xmit_work);
segment_code++; segment_code++;
} }
@ -88,7 +90,7 @@
} }
static void ltq_vectoring_priority(uint32_t priority) static void ltq_vectoring_priority(uint32_t priority)
{ {
@@ -242,7 +252,7 @@ static int netdev_event_handler(struct n @@ -242,7 +254,7 @@ static int netdev_event_handler(struct n
return NOTIFY_DONE; return NOTIFY_DONE;
netif = netdev_notifier_info_to_dev(netdev); netif = netdev_notifier_info_to_dev(netdev);
@ -97,10 +99,12 @@
return NOTIFY_DONE; return NOTIFY_DONE;
g_ptm_net_dev = event == NETDEV_REGISTER ? netif : NULL; g_ptm_net_dev = event == NETDEV_REGISTER ? netif : NULL;
@@ -438,8 +448,10 @@ static int __init vectoring_init(void) @@ -438,8 +450,12 @@ static int __init vectoring_init(void)
0, 0,
&g_proc_file_vectoring_dbg_seq_fops); &g_proc_file_vectoring_dbg_seq_fops);
+ vectoring_wq = alloc_workqueue("vectoring", 0, 0);
+
+ skb_queue_head_init(&xmit_queue); + skb_queue_head_init(&xmit_queue);
+ +
register_netdev_event_handler(); register_netdev_event_handler();
@ -109,11 +113,13 @@
if ( g_ptm_net_dev != NULL ) if ( g_ptm_net_dev != NULL )
dev_put(g_ptm_net_dev); dev_put(g_ptm_net_dev);
@@ -459,6 +471,8 @@ static void __exit vectoring_exit(void) @@ -459,6 +475,10 @@ static void __exit vectoring_exit(void)
unregister_netdev_event_handler(); unregister_netdev_event_handler();
+ flush_scheduled_work(); + flush_workqueue(vectoring_wq);
+
+ destroy_workqueue(vectoring_wq);
+ +
remove_proc_entry("driver/vectoring", NULL); remove_proc_entry("driver/vectoring", NULL);
} }

View File

@ -1,6 +1,6 @@
--- a/src/vectoring/ifxmips_vectoring.c --- a/src/vectoring/ifxmips_vectoring.c
+++ b/src/vectoring/ifxmips_vectoring.c +++ b/src/vectoring/ifxmips_vectoring.c
@@ -298,7 +298,7 @@ static int proc_write_dbg(struct file *f @@ -300,7 +300,7 @@ static int proc_write_dbg(struct file *f
DBG_ENABLE_MASK_ALL DBG_ENABLE_MASK_ALL
}; };
@ -9,7 +9,7 @@
char *p; char *p;
int len, rlen; int len, rlen;
@@ -306,6 +306,10 @@ static int proc_write_dbg(struct file *f @@ -308,6 +308,10 @@ static int proc_write_dbg(struct file *f
int f_enable = 0; int f_enable = 0;
int i; int i;
@ -20,7 +20,7 @@
len = count < sizeof(str) ? count : sizeof(str) - 1; len = count < sizeof(str) ? count : sizeof(str) - 1;
rlen = len - copy_from_user(str, buf, len); rlen = len - copy_from_user(str, buf, len);
while ( rlen && str[rlen - 1] <= ' ' ) while ( rlen && str[rlen - 1] <= ' ' )
@@ -365,6 +369,8 @@ static int proc_write_dbg(struct file *f @@ -367,6 +371,8 @@ static int proc_write_dbg(struct file *f
} }
} }