Whamcloud - gitweb
LU-12362 ptlrpc: use wait_woken() in ptlrpcd()
[fs/lustre-release.git] / lustre / ptlrpc / ptlrpcd.c
index b92eed2..4c9b577 100644 (file)
@@ -27,7 +27,6 @@
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  *
  * lustre/ptlrpc/ptlrpcd.c
  */
@@ -240,17 +239,14 @@ void ptlrpcd_add_rqset(struct ptlrpc_request_set *set)
 static int ptlrpcd_steal_rqset(struct ptlrpc_request_set *des,
                               struct ptlrpc_request_set *src)
 {
-       struct list_head *tmp, *pos;
        struct ptlrpc_request *req;
        int rc = 0;
 
        spin_lock(&src->set_new_req_lock);
        if (likely(!list_empty(&src->set_new_requests))) {
-               list_for_each_safe(pos, tmp, &src->set_new_requests) {
-                       req = list_entry(pos, struct ptlrpc_request,
-                                        rq_set_chain);
+               list_for_each_entry(req, &src->set_new_requests, rq_set_chain)
                        req->rq_set = des;
-               }
+
                list_splice_init(&src->set_new_requests,
                                 &des->set_requests);
                rc = atomic_read(&src->set_new_count);
@@ -318,8 +314,7 @@ static inline void ptlrpc_reqset_get(struct ptlrpc_request_set *set)
  */
 static int ptlrpcd_check(struct lu_env *env, struct ptlrpcd_ctl *pc)
 {
-       struct list_head *tmp, *pos;
-       struct ptlrpc_request *req;
+       struct ptlrpc_request *req, *tmp;
        struct ptlrpc_request_set *set = pc->pc_set;
        int rc = 0;
        int rc2;
@@ -369,8 +364,7 @@ static int ptlrpcd_check(struct lu_env *env, struct ptlrpcd_ctl *pc)
         * NB: ptlrpc_check_set has already moved complted request at the
         * head of seq::set_requests
         */
-       list_for_each_safe(pos, tmp, &set->set_requests) {
-               req = list_entry(pos, struct ptlrpc_request, rq_set_chain);
+       list_for_each_entry_safe(req, tmp, &set->set_requests, rq_set_chain) {
                if (req->rq_phase != RQ_PHASE_COMPLETE)
                        break;
 
@@ -483,20 +477,32 @@ static int ptlrpcd(void *arg)
         * new_req_list and ptlrpcd_check() moves them into the set.
         */
        do {
+               DEFINE_WAIT_FUNC(wait, woken_wake_function);
                time64_t timeout;
 
                timeout = ptlrpc_set_next_timeout(set);
 
                lu_context_enter(&env.le_ctx);
                lu_context_enter(env.le_ses);
-               if (timeout == 0)
-                       wait_event_idle(set->set_waitq,
-                                       ptlrpcd_check(&env, pc));
-               else if (wait_event_idle_timeout(set->set_waitq,
-                                                ptlrpcd_check(&env, pc),
-                                                cfs_time_seconds(timeout))
-                        == 0)
+
+               add_wait_queue(&set->set_waitq, &wait);
+               while (!ptlrpcd_check(&env, pc)) {
+                       int ret;
+
+                       if (timeout == 0)
+                               ret = wait_woken(&wait, TASK_IDLE,
+                                                MAX_SCHEDULE_TIMEOUT);
+                       else
+                               ret = wait_woken(&wait, TASK_IDLE,
+                                                cfs_time_seconds(timeout));
+                       if (ret != 0)
+                               continue;
+                       /* Timed out */
                        ptlrpc_expired_set(set);
+                       break;
+               }
+               remove_wait_queue(&set->set_waitq, &wait);
+
                lu_context_exit(&env.le_ctx);
                lu_context_exit(env.le_ses);
 
@@ -622,7 +628,7 @@ int ptlrpcd_start(struct ptlrpcd_ctl *pc)
                RETURN(0);
        }
 
-       task = kthread_run(ptlrpcd, pc, pc->pc_name);
+       task = kthread_run(ptlrpcd, pc, "%s", pc->pc_name);
        if (IS_ERR(task))
                GOTO(out_set, rc = PTR_ERR(task));