lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 11 Aug 2014 16:23:28 +0100 From: David Vrabel <david.vrabel@...rix.com> To: Wei Liu <wei.liu2@...rix.com>, Zoltan Kiss <zoltan.kiss@...rix.com> CC: <netdev@...r.kernel.org>, Ian Campbell <ian.campbell@...rix.com>, David Vrabel <david.vrabel@...rix.com>, <xen-devel@...ts.xen.org> Subject: Re: [Xen-devel] [PATCH net v2 2/3] xen-netback: don't stop dealloc kthread too early On 11/08/14 15:44, Wei Liu wrote: > On Mon, Aug 11, 2014 at 03:13:41PM +0100, Zoltan Kiss wrote: > [...] >>> 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. > > This snippet lacks change to while(). > > I would generally go for a shorter solution if the code is > self-explanatory. > > @@ -2078,21 +2066,19 @@ int xenvif_dealloc_kthread(void *data) > { > struct xenvif_queue *queue = data; > > - while (!kthread_should_stop()) { > + for (;;) { > wait_event_interruptible(queue->dealloc_wq, > tx_dealloc_work_todo(queue) || > kthread_should_stop()); This will never sleep if the thread is being stopped when there are packets in flight. > - if (kthread_should_stop()) > + if (kthread_should_stop() && > + !atomic_read(&queue->inflight_packets) && > + !tx_dealloc_work_todo(queue)) > break; Moving the final dealloc into the loop adds a cond_resched() call. This is harmless but not really necessary when the thread is about to stop. > > xenvif_tx_dealloc_action(queue); > cond_resched(); > } > > - /* Unmap anything remaining*/ > - if (tx_dealloc_work_todo(queue)) > - xenvif_tx_dealloc_action(queue); > - > return 0; > } David -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists