Commit 6afd227c authored by Gao Xiang's avatar Gao Xiang Committed by Greg Kroah-Hartman

staging: erofs: redefine where `owned_workgrp_t' points

By design, workgroups are queued in the form of linked lists.

Previously, it points to the next `z_erofs_vle_workgroup',
which isn't flexible enough to simplify `z_erofs_vle_submit_all'.

Let's fix it by pointing to the next `owned_workgrp_t' and use
container_of to get its coresponding `z_erofs_vle_workgroup'.
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 92e6efd5
...@@ -333,7 +333,7 @@ static inline bool try_to_claim_workgroup( ...@@ -333,7 +333,7 @@ static inline bool try_to_claim_workgroup(
*owned_head) != Z_EROFS_VLE_WORKGRP_NIL) *owned_head) != Z_EROFS_VLE_WORKGRP_NIL)
goto retry; goto retry;
*owned_head = grp; *owned_head = &grp->next;
*hosted = true; *hosted = true;
} else if (grp->next == Z_EROFS_VLE_WORKGRP_TAIL) { } else if (grp->next == Z_EROFS_VLE_WORKGRP_TAIL) {
/* /*
...@@ -488,7 +488,8 @@ z_erofs_vle_work_register(const struct z_erofs_vle_work_finder *f, ...@@ -488,7 +488,8 @@ z_erofs_vle_work_register(const struct z_erofs_vle_work_finder *f,
} }
} }
*f->owned_head = *f->grp_ret = grp; *f->owned_head = &grp->next;
*f->grp_ret = grp;
return work; return work;
} }
...@@ -1084,7 +1085,7 @@ static void z_erofs_vle_unzip_all(struct super_block *sb, ...@@ -1084,7 +1085,7 @@ static void z_erofs_vle_unzip_all(struct super_block *sb,
/* no possible that 'owned' equals NULL */ /* no possible that 'owned' equals NULL */
DBG_BUGON(owned == Z_EROFS_VLE_WORKGRP_NIL); DBG_BUGON(owned == Z_EROFS_VLE_WORKGRP_NIL);
grp = owned; grp = container_of(owned, struct z_erofs_vle_workgroup, next);
owned = READ_ONCE(grp->next); owned = READ_ONCE(grp->next);
z_erofs_vle_unzip(sb, grp, page_pool); z_erofs_vle_unzip(sb, grp, page_pool);
...@@ -1325,7 +1326,8 @@ static bool z_erofs_vle_submit_all(struct super_block *sb, ...@@ -1325,7 +1326,8 @@ static bool z_erofs_vle_submit_all(struct super_block *sb,
DBG_BUGON(owned_head == Z_EROFS_VLE_WORKGRP_TAIL_CLOSED); DBG_BUGON(owned_head == Z_EROFS_VLE_WORKGRP_TAIL_CLOSED);
DBG_BUGON(owned_head == Z_EROFS_VLE_WORKGRP_NIL); DBG_BUGON(owned_head == Z_EROFS_VLE_WORKGRP_NIL);
grp = owned_head; grp = container_of(owned_head,
struct z_erofs_vle_workgroup, next);
/* close the main owned chain at first */ /* close the main owned chain at first */
owned_head = cmpxchg(&grp->next, Z_EROFS_VLE_WORKGRP_TAIL, owned_head = cmpxchg(&grp->next, Z_EROFS_VLE_WORKGRP_TAIL,
...@@ -1382,7 +1384,7 @@ static bool z_erofs_vle_submit_all(struct super_block *sb, ...@@ -1382,7 +1384,7 @@ static bool z_erofs_vle_submit_all(struct super_block *sb,
WRITE_ONCE(lstgrp_io->next, iogrp_next); WRITE_ONCE(lstgrp_io->next, iogrp_next);
if (!lstgrp_noio) if (!lstgrp_noio)
ios[0]->head = grp; ios[0]->head = &grp->next;
else else
WRITE_ONCE(lstgrp_noio->next, grp); WRITE_ONCE(lstgrp_noio->next, grp);
......
...@@ -67,13 +67,13 @@ struct z_erofs_vle_work { ...@@ -67,13 +67,13 @@ struct z_erofs_vle_work {
#define Z_EROFS_VLE_WORKGRP_FMT_LZ4 1 #define Z_EROFS_VLE_WORKGRP_FMT_LZ4 1
#define Z_EROFS_VLE_WORKGRP_FMT_MASK 1 #define Z_EROFS_VLE_WORKGRP_FMT_MASK 1
typedef struct z_erofs_vle_workgroup *z_erofs_vle_owned_workgrp_t; typedef void *z_erofs_vle_owned_workgrp_t;
struct z_erofs_vle_workgroup { struct z_erofs_vle_workgroup {
struct erofs_workgroup obj; struct erofs_workgroup obj;
struct z_erofs_vle_work work; struct z_erofs_vle_work work;
/* next owned workgroup */ /* point to next owned_workgrp_t */
z_erofs_vle_owned_workgrp_t next; z_erofs_vle_owned_workgrp_t next;
/* compressed pages (including multi-usage pages) */ /* compressed pages (including multi-usage pages) */
......
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