Commit 54c5b7d3 authored by Ying Xue's avatar Ying Xue Committed by David S. Miller

rhashtable: introduce rhashtable_wakeup_worker helper function

Introduce rhashtable_wakeup_worker() helper function to reduce
duplicated code where to wake up worker.

By the way, as long as the both "future_tbl" and "tbl" bucket table
pointers point to the same bucket array, we should try to wake up
the resizing worker thread, otherwise, it indicates the work of
resizing hash table is not finished yet. However, currently we will
wake up the worker thread only when the two pointers point to
different bucket array. Obviously this is wrong. So, the issue is
also fixed as well in the patch.
Signed-off-by: default avatarYing Xue <ying.xue@windriver.com>
Cc: Thomas Graf <tgraf@suug.ch>
Acked-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent efb975a6
...@@ -492,6 +492,19 @@ static void rht_deferred_worker(struct work_struct *work) ...@@ -492,6 +492,19 @@ static void rht_deferred_worker(struct work_struct *work)
mutex_unlock(&ht->mutex); mutex_unlock(&ht->mutex);
} }
static void rhashtable_wakeup_worker(struct rhashtable *ht)
{
struct bucket_table *tbl = rht_dereference_rcu(ht->tbl, ht);
struct bucket_table *new_tbl = rht_dereference_rcu(ht->future_tbl, ht);
size_t size = tbl->size;
/* Only adjust the table if no resizing is currently in progress. */
if (tbl == new_tbl &&
((ht->p.grow_decision && ht->p.grow_decision(ht, size)) ||
(ht->p.shrink_decision && ht->p.shrink_decision(ht, size))))
schedule_delayed_work(&ht->run_work, 0);
}
/** /**
* rhashtable_insert - insert object into hash hash table * rhashtable_insert - insert object into hash hash table
* @ht: hash table * @ht: hash table
...@@ -532,10 +545,7 @@ void rhashtable_insert(struct rhashtable *ht, struct rhash_head *obj) ...@@ -532,10 +545,7 @@ void rhashtable_insert(struct rhashtable *ht, struct rhash_head *obj)
atomic_inc(&ht->nelems); atomic_inc(&ht->nelems);
/* Only grow the table if no resizing is currently in progress. */ rhashtable_wakeup_worker(ht);
if (ht->tbl != ht->future_tbl &&
ht->p.grow_decision && ht->p.grow_decision(ht, tbl->size))
schedule_delayed_work(&ht->run_work, 0);
rcu_read_unlock(); rcu_read_unlock();
} }
...@@ -584,10 +594,7 @@ bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *obj) ...@@ -584,10 +594,7 @@ bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *obj)
spin_unlock_bh(lock); spin_unlock_bh(lock);
if (ht->tbl != ht->future_tbl && rhashtable_wakeup_worker(ht);
ht->p.shrink_decision &&
ht->p.shrink_decision(ht, tbl->size))
schedule_delayed_work(&ht->run_work, 0);
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment