Commit 4501ca36 authored by Gao Xiang's avatar Gao Xiang Committed by Greg Kroah-Hartman

staging: erofs: move shrink accounting inside the function

This patch moves the &erofs_global_shrink_cnt accounting
from the caller to erofs_workgroup_get().  It's cleaner and
it matches erofs_workgroup_put() better. No behavior change.
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d60eff43
...@@ -34,29 +34,29 @@ static atomic_long_t erofs_global_shrink_cnt; ...@@ -34,29 +34,29 @@ static atomic_long_t erofs_global_shrink_cnt;
#define __erofs_workgroup_get(grp) atomic_inc(&(grp)->refcount) #define __erofs_workgroup_get(grp) atomic_inc(&(grp)->refcount)
#define __erofs_workgroup_put(grp) atomic_dec(&(grp)->refcount) #define __erofs_workgroup_put(grp) atomic_dec(&(grp)->refcount)
static int erofs_workgroup_get(struct erofs_workgroup *grp, int *ocnt) static int erofs_workgroup_get(struct erofs_workgroup *grp)
{ {
int o; int o;
repeat: repeat:
o = erofs_wait_on_workgroup_freezed(grp); o = erofs_wait_on_workgroup_freezed(grp);
if (unlikely(o <= 0)) if (unlikely(o <= 0))
return -1; return -1;
if (unlikely(atomic_cmpxchg(&grp->refcount, o, o + 1) != o)) if (unlikely(atomic_cmpxchg(&grp->refcount, o, o + 1) != o))
goto repeat; goto repeat;
*ocnt = o; /* decrease refcount paired by erofs_workgroup_put */
if (unlikely(o == 1))
atomic_long_dec(&erofs_global_shrink_cnt);
return 0; return 0;
} }
struct erofs_workgroup *erofs_find_workgroup( struct erofs_workgroup *erofs_find_workgroup(struct super_block *sb,
struct super_block *sb, pgoff_t index, bool *tag) pgoff_t index, bool *tag)
{ {
struct erofs_sb_info *sbi = EROFS_SB(sb); struct erofs_sb_info *sbi = EROFS_SB(sb);
struct erofs_workgroup *grp; struct erofs_workgroup *grp;
int oldcount;
repeat: repeat:
rcu_read_lock(); rcu_read_lock();
...@@ -65,15 +65,12 @@ struct erofs_workgroup *erofs_find_workgroup( ...@@ -65,15 +65,12 @@ struct erofs_workgroup *erofs_find_workgroup(
*tag = xa_pointer_tag(grp); *tag = xa_pointer_tag(grp);
grp = xa_untag_pointer(grp); grp = xa_untag_pointer(grp);
if (erofs_workgroup_get(grp, &oldcount)) { if (erofs_workgroup_get(grp)) {
/* prefer to relax rcu read side */ /* prefer to relax rcu read side */
rcu_read_unlock(); rcu_read_unlock();
goto repeat; goto repeat;
} }
/* decrease refcount added by erofs_workgroup_put */
if (unlikely(oldcount == 1))
atomic_long_dec(&erofs_global_shrink_cnt);
DBG_BUGON(index != grp->index); DBG_BUGON(index != grp->index);
} }
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