Thread (23 messages) flat view 23 messages, 4 authors, 2014-08-11

Re: [Xen-devel] [PATCH net v2 2/3] xen-netback: don't stop dealloc kthread too early

From: Zoltan Kiss <hidden>
Date: 2014-08-11 14:13:55

On 11/08/14 14:58, David Vrabel wrote:
On 11/08/14 14:48, Wei Liu wrote:
quoted
On Mon, Aug 11, 2014 at 01:10:12PM +0100, David Vrabel wrote:
quoted
On 08/08/14 17:37, Wei Liu wrote:
[...]
quoted
quoted
  	if (tx_evtchn == rx_evtchn) {
  		/* feature-split-event-channels == 0 */
@@ -687,6 +700,9 @@ void xenvif_disconnect(struct xenvif *vif)
  			queue->task = NULL;
  		}
  
+		wait_event(queue->inflight_wq,
+			   atomic_read(&queue->inflight_packets) == 0);
Just make the dealloc task not stop unless it has deallocated all
outstanding requests.  There's no need for another wait queue here.
Are you suggesting something like

   while (atomic_read(&queue->inflight_packets) !=0)
   	schedule_timeout(SOME_TIMEOUT);
No. That would be awful!

Add the test to the kthread itself:

int xenvif_dealloc_kthread(void *data)
{
	struct xenvif_queue *queue = data;

	while (atomic_read(&queue->inflight_packets) > 0
                || !kthread_should_stop()) {
             [...]

etc.

Although, the main loop is a bit confused, so I suggest adding:

static bool xenvif_dealloc_thread_should_stop(struct xenvif_queue *q)
{
     /* Dealloc thread must remain running if there are any inflight
      * packets so it can properly dealloc them when they complete.
      */
     return atomic_read(&queue->inflight_packets) == 0
         && kthread_should_stop();
}

And cleaning it up a bit (the while() could be a for(;;)).
I would recommend this:
---
@@ -2066,7 +2066,7 @@ int xenvif_dealloc_kthread(void *data)
 		wait_event_interruptible(queue->dealloc_wq,
 					 tx_dealloc_work_todo(queue) ||
 					 kthread_should_stop());
-		if (kthread_should_stop())
+		if (kthread_should_stop() && !atomic_read(&queue->inflight_packets))
 			break;
 
 		xenvif_tx_dealloc_action(queue);
---
If kthread_stop called, this will keep the main loop running until all callbacks are called.
Then it proceeds to the exit branch, otherwise doesn't disrupt normal operation.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help