@@ -271,7 +271,7 @@ enum {
* @rqstp: the thread which is now busy
*
* By convention a thread is busy if rq_idle.next points to rq_idle.
- * This ensures it is not on the idle list.
+ * This will never be the case for threads on the idle list.
*/
static inline void svc_thread_set_busy(struct svc_rqst *rqstp)
{
@@ -283,9 +283,9 @@ static inline void svc_thread_set_busy(struct svc_rqst *rqstp)
* @rqstp: the thread which might be busy
*
* By convention a thread is busy if rq_idle.next points to rq_idle.
- * This ensures it is not on the idle list.
+ * This will never be the case for threads on the idle list.
*/
-static inline bool svc_thread_busy(struct svc_rqst *rqstp)
+static inline bool svc_thread_busy(const struct svc_rqst *rqstp)
{
return rqstp->rq_idle.next == &rqstp->rq_idle;
}
@@ -734,22 +734,16 @@ static void svc_rqst_wait_for_work(struct svc_rqst *rqstp)
llist_add(&rqstp->rq_idle, &pool->sp_idle_threads);
if (unlikely(!rqst_should_sleep(rqstp)))
- /* maybe there were no idle threads when some work
- * became ready and so nothing was woken. We've just
- * become idle so someone can to the work - maybe us.
- * But we cannot reliably remove ourselves from the
- * idle list - we can only remove the first task which
- * might be us, and might not.
- * So remove and wake it, then schedule(). If it was
- * us, we won't sleep. If it is some other thread, they
- * will do the work.
+ /* Work just became available. This thread cannot simply
+ * choose not to sleep as it *must* wait until removed.
+ * So wake the first waiter - whether it is this
+ * thread or some other, it will get the work done.
*/
svc_pool_wake_idle_thread(pool);
- /* We mustn't continue while on the idle list, and we
- * cannot remove outselves reliably. The only "work"
- * we can do while on the idle list is to freeze.
- * So loop until someone removes us
+ /* Since a thread cannot remove itself from an llist,
+ * schedule until someone else removes @rqstp from
+ * the idle list.
*/
while (!svc_thread_busy(rqstp)) {
schedule();
Revise some comments to hopefully make the more clear and less verbose. Signed-off-by: NeilBrown <neilb@suse.de> --- include/linux/sunrpc/svc.h | 6 +++--- net/sunrpc/svc_xprt.c | 20 +++++++------------- 2 files changed, 10 insertions(+), 16 deletions(-)