fs: dlm: rsb hash table flag value to atomic ops
authorAlexander Aring <aahringo@redhat.com>
Mon, 6 Mar 2023 20:48:17 +0000 (15:48 -0500)
committerDavid Teigland <teigland@redhat.com>
Mon, 6 Mar 2023 21:49:07 +0000 (15:49 -0600)
This patch moves the rsb hash table handling to atomic flag operations.
The flag operations for DLM_RTF_SHRINK are protected by
ls->ls_rsbtbl[b].lock. However we switch to atomic ops if new possible
flags will be used in a different way and don't assume such lock
dependencies.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/dlm_internal.h
fs/dlm/lock.c

index b33473d9e3cfd5d24fab024d974d699fc491c420..e2925f554bc778d02446485cd84c3e8a1f4ea767 100644 (file)
@@ -99,13 +99,13 @@ do { \
 }
 
 
-#define DLM_RTF_SHRINK         0x00000001
+#define DLM_RTF_SHRINK_BIT     0
 
 struct dlm_rsbtable {
        struct rb_root          keep;
        struct rb_root          toss;
        spinlock_t              lock;
-       uint32_t                flags;
+       unsigned long           flags;
 };
 
 
index ecb2deef6eae307a1dcf4bea507b65cb113c9ada..507a03fe22798842898818926f272f4f22179268 100644 (file)
@@ -1139,7 +1139,7 @@ static void toss_rsb(struct kref *kref)
        rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep);
        rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss);
        r->res_toss_time = jiffies;
-       ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK;
+       set_bit(DLM_RTF_SHRINK_BIT, &ls->ls_rsbtbl[r->res_bucket].flags);
        if (r->res_lvbptr) {
                dlm_free_lvb(r->res_lvbptr);
                r->res_lvbptr = NULL;
@@ -1588,7 +1588,7 @@ static void shrink_bucket(struct dlm_ls *ls, int b)
 
        spin_lock(&ls->ls_rsbtbl[b].lock);
 
-       if (!(ls->ls_rsbtbl[b].flags & DLM_RTF_SHRINK)) {
+       if (!test_bit(DLM_RTF_SHRINK_BIT, &ls->ls_rsbtbl[b].flags)) {
                spin_unlock(&ls->ls_rsbtbl[b].lock);
                return;
        }
@@ -1643,9 +1643,9 @@ static void shrink_bucket(struct dlm_ls *ls, int b)
        }
 
        if (need_shrink)
-               ls->ls_rsbtbl[b].flags |= DLM_RTF_SHRINK;
+               set_bit(DLM_RTF_SHRINK_BIT, &ls->ls_rsbtbl[b].flags);
        else
-               ls->ls_rsbtbl[b].flags &= ~DLM_RTF_SHRINK;
+               clear_bit(DLM_RTF_SHRINK_BIT, &ls->ls_rsbtbl[b].flags);
        spin_unlock(&ls->ls_rsbtbl[b].lock);
 
        /*