Whamcloud - gitweb
LU-10467 lov: use wait_event() in lov_subobject_kill() 43/36343/2
authorNeilBrown <neilb@suse.com>
Tue, 1 Oct 2019 18:12:23 +0000 (14:12 -0400)
committerOleg Drokin <green@whamcloud.com>
Fri, 6 Dec 2019 00:59:09 +0000 (00:59 +0000)
lov_subobject_kill() has an open-coded version
of wait_event(). Change it to use the macro.

There is no need to take a spinlock just to check if a variable
have changed value. If there was, the first test would be protected too.

"lti_waiter" now has no users and can be removed from lov_thread_info.

Change-Id: Ic1126fc500c03c48c4426171e98590ef6dce3098
Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-on: https://review.whamcloud.com/36343
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Shaun Tancheff <stancheff@cray.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lov/lov_cl_internal.h
lustre/lov/lov_object.c

index b811451..7768625 100644 (file)
@@ -471,7 +471,6 @@ struct lov_thread_info {
        struct ost_lvb          lti_lvb;
        struct cl_2queue        lti_cl2q;
        struct cl_page_list     lti_plist;
-       wait_queue_entry_t      lti_waiter;
 };
 
 /**
index 64c99b3..c41a853 100644 (file)
@@ -284,7 +284,6 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov,
        struct cl_object        *sub;
        struct lu_site          *site;
        wait_queue_head_t *wq;
-       wait_queue_entry_t *waiter;
 
         LASSERT(r0->lo_sub[idx] == los);
 
@@ -299,27 +298,7 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov,
 
        /* ... wait until it is actually destroyed---sub-object clears its
         * ->lo_sub[] slot in lovsub_object_free() */
-       if (r0->lo_sub[idx] == los) {
-               waiter = &lov_env_info(env)->lti_waiter;
-               init_waitqueue_entry(waiter, current);
-               add_wait_queue(wq, waiter);
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               while (1) {
-                       /* this wait-queue is signaled at the end of
-                        * lu_object_free(). */
-                       set_current_state(TASK_UNINTERRUPTIBLE);
-                       spin_lock(&r0->lo_sub_lock);
-                       if (r0->lo_sub[idx] == los) {
-                               spin_unlock(&r0->lo_sub_lock);
-                               schedule();
-                       } else {
-                               spin_unlock(&r0->lo_sub_lock);
-                               set_current_state(TASK_RUNNING);
-                               break;
-                       }
-               }
-               remove_wait_queue(wq, waiter);
-       }
+       wait_event(*wq, r0->lo_sub[idx] != los);
        LASSERT(r0->lo_sub[idx] == NULL);
 }