From: Gao Xiang <hsiang...@linux.alibaba.com>

They should be located in `struct z_erofs_compress_ictx`.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 lib/compress.c | 57 +++++++++++++++++++++++++++-----------------------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/lib/compress.c b/lib/compress.c
index 8ca4033..0bc5426 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -38,6 +38,7 @@ struct z_erofs_extent_item {
 
 struct z_erofs_compress_ictx {         /* inode context */
        struct erofs_inode *inode;
+       struct erofs_compress_cfg *ccfg;
        int fd;
        u64 fpos;
 
@@ -49,6 +50,14 @@ struct z_erofs_compress_ictx {               /* inode 
context */
        u8 *metacur;
        struct list_head extents;
        u16 clusterofs;
+
+       int seg_num;
+
+#if EROFS_MT_ENABLED
+       pthread_mutex_t mutex;
+       pthread_cond_t cond;
+       int nfini;
+#endif
 };
 
 struct z_erofs_compress_sctx {         /* segment context */
@@ -68,7 +77,7 @@ struct z_erofs_compress_sctx {                /* segment 
context */
        erofs_blk_t blkaddr;            /* pointing to the next blkaddr */
        u16 clusterofs;
 
-       int seg_num, seg_idx;
+       int seg_idx;
 
        void *membuf;
        erofs_off_t memoff;
@@ -98,9 +107,6 @@ struct erofs_compress_work {
 static struct {
        struct erofs_workqueue wq;
        struct erofs_compress_work *idle;
-       pthread_mutex_t mutex;
-       pthread_cond_t cond;
-       int nfini;
 } z_erofs_mt_ctrl;
 #endif
 
@@ -513,7 +519,7 @@ static int __z_erofs_compress_one(struct 
z_erofs_compress_sctx *ctx,
        struct erofs_compress *const h = ctx->chandle;
        unsigned int len = ctx->tail - ctx->head;
        bool is_packed_inode = erofs_is_packed_inode(inode);
-       bool tsg = (ctx->seg_idx + 1 >= ctx->seg_num), final = !ctx->remaining;
+       bool tsg = (ctx->seg_idx + 1 >= ictx->seg_num), final = !ctx->remaining;
        bool may_packing = (cfg.c_fragments && tsg && final &&
                            !is_packed_inode && !z_erofs_mt_enabled);
        bool may_inline = (cfg.c_ztailpacking && tsg && final && !may_packing);
@@ -1201,7 +1207,8 @@ void z_erofs_mt_workfn(struct erofs_work *work, void 
*tlsp)
        struct erofs_compress_work *cwork = (struct erofs_compress_work *)work;
        struct erofs_compress_wq_tls *tls = tlsp;
        struct z_erofs_compress_sctx *sctx = &cwork->ctx;
-       struct erofs_inode *inode = sctx->ictx->inode;
+       struct z_erofs_compress_ictx *ictx = sctx->ictx;
+       struct erofs_inode *inode = ictx->inode;
        struct erofs_sb_info *sbi = inode->sbi;
        int ret = 0;
 
@@ -1228,10 +1235,10 @@ void z_erofs_mt_workfn(struct erofs_work *work, void 
*tlsp)
 
 out:
        cwork->errcode = ret;
-       pthread_mutex_lock(&z_erofs_mt_ctrl.mutex);
-       ++z_erofs_mt_ctrl.nfini;
-       pthread_cond_signal(&z_erofs_mt_ctrl.cond);
-       pthread_mutex_unlock(&z_erofs_mt_ctrl.mutex);
+       pthread_mutex_lock(&ictx->mutex);
+       ++ictx->nfini;
+       pthread_cond_signal(&ictx->cond);
+       pthread_mutex_unlock(&ictx->mutex);
 }
 
 int z_erofs_merge_segment(struct z_erofs_compress_ictx *ictx,
@@ -1268,16 +1275,19 @@ int z_erofs_merge_segment(struct z_erofs_compress_ictx 
*ictx,
 }
 
 int z_erofs_mt_compress(struct z_erofs_compress_ictx *ictx,
-                       struct erofs_compress_cfg *ccfg,
                        erofs_blk_t blkaddr,
                        erofs_blk_t *compressed_blocks)
 {
        struct erofs_compress_work *cur, *head = NULL, **last = &head;
+       struct erofs_compress_cfg *ccfg = ictx->ccfg;
        struct erofs_inode *inode = ictx->inode;
        int nsegs = DIV_ROUND_UP(inode->i_size, cfg.c_segment_size);
        int ret, i;
 
-       z_erofs_mt_ctrl.nfini = 0;
+       ictx->seg_num = nsegs;
+       ictx->nfini = 0;
+       pthread_mutex_init(&ictx->mutex, NULL);
+       pthread_cond_init(&ictx->cond, NULL);
 
        for (i = 0; i < nsegs; i++) {
                if (z_erofs_mt_ctrl.idle) {
@@ -1294,7 +1304,6 @@ int z_erofs_mt_compress(struct z_erofs_compress_ictx 
*ictx,
 
                cur->ctx = (struct z_erofs_compress_sctx) {
                        .ictx = ictx,
-                       .seg_num = nsegs,
                        .seg_idx = i,
                        .pivot = &dummy_pivot,
                };
@@ -1316,11 +1325,10 @@ int z_erofs_mt_compress(struct z_erofs_compress_ictx 
*ictx,
                erofs_queue_work(&z_erofs_mt_ctrl.wq, &cur->work);
        }
 
-       pthread_mutex_lock(&z_erofs_mt_ctrl.mutex);
-       while (z_erofs_mt_ctrl.nfini != nsegs)
-               pthread_cond_wait(&z_erofs_mt_ctrl.cond,
-                                 &z_erofs_mt_ctrl.mutex);
-       pthread_mutex_unlock(&z_erofs_mt_ctrl.mutex);
+       pthread_mutex_lock(&ictx->mutex);
+       while (ictx->nfini < ictx->seg_num)
+               pthread_cond_wait(&ictx->cond, &ictx->mutex);
+       pthread_mutex_unlock(&ictx->mutex);
 
        ret = 0;
        while (head) {
@@ -1354,7 +1362,6 @@ int erofs_write_compressed_file(struct erofs_inode 
*inode, int fd, u64 fpos)
        struct erofs_buffer_head *bh;
        static struct z_erofs_compress_ictx ctx;
        static struct z_erofs_compress_sctx sctx;
-       struct erofs_compress_cfg *ccfg;
        erofs_blk_t blkaddr, compressed_blocks = 0;
        int ret;
        bool ismt = false;
@@ -1389,8 +1396,8 @@ int erofs_write_compressed_file(struct erofs_inode 
*inode, int fd, u64 fpos)
                }
        }
 #endif
-       ccfg = &erofs_ccfg[inode->z_algorithmtype[0]];
-       inode->z_algorithmtype[0] = ccfg[0].algorithmtype;
+       ctx.ccfg = &erofs_ccfg[inode->z_algorithmtype[0]];
+       inode->z_algorithmtype[0] = ctx.ccfg->algorithmtype;
        inode->z_algorithmtype[1] = 0;
 
        inode->idata_size = 0;
@@ -1429,16 +1436,16 @@ int erofs_write_compressed_file(struct erofs_inode 
*inode, int fd, u64 fpos)
 #ifdef EROFS_MT_ENABLED
        } else if (z_erofs_mt_enabled && inode->i_size > cfg.c_segment_size) {
                ismt = true;
-               ret = z_erofs_mt_compress(&ctx, ccfg, blkaddr, 
&compressed_blocks);
+               ret = z_erofs_mt_compress(&ctx, blkaddr, &compressed_blocks);
                if (ret)
                        goto err_free_idata;
 #endif
        } else {
+               ctx.seg_num = 1;
                sctx.queue = g_queue;
                sctx.destbuf = NULL;
-               sctx.chandle = &ccfg->handle;
+               sctx.chandle = &ctx.ccfg->handle;
                sctx.remaining = inode->i_size - inode->fragment_size;
-               sctx.seg_num = 1;
                sctx.seg_idx = 0;
                sctx.pivot = &dummy_pivot;
                sctx.pclustersize = z_erofs_get_max_pclustersize(inode);
@@ -1628,8 +1635,6 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, 
struct erofs_buffer_head *s
        z_erofs_mt_enabled = false;
 #ifdef EROFS_MT_ENABLED
        if (cfg.c_mt_workers > 1) {
-               pthread_mutex_init(&z_erofs_mt_ctrl.mutex, NULL);
-               pthread_cond_init(&z_erofs_mt_ctrl.cond, NULL);
                ret = erofs_alloc_workqueue(&z_erofs_mt_ctrl.wq,
                                            cfg.c_mt_workers,
                                            cfg.c_mt_workers << 2,
-- 
2.30.2

Reply via email to