29b24f6ca112d drivers/staging/erofs/unzip_vle.h (Gao Xiang 2019-07-31 23:57:31 +0800 1) /* SPDX-License-Identifier: GPL-2.0-only */
29b24f6ca112d drivers/staging/erofs/unzip_vle.h (Gao Xiang 2019-07-31 23:57:31 +0800 2) /*
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 3) * Copyright (C) 2018 HUAWEI, Inc.
592e7cd00bb9d fs/erofs/zdata.h (Alexander A. Klimov 2020-07-13 15:09:44 +0200 4) * https://www.huawei.com/
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 5) * Created by Gao Xiang <gaoxiang25@huawei.com>
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 6) */
57b78c9fd9ce4 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:32 +0800 7) #ifndef __EROFS_FS_ZDATA_H
57b78c9fd9ce4 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:32 +0800 8) #define __EROFS_FS_ZDATA_H
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 9)
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 10) #include "internal.h"
57b78c9fd9ce4 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:32 +0800 11) #include "zpvec.h"
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 12)
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 13) #define Z_EROFS_PCLUSTER_MAX_PAGES (Z_EROFS_PCLUSTER_MAX_SIZE / PAGE_SIZE)
88aaf5a79c5cd drivers/staging/erofs/unzip_vle.h (Gao Xiang 2019-06-24 15:22:57 +0800 14) #define Z_EROFS_NR_INLINE_PAGEVECS 3
88aaf5a79c5cd drivers/staging/erofs/unzip_vle.h (Gao Xiang 2019-06-24 15:22:57 +0800 15)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 16) /*
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 17) * Structure fields follow one of the following exclusion rules.
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 18) *
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 19) * I: Modifiable by initialization/destruction paths and read-only
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 20) * for everyone else;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 21) *
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 22) * L: Field should be protected by pageset lock;
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 23) *
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 24) * A: Field should be accessed / updated in atomic for parallelized code.
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 25) */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 26) struct z_erofs_collection {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 27) struct mutex lock;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 28)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 29) /* I: page offset of start position of decompression */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 30) unsigned short pageofs;
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 31)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 32) /* L: maximum relative page index in pagevec[] */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 33) unsigned short nr_pages;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 34)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 35) /* L: total number of pages in pagevec[] */
e82a9a17d49c5 drivers/staging/erofs/unzip_vle.h (Pratik Shinde 2019-07-15 17:51:27 +0530 36) unsigned int vcnt;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 37)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 38) union {
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 39) /* L: inline a certain number of pagevecs for bootstrap */
fa61a33f53760 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2019-06-24 15:22:53 +0800 40) erofs_vtptr_t pagevec[Z_EROFS_NR_INLINE_PAGEVECS];
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 41)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 42) /* I: can be used to free the pcluster by RCU. */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 43) struct rcu_head rcu;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 44) };
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 45) };
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 46)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 47) #define Z_EROFS_PCLUSTER_FULL_LENGTH 0x00000001
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 48) #define Z_EROFS_PCLUSTER_LENGTH_BIT 1
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 49)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 50) /*
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 51) * let's leave a type here in case of introducing
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 52) * another tagged pointer later.
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 53) */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 54) typedef void *z_erofs_next_pcluster_t;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 55)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 56) struct z_erofs_pcluster {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 57) struct erofs_workgroup obj;
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 58) struct z_erofs_collection primary_collection;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 59)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 60) /* A: point to next chained pcluster or TAILs */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 61) z_erofs_next_pcluster_t next;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 62)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 63) /* A: lower limit of decompressed length and if full length or not */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 64) unsigned int length;
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 65)
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 66) /* I: physical cluster size in pages */
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 67) unsigned short pclusterpages;
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 68)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 69) /* I: compression algorithm format */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 70) unsigned char algorithmformat;
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 71)
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 72) /* A: compressed pages (can be cached or inplaced pages) */
9f6cc76e6ff06 fs/erofs/zdata.h (Gao Xiang 2021-04-07 12:39:20 +0800 73) struct page *compressed_pages[];
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 74) };
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 75)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 76) #define z_erofs_primarycollection(pcluster) (&(pcluster)->primary_collection)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 77)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 78) /* let's avoid the valid 32-bit kernel addresses */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 79)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 80) /* the chained workgroup has't submitted io (still open) */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 81) #define Z_EROFS_PCLUSTER_TAIL ((void *)0x5F0ECAFE)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 82) /* the chained workgroup has already submitted io */
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 83) #define Z_EROFS_PCLUSTER_TAIL_CLOSED ((void *)0x5F0EDEAD)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 84)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 85) #define Z_EROFS_PCLUSTER_NIL (NULL)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 86)
a4b1fab121ec3 fs/erofs/zdata.h (Gao Xiang 2019-10-08 20:56:15 +0800 87) struct z_erofs_decompressqueue {
a4b1fab121ec3 fs/erofs/zdata.h (Gao Xiang 2019-10-08 20:56:15 +0800 88) struct super_block *sb;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 89) atomic_t pending_bios;
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 90) z_erofs_next_pcluster_t head;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 91)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 92) union {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 93) wait_queue_head_t wait;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 94) struct work_struct work;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 95) } u;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 96) };
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 97)
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 98) #define MNGD_MAPPING(sbi) ((sbi)->managed_cache->i_mapping)
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 99) static inline bool erofs_page_is_managed(const struct erofs_sb_info *sbi,
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 100) struct page *page)
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 101) {
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 102) return page->mapping == MNGD_MAPPING(sbi);
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 103) }
14f362b4f4058 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:36 +0800 104)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 105) #define Z_EROFS_ONLINEPAGE_COUNT_BITS 2
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 106) #define Z_EROFS_ONLINEPAGE_COUNT_MASK ((1 << Z_EROFS_ONLINEPAGE_COUNT_BITS) - 1)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 107) #define Z_EROFS_ONLINEPAGE_INDEX_SHIFT (Z_EROFS_ONLINEPAGE_COUNT_BITS)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 108)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 109) /*
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 110) * waiters (aka. ongoing_packs): # to unlock the page
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 111) * sub-index: 0 - for partial page, >= 1 full page sub-index
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 112) */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 113) typedef atomic_t z_erofs_onlinepage_t;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 114)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 115) /* type punning */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 116) union z_erofs_onlinepage_converter {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 117) z_erofs_onlinepage_t *o;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 118) unsigned long *v;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 119) };
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 120)
e82a9a17d49c5 drivers/staging/erofs/unzip_vle.h (Pratik Shinde 2019-07-15 17:51:27 +0530 121) static inline unsigned int z_erofs_onlinepage_index(struct page *page)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 122) {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 123) union z_erofs_onlinepage_converter u;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 124)
800c16c8a927b drivers/staging/erofs/unzip_vle.h (Hariprasad Kelam 2019-06-08 15:19:18 +0530 125) DBG_BUGON(!PagePrivate(page));
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 126) u.v = &page_private(page);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 127)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 128) return atomic_read(u.o) >> Z_EROFS_ONLINEPAGE_INDEX_SHIFT;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 129) }
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 130)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 131) static inline void z_erofs_onlinepage_init(struct page *page)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 132) {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 133) union {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 134) z_erofs_onlinepage_t o;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 135) unsigned long v;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 136) /* keep from being unlocked in advance */
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 137) } u = { .o = ATOMIC_INIT(1) };
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 138)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 139) set_page_private(page, u.v);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 140) smp_wmb();
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 141) SetPagePrivate(page);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 142) }
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 143)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 144) static inline void z_erofs_onlinepage_fixup(struct page *page,
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 145) uintptr_t index, bool down)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 146) {
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 147) union z_erofs_onlinepage_converter u = { .v = &page_private(page) };
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 148) int orig, orig_index, val;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 149)
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 150) repeat:
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 151) orig = atomic_read(u.o);
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 152) orig_index = orig >> Z_EROFS_ONLINEPAGE_INDEX_SHIFT;
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 153) if (orig_index) {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 154) if (!index)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 155) return;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 156)
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 157) DBG_BUGON(orig_index != index);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 158) }
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 159)
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 160) val = (index << Z_EROFS_ONLINEPAGE_INDEX_SHIFT) |
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 161) ((orig & Z_EROFS_ONLINEPAGE_COUNT_MASK) + (unsigned int)down);
3c597282887fd fs/erofs/zdata.h (Gao Xiang 2020-06-19 07:43:49 +0800 162) if (atomic_cmpxchg(u.o, orig, val) != orig)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 163) goto repeat;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 164) }
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 165)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 166) static inline void z_erofs_onlinepage_endio(struct page *page)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 167) {
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 168) union z_erofs_onlinepage_converter u;
e82a9a17d49c5 drivers/staging/erofs/unzip_vle.h (Pratik Shinde 2019-07-15 17:51:27 +0530 169) unsigned int v;
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 170)
800c16c8a927b drivers/staging/erofs/unzip_vle.h (Hariprasad Kelam 2019-06-08 15:19:18 +0530 171) DBG_BUGON(!PagePrivate(page));
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 172) u.v = &page_private(page);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 173)
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 174) v = atomic_dec_return(u.o);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 175) if (!(v & Z_EROFS_ONLINEPAGE_COUNT_MASK)) {
6aaa7b0664e68 fs/erofs/zdata.h (Gao Xiang 2020-12-08 17:58:32 +0800 176) set_page_private(page, 0);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 177) ClearPagePrivate(page);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 178) if (!PageError(page))
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 179) SetPageUptodate(page);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 180) unlock_page(page);
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 181) }
4f761fa253b49 fs/erofs/zdata.h (Gao Xiang 2019-09-04 10:09:09 +0800 182) erofs_dbg("%s, page %p value %x", __func__, page, atomic_read(u.o));
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 183) }
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 184)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 185) #define Z_EROFS_VMAP_ONSTACK_PAGES \
81edee7ac83c5 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-28 15:10:32 +0800 186) min_t(unsigned int, THREAD_SIZE / 8 / sizeof(struct page *), 96U)
97e86a858bc36 drivers/staging/erofs/zdata.h (Gao Xiang 2019-07-31 23:57:47 +0800 187) #define Z_EROFS_VMAP_GLOBAL_PAGES 2048
3883a79abd022 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:06 +0800 188)
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 189) #endif
0d40d6e399c12 drivers/staging/erofs/unzip_vle.h (Gao Xiang 2018-07-26 20:22:02 +0800 190)