erofs: simplify try_to_claim_pcluster()
authorGao Xiang <hsiangkao@redhat.com>
Tue, 8 Dec 2020 09:58:34 +0000 (17:58 +0800)
committerGao Xiang <hsiangkao@redhat.com>
Tue, 8 Dec 2020 10:08:22 +0000 (18:08 +0800)
simplify try_to_claim_pcluster() by directly using cmpxchg() here
(the retry loop caused more overhead.) Also, move the chain loop
detection in and rename it to z_erofs_try_to_claim_pcluster().

Link: https://lore.kernel.org/r/20201208095834.3133565-3-hsiangkao@redhat.com
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
fs/erofs/zdata.c

index 37fee144f0e7daea6fa7383bdf5d1d890ef9a799..777790038bc9d13bd0ea4724ac0dd5c3baf0f964 100644 (file)
@@ -292,34 +292,33 @@ static int z_erofs_attach_page(struct z_erofs_collector *clt,
        return ret ? 0 : -EAGAIN;
 }
 
-static enum z_erofs_collectmode
-try_to_claim_pcluster(struct z_erofs_pcluster *pcl,
-                     z_erofs_next_pcluster_t *owned_head)
+static void z_erofs_try_to_claim_pcluster(struct z_erofs_collector *clt)
 {
-       /* let's claim these following types of pclusters */
-retry:
-       if (pcl->next == Z_EROFS_PCLUSTER_NIL) {
-               /* type 1, nil pcluster */
-               if (cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_NIL,
-                           *owned_head) != Z_EROFS_PCLUSTER_NIL)
-                       goto retry;
+       struct z_erofs_pcluster *pcl = clt->pcl;
+       z_erofs_next_pcluster_t *owned_head = &clt->owned_head;
 
+       /* type 1, nil pcluster (this pcluster doesn't belong to any chain.) */
+       if (cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_NIL,
+                   *owned_head) == Z_EROFS_PCLUSTER_NIL) {
                *owned_head = &pcl->next;
-               /* lucky, I am the followee :) */
-               return COLLECT_PRIMARY_FOLLOWED;
-       } else if (pcl->next == Z_EROFS_PCLUSTER_TAIL) {
-               /*
-                * type 2, link to the end of a existing open chain,
-                * be careful that its submission itself is governed
-                * by the original owned chain.
-                */
-               if (cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_TAIL,
-                           *owned_head) != Z_EROFS_PCLUSTER_TAIL)
-                       goto retry;
+               /* so we can attach this pcluster to our submission chain. */
+               clt->mode = COLLECT_PRIMARY_FOLLOWED;
+               return;
+       }
+
+       /*
+        * type 2, link to the end of an existing open chain, be careful
+        * that its submission is controlled by the original attached chain.
+        */
+       if (cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_TAIL,
+                   *owned_head) == Z_EROFS_PCLUSTER_TAIL) {
                *owned_head = Z_EROFS_PCLUSTER_TAIL;
-               return COLLECT_PRIMARY_HOOKED;
+               clt->mode = COLLECT_PRIMARY_HOOKED;
+               clt->tailpcl = NULL;
+               return;
        }
-       return COLLECT_PRIMARY; /* :( better luck next time */
+       /* type 3, it belongs to a chain, but it isn't the end of the chain */
+       clt->mode = COLLECT_PRIMARY;
 }
 
 static int z_erofs_lookup_collection(struct z_erofs_collector *clt,
@@ -364,10 +363,8 @@ static int z_erofs_lookup_collection(struct z_erofs_collector *clt,
        /* used to check tail merging loop due to corrupted images */
        if (clt->owned_head == Z_EROFS_PCLUSTER_TAIL)
                clt->tailpcl = pcl;
-       clt->mode = try_to_claim_pcluster(pcl, &clt->owned_head);
-       /* clean tailpcl if the current owned_head is Z_EROFS_PCLUSTER_TAIL */
-       if (clt->owned_head == Z_EROFS_PCLUSTER_TAIL)
-               clt->tailpcl = NULL;
+
+       z_erofs_try_to_claim_pcluster(clt);
        clt->cl = cl;
        return 0;
 }