VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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)