Commit dd7382a2 authored by Schspa Shi's avatar Schspa Shi Committed by David Sterba

btrfs: use non-bh spin_lock in zstd timer callback

This is an optimization for fix fee13fe9 ("btrfs: correct zstd
workspace manager lock to use spin_lock_bh()")

The critical region for wsm.lock is only accessed by the process context and
the softirq context.

Because in the soft interrupt, the critical section will not be
preempted by the soft interrupt again, there is no need to call
spin_lock_bh(&wsm.lock) to turn off the soft interrupt,
spin_lock(&wsm.lock) is enough for this situation.
Signed-off-by: default avatarSchspa Shi <schspa@gmail.com>
[ minor comment update ]
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 49024388
...@@ -93,22 +93,26 @@ static inline struct workspace *list_to_workspace(struct list_head *list) ...@@ -93,22 +93,26 @@ static inline struct workspace *list_to_workspace(struct list_head *list)
void zstd_free_workspace(struct list_head *ws); void zstd_free_workspace(struct list_head *ws);
struct list_head *zstd_alloc_workspace(unsigned int level); struct list_head *zstd_alloc_workspace(unsigned int level);
/*
* zstd_reclaim_timer_fn - reclaim timer /**
* Timer callback to free unused workspaces.
*
* @t: timer * @t: timer
* *
* This scans the lru_list and attempts to reclaim any workspace that hasn't * This scans the lru_list and attempts to reclaim any workspace that hasn't
* been used for ZSTD_BTRFS_RECLAIM_JIFFIES. * been used for ZSTD_BTRFS_RECLAIM_JIFFIES.
*
* The context is softirq and does not need the _bh locking primitives.
*/ */
static void zstd_reclaim_timer_fn(struct timer_list *timer) static void zstd_reclaim_timer_fn(struct timer_list *timer)
{ {
unsigned long reclaim_threshold = jiffies - ZSTD_BTRFS_RECLAIM_JIFFIES; unsigned long reclaim_threshold = jiffies - ZSTD_BTRFS_RECLAIM_JIFFIES;
struct list_head *pos, *next; struct list_head *pos, *next;
spin_lock_bh(&wsm.lock); spin_lock(&wsm.lock);
if (list_empty(&wsm.lru_list)) { if (list_empty(&wsm.lru_list)) {
spin_unlock_bh(&wsm.lock); spin_unlock(&wsm.lock);
return; return;
} }
...@@ -137,7 +141,7 @@ static void zstd_reclaim_timer_fn(struct timer_list *timer) ...@@ -137,7 +141,7 @@ static void zstd_reclaim_timer_fn(struct timer_list *timer)
if (!list_empty(&wsm.lru_list)) if (!list_empty(&wsm.lru_list))
mod_timer(&wsm.timer, jiffies + ZSTD_BTRFS_RECLAIM_JIFFIES); mod_timer(&wsm.timer, jiffies + ZSTD_BTRFS_RECLAIM_JIFFIES);
spin_unlock_bh(&wsm.lock); spin_unlock(&wsm.lock);
} }
/* /*
......
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