Revise some comments to hopefully make the more clear and less verbose. Signed-off-by: NeilBrown <neilb@xxxxxxx> --- include/linux/sunrpc/svc.h | 6 +++--- net/sunrpc/svc_xprt.c | 20 +++++++------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 5216f95411e3..ed20a2ea1f81 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -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; } diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 81327001e074..17c43bde35c9 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -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(); -- 2.41.0