Whamcloud - gitweb
LU-12491 obdclass: use RCU to release lu_env_item 87/35487/3
authorAlex Zhuravlev <bzzz@whamcloud.com>
Mon, 3 Jun 2019 02:52:42 +0000 (05:52 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 26 Jul 2019 18:53:23 +0000 (18:53 +0000)
as rhashtable_lookup_fast() is lockless and can
find just released objects.

Fixes: aa82cc8361 ("obdclass: put all service's env on the list")

Lustre-change: https://review.whamcloud.com/35038
Lustre-commit: 87306c22e4b977356f4857d5f750447639d89c26

Change-Id: I6ed8ccc5bb5b192eed90b55103d11b822ec90692
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Neil Brown <neilb@suse.com>
Reviewed-by: Shaun Tancheff <stancheff@cray.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Minh Diep <mdiep@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/35487
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/obdclass/lu_object.c

index 39e1f37..0ca275e 100644 (file)
@@ -1906,6 +1906,7 @@ struct lu_env_item {
        struct task_struct *lei_task;   /* rhashtable key */
        struct rhash_head lei_linkage;
        struct lu_env *lei_env;
+       struct rcu_head lei_rcu_head;
 };
 
 static const struct rhashtable_params lu_env_rhash_params = {
@@ -1945,6 +1946,14 @@ int lu_env_add(struct lu_env *env)
 }
 EXPORT_SYMBOL(lu_env_add);
 
+static void lu_env_item_free(struct rcu_head *head)
+{
+       struct lu_env_item *lei;
+
+       lei = container_of(head, struct lu_env_item, lei_rcu_head);
+       OBD_FREE_PTR(lei);
+}
+
 void lu_env_remove(struct lu_env *env)
 {
        struct lu_env_item *lei;
@@ -1959,13 +1968,11 @@ void lu_env_remove(struct lu_env *env)
                }
        }
 
-       rcu_read_lock();
        lei = rhashtable_lookup_fast(&lu_env_rhash, &task,
                                     lu_env_rhash_params);
        if (lei && rhashtable_remove_fast(&lu_env_rhash, &lei->lei_linkage,
                                          lu_env_rhash_params) == 0)
-               OBD_FREE_PTR(lei);
-       rcu_read_unlock();
+               call_rcu(&lei->lei_rcu_head, lu_env_item_free);
 }
 EXPORT_SYMBOL(lu_env_remove);