From: Alex Zhuravlev Date: Mon, 3 Jun 2019 02:52:42 +0000 (+0300) Subject: LU-12491 obdclass: use RCU to release lu_env_item X-Git-Tag: 2.12.56~31 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=87306c22e4b977356f4857d5f750447639d89c26 LU-12491 obdclass: use RCU to release lu_env_item as rhashtable_lookup_fast() is lockless and can find just released objects. Fixes: aa82cc8361 ("obdclass: put all service's env on the list") Change-Id: I6ed8ccc5bb5b192eed90b55103d11b822ec90692 Signed-off-by: Alex Zhuravlev Reviewed-on: https://review.whamcloud.com/35038 Tested-by: jenkins Reviewed-by: Neil Brown Reviewed-by: Shaun Tancheff Reviewed-by: James Simmons Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/obdclass/lu_object.c b/lustre/obdclass/lu_object.c index fbe034a..e308851 100644 --- a/lustre/obdclass/lu_object.c +++ b/lustre/obdclass/lu_object.c @@ -1886,6 +1886,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 = { @@ -1925,6 +1926,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; @@ -1939,13 +1948,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);