summaryrefslogtreecommitdiffstats
path: root/net/netlink
diff options
context:
space:
mode:
authorYing Xue <ying.xue@windriver.com>2015-01-16 11:13:09 +0800
committerDavid S. Miller <davem@davemloft.net>2015-01-16 01:18:51 -0500
commit57699a40b4f2694d3ee63fd5e6465ec8f600b620 (patch)
treeb3523af9d1685de66d9cba887007803bd2a1f467 /net/netlink
parentcbbd36676b152719bc8f01a2b91f998820554961 (diff)
downloadlinux-stable-57699a40b4f2694d3ee63fd5e6465ec8f600b620.tar.gz
linux-stable-57699a40b4f2694d3ee63fd5e6465ec8f600b620.tar.bz2
linux-stable-57699a40b4f2694d3ee63fd5e6465ec8f600b620.zip
rhashtable: Fix race in rhashtable_destroy() and use regular work_struct
When we put our declared work task in the global workqueue with schedule_delayed_work(), its delay parameter is always zero. Therefore, we should define a regular work in rhashtable structure instead of a delayed work. By the way, we add a condition to check whether resizing functions are NULL before cancelling the work, avoiding to cancel an uninitialized work. Lastly, while we wait for all work items we submitted before to run to completion with cancel_delayed_work(), ht->mutex has been taken in rhashtable_destroy(). Moreover, cancel_delayed_work() doesn't return until all work items are accomplished, and when work items are scheduled, the work's function - rht_deferred_worker() will be called. However, as rht_deferred_worker() also needs to acquire the lock, deadlock might happen at the moment as the lock is already held before. So if the cancel work function is moved out of the lock covered scope, this will avoid the deadlock. Fixes: 97defe1 ("rhashtable: Per bucket locks & deferred expansion/shrinking") Signed-off-by: Ying Xue <ying.xue@windriver.com> Cc: Thomas Graf <tgraf@suug.ch> Acked-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netlink')
0 files changed, 0 insertions, 0 deletions