dlm: revert atomic_t lkb_wait_count
authorDavid Teigland <teigland@redhat.com>
Fri, 15 Mar 2024 19:11:45 +0000 (14:11 -0500)
committerDavid Teigland <teigland@redhat.com>
Fri, 15 Mar 2024 19:39:28 +0000 (14:39 -0500)
Revert "fs: dlm: handle lkb wait count as atomic_t"
This reverts commit 75a7d60134ce84209f2c61ec4619ee543aa8f466.

This counter does not need to be atomic.  As the comment in
the reverted commit mentions, the counter is protected by
the rsb lock.

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

index dfc444dad3298aeb361cc29533278496a81f85da..3b4dbce849f0f268d8b6876f28d90a32e0d9c119 100644 (file)
@@ -246,7 +246,7 @@ struct dlm_lkb {
        int8_t                  lkb_highbast;   /* highest mode bast sent for */
 
        int8_t                  lkb_wait_type;  /* type of reply waiting for */
-       atomic_t                lkb_wait_count;
+       int8_t                  lkb_wait_count;
        int                     lkb_wait_nodeid; /* for debugging */
 
        struct list_head        lkb_statequeue; /* rsb g/c/w list */
index 652c51fbbf7685e0777d61c6142c26350247396e..6dca5cdbbc5d134d4380e047601abf99969c3f80 100644 (file)
@@ -1407,7 +1407,6 @@ static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid)
 {
        struct dlm_ls *ls = lkb->lkb_resource->res_ls;
        int error = 0;
-       int wc;
 
        mutex_lock(&ls->ls_waiters_mutex);
 
@@ -1429,17 +1428,20 @@ static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid)
                        error = -EBUSY;
                        goto out;
                }
-               wc = atomic_inc_return(&lkb->lkb_wait_count);
+               lkb->lkb_wait_count++;
                hold_lkb(lkb);
 
                log_debug(ls, "addwait %x cur %d overlap %d count %d f %x",
-                         lkb->lkb_id, lkb->lkb_wait_type, mstype, wc,
-                         dlm_iflags_val(lkb));
+                         lkb->lkb_id, lkb->lkb_wait_type, mstype,
+                         lkb->lkb_wait_count, dlm_iflags_val(lkb));
                goto out;
        }
 
-       wc = atomic_fetch_inc(&lkb->lkb_wait_count);
-       DLM_ASSERT(!wc, dlm_print_lkb(lkb); printk("wait_count %d\n", wc););
+       DLM_ASSERT(!lkb->lkb_wait_count,
+                  dlm_print_lkb(lkb);
+                  printk("wait_count %d\n", lkb->lkb_wait_count););
+
+       lkb->lkb_wait_count++;
        lkb->lkb_wait_type = mstype;
        lkb->lkb_wait_nodeid = to_nodeid; /* for debugging */
        hold_lkb(lkb);
@@ -1502,7 +1504,7 @@ static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype,
                log_debug(ls, "remwait %x convert_reply zap overlap_cancel",
                          lkb->lkb_id);
                lkb->lkb_wait_type = 0;
-               atomic_dec(&lkb->lkb_wait_count);
+               lkb->lkb_wait_count--;
                unhold_lkb(lkb);
                goto out_del;
        }
@@ -1529,15 +1531,16 @@ static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype,
        if (overlap_done && lkb->lkb_wait_type) {
                log_error(ls, "remwait error %x reply %d wait_type %d overlap",
                          lkb->lkb_id, mstype, lkb->lkb_wait_type);
-               atomic_dec(&lkb->lkb_wait_count);
+               lkb->lkb_wait_count--;
                unhold_lkb(lkb);
                lkb->lkb_wait_type = 0;
        }
 
-       DLM_ASSERT(atomic_read(&lkb->lkb_wait_count), dlm_print_lkb(lkb););
+       DLM_ASSERT(lkb->lkb_wait_count, dlm_print_lkb(lkb););
 
        clear_bit(DLM_IFL_RESEND_BIT, &lkb->lkb_iflags);
-       if (atomic_dec_and_test(&lkb->lkb_wait_count))
+       lkb->lkb_wait_count--;
+       if (!lkb->lkb_wait_count)
                list_del_init(&lkb->lkb_wait_reply);
        unhold_lkb(lkb);
        return 0;
@@ -2666,7 +2669,7 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
                        goto out;
 
                /* lock not allowed if there's any op in progress */
-               if (lkb->lkb_wait_type || atomic_read(&lkb->lkb_wait_count))
+               if (lkb->lkb_wait_type || lkb->lkb_wait_count)
                        goto out;
 
                if (is_overlap(lkb))
@@ -2728,7 +2731,7 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
 
        /* normal unlock not allowed if there's any op in progress */
        if (!(args->flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK)) &&
-           (lkb->lkb_wait_type || atomic_read(&lkb->lkb_wait_count)))
+           (lkb->lkb_wait_type || lkb->lkb_wait_count))
                goto out;
 
        /* an lkb may be waiting for an rsb lookup to complete where the
@@ -5070,9 +5073,10 @@ int dlm_recover_waiters_post(struct dlm_ls *ls)
                /* drop all wait_count references we still
                 * hold a reference for this iteration.
                 */
-               while (!atomic_dec_and_test(&lkb->lkb_wait_count))
+               while (lkb->lkb_wait_count) {
+                       lkb->lkb_wait_count--;
                        unhold_lkb(lkb);
-
+               }
                mutex_lock(&ls->ls_waiters_mutex);
                list_del_init(&lkb->lkb_wait_reply);
                mutex_unlock(&ls->ls_waiters_mutex);