Commit 473e15b0 authored by Gao Xiang's avatar Gao Xiang

erofs: simplify try_to_claim_pcluster()

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.comReviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarGao Xiang <hsiangkao@redhat.com>
parent bf225074
...@@ -292,34 +292,33 @@ static int z_erofs_attach_page(struct z_erofs_collector *clt, ...@@ -292,34 +292,33 @@ static int z_erofs_attach_page(struct z_erofs_collector *clt,
return ret ? 0 : -EAGAIN; return ret ? 0 : -EAGAIN;
} }
static enum z_erofs_collectmode static void z_erofs_try_to_claim_pcluster(struct z_erofs_collector *clt)
try_to_claim_pcluster(struct z_erofs_pcluster *pcl,
z_erofs_next_pcluster_t *owned_head)
{ {
/* let's claim these following types of pclusters */ struct z_erofs_pcluster *pcl = clt->pcl;
retry: z_erofs_next_pcluster_t *owned_head = &clt->owned_head;
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;
/* 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; *owned_head = &pcl->next;
/* lucky, I am the followee :) */ /* so we can attach this pcluster to our submission chain. */
return COLLECT_PRIMARY_FOLLOWED; clt->mode = COLLECT_PRIMARY_FOLLOWED;
} else if (pcl->next == Z_EROFS_PCLUSTER_TAIL) { return;
/* }
* type 2, link to the end of a existing open chain,
* be careful that its submission itself is governed /*
* by the original owned chain. * 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) if (cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_TAIL,
goto retry; *owned_head) == 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, 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, ...@@ -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 */ /* used to check tail merging loop due to corrupted images */
if (clt->owned_head == Z_EROFS_PCLUSTER_TAIL) if (clt->owned_head == Z_EROFS_PCLUSTER_TAIL)
clt->tailpcl = pcl; 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 */ z_erofs_try_to_claim_pcluster(clt);
if (clt->owned_head == Z_EROFS_PCLUSTER_TAIL)
clt->tailpcl = NULL;
clt->cl = cl; clt->cl = cl;
return 0; return 0;
} }
......
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