Thread (1 message) 1 message, 1 author, 2023-02-20

Re: [RFC v3] net/core: add optional threading for backlog processing

From: Felix Fietkau <nbd@nbd.name>
Date: 2023-02-20 08:23:19
Also in: lkml

On 20.02.23 01:41, Hillf Danton wrote:
On Sun, 19 Feb 2023 14:10:05 +0100 Felix Fietkau [off-list ref]
quoted
 /* Network device is going away, flush any packets still pending */
 static void flush_backlog(struct work_struct *work)
 {
+	unsigned int process_queue_empty;
+	bool threaded, flush_processq;
 	struct sk_buff *skb, *tmp;
 	struct softnet_data *sd;
 
@@ -5792,8 +5794,15 @@ static void flush_backlog(struct work_struct *work)
 			input_queue_head_incr(sd);
 		}
 	}
+
+	threaded = test_bit(NAPI_STATE_THREADED, &sd->backlog.state);
+	flush_processq = threaded &&
+			 !skb_queue_empty_lockless(&sd->process_queue);
 	rps_unlock_irq_enable(sd);
 
+	if (threaded)
+		goto out;
+
 	skb_queue_walk_safe(&sd->process_queue, skb, tmp) {
 		if (skb->dev->reg_state == NETREG_UNREGISTERING) {
 			__skb_unlink(skb, &sd->process_queue);
@@ -5801,7 +5810,16 @@ static void flush_backlog(struct work_struct *work)
 			input_queue_head_incr(sd);
 		}
 	}
+
+out:
 	local_bh_enable();
+
+	while (flush_processq) {
+		msleep(1);
+		rps_lock_irq_disable(sd);
+		flush_processq = process_queue_empty == sd->process_queue_empty;
+		rps_unlock_irq_enable(sd);
+	}
 }
Have hard time guessing how this wait works given process_queue_empty
not initialized. Is this random check intended?
Please check my initial reply to this patch. I forgot to amend the 
commit with the missing initialization lines before sending out the patch.

- Felix
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help