mirror of https://gitee.com/openkylin/linux.git
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.com Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
This commit is contained in:
parent
bf225074ff
commit
473e15b0c0
|
@ -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.
|
|
||||||
*/
|
|
||||||
if (cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_TAIL,
|
|
||||||
*owned_head) != Z_EROFS_PCLUSTER_TAIL)
|
|
||||||
goto retry;
|
|
||||||
*owned_head = Z_EROFS_PCLUSTER_TAIL;
|
|
||||||
return COLLECT_PRIMARY_HOOKED;
|
|
||||||
}
|
}
|
||||||
return COLLECT_PRIMARY; /* :( better luck next time */
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
clt->mode = COLLECT_PRIMARY_HOOKED;
|
||||||
|
clt->tailpcl = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* 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,
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue