From: kernel test robot <lkp@intel.com>
To: Hongzhen Luo <hongzhen@linux.alibaba.com>
Cc: oe-kbuild-all@lists.linux.dev
Subject: Re: [RFC PATCH v5 4/4] erofs: introduce .fadvise for page cache share
Date: Mon, 6 Jan 2025 02:52:19 +0800 [thread overview]
Message-ID: <202501060221.LPQZaeA4-lkp@intel.com> (raw)
In-Reply-To: <20250105151208.3797385-5-hongzhen@linux.alibaba.com>
Hi Hongzhen,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build errors:
[auto build test ERROR on xiang-erofs/dev-test]
[also build test ERROR on xiang-erofs/dev xiang-erofs/fixes linus/master v6.13-rc5 next-20241220]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Hongzhen-Luo/erofs-move-struct-erofs_anon_fs_type-to-super-c/20250105-231438
base: https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git dev-test
patch link: https://lore.kernel.org/r/20250105151208.3797385-5-hongzhen%40linux.alibaba.com
patch subject: [RFC PATCH v5 4/4] erofs: introduce .fadvise for page cache share
config: loongarch-randconfig-001-20250106 (https://download.01.org/0day-ci/archive/20250106/202501060221.LPQZaeA4-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250106/202501060221.LPQZaeA4-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501060221.LPQZaeA4-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from fs/erofs/pagecache_share.c:10:
fs/erofs/pagecache_share.c: In function 'erofs_pcshr_init_mnt':
>> fs/erofs/pagecache_share.c:66:32: error: invalid application of 'sizeof' to incomplete type 'struct interval_tree_node'
66 | sizeof(struct interval_tree_node), 0,
| ^~~~~~
include/linux/slab.h:430:55: note: in definition of macro 'kmem_cache_create'
430 | default: __kmem_cache_create)(__name, __object_size, __args, __VA_ARGS__)
| ^~~~~~~~~~~~~
fs/erofs/pagecache_share.c: In function 'erofs_pcshr_free_inode':
>> fs/erofs/pagecache_share.c:163:15: error: implicit declaration of function 'interval_tree_iter_first'; did you mean 'vma_interval_tree_iter_first'? [-Wimplicit-function-declaration]
163 | seg = interval_tree_iter_first(&vi->segs, 0, LLONG_MAX);
| ^~~~~~~~~~~~~~~~~~~~~~~~
| vma_interval_tree_iter_first
>> fs/erofs/pagecache_share.c:163:13: error: assignment to 'struct interval_tree_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
163 | seg = interval_tree_iter_first(&vi->segs, 0, LLONG_MAX);
| ^
>> fs/erofs/pagecache_share.c:165:28: error: implicit declaration of function 'interval_tree_iter_next'; did you mean 'vma_interval_tree_iter_next'? [-Wimplicit-function-declaration]
165 | next_seg = interval_tree_iter_next(seg, 0, LLONG_MAX);
| ^~~~~~~~~~~~~~~~~~~~~~~
| vma_interval_tree_iter_next
fs/erofs/pagecache_share.c:165:26: error: assignment to 'struct interval_tree_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
165 | next_seg = interval_tree_iter_next(seg, 0, LLONG_MAX);
| ^
>> fs/erofs/pagecache_share.c:166:17: error: implicit declaration of function 'interval_tree_remove'; did you mean 'vma_interval_tree_remove'? [-Wimplicit-function-declaration]
166 | interval_tree_remove(seg, &vi->segs);
| ^~~~~~~~~~~~~~~~~~~~
| vma_interval_tree_remove
fs/erofs/pagecache_share.c: In function 'erofs_pcshr_fadvise':
fs/erofs/pagecache_share.c:276:13: error: assignment to 'struct interval_tree_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
276 | seg = interval_tree_iter_first(&vi->segs, start, end);
| ^
fs/erofs/pagecache_share.c:278:26: error: assignment to 'struct interval_tree_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
278 | next_seg = interval_tree_iter_next(seg, start, end);
| ^
In file included from include/linux/kernel.h:28,
from include/linux/cpumask.h:11,
from arch/loongarch/include/asm/processor.h:9,
from arch/loongarch/include/asm/thread_info.h:15,
from include/linux/thread_info.h:60,
from include/asm-generic/current.h:6,
from ./arch/loongarch/include/generated/asm/current.h:1,
from include/linux/mutex.h:14,
from fs/erofs/pagecache_share.c:8:
>> fs/erofs/pagecache_share.c:283:35: error: invalid use of undefined type 'struct interval_tree_node'
283 | l = max_t(u64, seg->start | 0ULL, start);
| ^~
include/linux/minmax.h:93:23: note: in definition of macro '__cmp_once_unique'
93 | ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
| ^
include/linux/minmax.h:221:27: note: in expansion of macro '__cmp_once'
221 | #define max_t(type, x, y) __cmp_once(max, type, x, y)
| ^~~~~~~~~~
fs/erofs/pagecache_share.c:283:21: note: in expansion of macro 'max_t'
283 | l = max_t(u64, seg->start | 0ULL, start);
| ^~~~~
fs/erofs/pagecache_share.c:284:35: error: invalid use of undefined type 'struct interval_tree_node'
284 | r = min_t(u64, seg->last | 0ULL, end);
| ^~
include/linux/minmax.h:93:23: note: in definition of macro '__cmp_once_unique'
93 | ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
| ^
include/linux/minmax.h:213:27: note: in expansion of macro '__cmp_once'
213 | #define min_t(type, x, y) __cmp_once(min, type, x, y)
| ^~~~~~~~~~
fs/erofs/pagecache_share.c:284:21: note: in expansion of macro 'min_t'
284 | r = min_t(u64, seg->last | 0ULL, end);
| ^~~~~
fs/erofs/pagecache_share.c:289:24: error: invalid use of undefined type 'struct interval_tree_node'
289 | if (seg->start < l) {
| ^~
fs/erofs/pagecache_share.c:291:32: error: invalid use of undefined type 'struct interval_tree_node'
291 | new_seg->start = seg->start;
| ^~
fs/erofs/pagecache_share.c:291:45: error: invalid use of undefined type 'struct interval_tree_node'
291 | new_seg->start = seg->start;
| ^~
fs/erofs/pagecache_share.c:292:32: error: invalid use of undefined type 'struct interval_tree_node'
292 | new_seg->last = l;
| ^~
>> fs/erofs/pagecache_share.c:293:25: error: implicit declaration of function 'interval_tree_insert'; did you mean 'vma_interval_tree_insert'? [-Wimplicit-function-declaration]
293 | interval_tree_insert(new_seg, &vi->segs);
| ^~~~~~~~~~~~~~~~~~~~
| vma_interval_tree_insert
fs/erofs/pagecache_share.c:297:28: error: invalid use of undefined type 'struct interval_tree_node'
297 | if (r < seg->last) {
| ^~
fs/erofs/pagecache_share.c:299:32: error: invalid use of undefined type 'struct interval_tree_node'
299 | new_seg->start = r;
| ^~
fs/erofs/pagecache_share.c:300:32: error: invalid use of undefined type 'struct interval_tree_node'
300 | new_seg->last = seg->last;
| ^~
fs/erofs/pagecache_share.c:300:44: error: invalid use of undefined type 'struct interval_tree_node'
300 | new_seg->last = seg->last;
| ^~
fs/erofs/pagecache_share.c: In function 'erofs_pcshr_read_end':
fs/erofs/pagecache_share.c:367:12: error: invalid use of undefined type 'struct interval_tree_node'
367 | seg->start = folio_index(folio);
| ^~
fs/erofs/pagecache_share.c:368:12: error: invalid use of undefined type 'struct interval_tree_node'
368 | seg->last = seg->start + (folio_size(folio) >> PAGE_SHIFT);
| ^~
fs/erofs/pagecache_share.c:368:24: error: invalid use of undefined type 'struct interval_tree_node'
368 | seg->last = seg->start + (folio_size(folio) >> PAGE_SHIFT);
| ^~
fs/erofs/pagecache_share.c:369:16: error: invalid use of undefined type 'struct interval_tree_node'
369 | if (seg->last > (vi->vfs_inode.i_size >> PAGE_SHIFT))
| ^~
fs/erofs/pagecache_share.c:370:20: error: invalid use of undefined type 'struct interval_tree_node'
370 | seg->last = vi->vfs_inode.i_size >> PAGE_SHIFT;
| ^~
In file included from fs/erofs/pagecache_share.c:13:
fs/erofs/pagecache_share.c:371:22: error: invalid use of undefined type 'struct interval_tree_node'
371 | DBG_BUGON(seg->last < seg->start);
| ^~
fs/erofs/internal.h:32:41: note: in definition of macro 'DBG_BUGON'
32 | #define DBG_BUGON(x) ((void)(x))
| ^
fs/erofs/pagecache_share.c:371:34: error: invalid use of undefined type 'struct interval_tree_node'
371 | DBG_BUGON(seg->last < seg->start);
| ^~
fs/erofs/internal.h:32:41: note: in definition of macro 'DBG_BUGON'
32 | #define DBG_BUGON(x) ((void)(x))
| ^
fs/erofs/pagecache_share.c: In function 'erofs_pcshr_readahead_end':
fs/erofs/pagecache_share.c:422:12: error: invalid use of undefined type 'struct interval_tree_node'
422 | seg->start = start;
| ^~
fs/erofs/pagecache_share.c:423:12: error: invalid use of undefined type 'struct interval_tree_node'
423 | seg->last = readahead_pos(rac) >> PAGE_SHIFT;
| ^~
fs/erofs/pagecache_share.c:424:16: error: invalid use of undefined type 'struct interval_tree_node'
424 | if (seg->last > (vi->vfs_inode.i_size >> PAGE_SHIFT))
| ^~
fs/erofs/pagecache_share.c:425:20: error: invalid use of undefined type 'struct interval_tree_node'
425 | seg->last = vi->vfs_inode.i_size >> PAGE_SHIFT;
| ^~
vim +66 fs/erofs/pagecache_share.c
> 8 #include <linux/mutex.h>
9 #include <uapi/linux/fadvise.h>
> 10 #include <linux/slab.h>
11 #include <linux/pagemap.h>
12 #include "pagecache_share.h"
13 #include "internal.h"
14 #include "xattr.h"
15
16 #define PCSHR_FPRT_IDX 4
17 #define PCSHR_FPRT_NAME "erofs.fingerprint"
18 #define PCSHR_FPRT_MAXLEN (sizeof(size_t) + 1024)
19
20 struct erofs_pcshr_counter {
21 struct mutex mutex;
22 struct kref ref;
23 struct vfsmount *mnt;
24 /* kmem cache for each inode's first-read segments */
25 struct kmem_cache *segsp;
26 };
27
28 struct erofs_pcshr_private {
29 char fprt[PCSHR_FPRT_MAXLEN];
30 struct mutex mutex;
31 };
32
33 static struct erofs_pcshr_counter mnt_counter = {
34 .mutex = __MUTEX_INITIALIZER(mnt_counter.mutex),
35 .mnt = NULL,
36 };
37
38 static void erofs_pcshr_counter_release(struct kref *ref)
39 {
40 struct erofs_pcshr_counter *counter = container_of(ref,
41 struct erofs_pcshr_counter, ref);
42
43 DBG_BUGON(!counter->mnt);
44 kern_unmount(counter->mnt);
45 counter->mnt = NULL;
46 kmem_cache_destroy(counter->segsp);
47 counter->segsp = NULL;
48 }
49
50 int erofs_pcshr_init_mnt(void)
51 {
52 int ret;
53 struct vfsmount *tmp;
54
55 mutex_lock(&mnt_counter.mutex);
56 if (!mnt_counter.mnt) {
57 tmp = kern_mount(&erofs_anon_fs_type);
58 if (IS_ERR(tmp)) {
59 ret = PTR_ERR(tmp);
60 goto out;
61 }
62 mnt_counter.mnt = tmp;
63 kref_init(&mnt_counter.ref);
64
65 mnt_counter.segsp = kmem_cache_create("erofs_segs",
> 66 sizeof(struct interval_tree_node), 0,
67 SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT, NULL);
68 if (!mnt_counter.segsp) {
69 ret = -ENOMEM;
70 goto out;
71 }
72 } else
73 kref_get(&mnt_counter.ref);
74 ret = 0;
75 out:
76 mutex_unlock(&mnt_counter.mutex);
77 return ret;
78 }
79
80 void erofs_pcshr_free_mnt(void)
81 {
82 mutex_lock(&mnt_counter.mutex);
83 kref_put(&mnt_counter.ref, erofs_pcshr_counter_release);
84 mutex_unlock(&mnt_counter.mutex);
85 }
86
87 static struct interval_tree_node *erofs_pcshr_alloc_seg(void)
88 {
89 return kmem_cache_alloc(mnt_counter.segsp, GFP_KERNEL);
90 }
91
92 static void erofs_pcshr_free_seg(struct interval_tree_node *seg)
93 {
94 kmem_cache_free(mnt_counter.segsp, seg);
95 }
96
97 static int erofs_fprt_eq(struct inode *inode, void *data)
98 {
99 struct erofs_pcshr_private *ano_private = inode->i_private;
100
101 return ano_private && memcmp(ano_private->fprt, data,
102 sizeof(size_t) + *(size_t *)data) == 0 ? 1 : 0;
103 }
104
105 static int erofs_fprt_set(struct inode *inode, void *data)
106 {
107 struct erofs_pcshr_private *ano_private;
108
109 ano_private = kmalloc(sizeof(struct erofs_pcshr_private), GFP_KERNEL);
110 if (!ano_private)
111 return -ENOMEM;
112 memcpy(ano_private, data, sizeof(size_t) + *(size_t *)data);
113 mutex_init(&ano_private->mutex);
114 inode->i_private = ano_private;
115 return 0;
116 }
117
118 int erofs_pcshr_fill_inode(struct inode *inode)
119 {
120 struct erofs_inode *vi = EROFS_I(inode);
121 /* | fingerprint length | fingerprint content | */
122 char fprt[PCSHR_FPRT_MAXLEN];
123 struct inode *ano_inode;
124 unsigned long fprt_hash;
125 size_t fprt_len;
126 int ret = -1;
127
128 vi->ano_inode = NULL;
129 memset(fprt, 0, sizeof(fprt));
130 fprt_len = erofs_getxattr(inode, PCSHR_FPRT_IDX, PCSHR_FPRT_NAME,
131 fprt + sizeof(size_t), PCSHR_FPRT_MAXLEN);
132 if (fprt_len > 0 && fprt_len <= PCSHR_FPRT_MAXLEN) {
133 *(size_t *)fprt = fprt_len;
134 fprt_hash = xxh32(fprt + sizeof(size_t), fprt_len, 0);
135 ano_inode = iget5_locked(mnt_counter.mnt->mnt_sb, fprt_hash,
136 erofs_fprt_eq, erofs_fprt_set, fprt);
137 DBG_BUGON(!ano_inode);
138 vi->ano_inode = ano_inode;
139 vi->segs = RB_ROOT_CACHED;
140 mutex_init(&vi->segs_mutex);
141 if (ano_inode->i_state & I_NEW) {
142 if (erofs_inode_is_data_compressed(vi->datalayout))
143 ano_inode->i_mapping->a_ops = &z_erofs_aops;
144 else
145 ano_inode->i_mapping->a_ops = &erofs_aops;
146 ano_inode->i_size = inode->i_size;
147 unlock_new_inode(ano_inode);
148 }
149 ret = 0;
150 }
151 return ret;
152 }
153
154 void erofs_pcshr_free_inode(struct inode *inode)
155 {
156 struct interval_tree_node *seg, *next_seg;
157 struct erofs_inode *vi = EROFS_I(inode);
158
159 if (S_ISREG(inode->i_mode) && vi->ano_inode) {
160 iput(vi->ano_inode);
161 vi->ano_inode = NULL;
162 }
> 163 seg = interval_tree_iter_first(&vi->segs, 0, LLONG_MAX);
164 while (seg) {
> 165 next_seg = interval_tree_iter_next(seg, 0, LLONG_MAX);
> 166 interval_tree_remove(seg, &vi->segs);
167 erofs_pcshr_free_seg(seg);
168 seg = next_seg;
169 }
170 }
171
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2025-01-05 18:53 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-05 15:12 [RFC PATCH v5 0/4] erofs: page cache share feature Hongzhen Luo
2025-01-05 15:12 ` Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 1/4] erofs: move `struct erofs_anon_fs_type` to super.c Hongzhen Luo
2025-01-05 15:12 ` Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 2/4] erofs: introduce the page cache share feature Hongzhen Luo
2025-01-05 15:12 ` Hongzhen Luo
2025-01-06 2:27 ` Gao Xiang
2025-01-06 3:03 ` Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 3/4] erofs: apply " Hongzhen Luo
2025-01-05 15:12 ` Hongzhen Luo
2025-01-06 2:15 ` Gao Xiang
2025-01-21 11:59 ` Hongbo Li via Linux-erofs
2025-01-21 11:59 ` Hongbo Li
2025-01-21 12:16 ` Gao Xiang
2025-01-21 14:48 ` Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 4/4] erofs: introduce .fadvise for page cache share Hongzhen Luo
2025-01-05 15:12 ` Hongzhen Luo
2025-01-05 18:52 ` kernel test robot [this message]
2025-01-06 3:40 ` kernel test robot
2025-01-06 11:52 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202501060221.LPQZaeA4-lkp@intel.com \
--to=lkp@intel.com \
--cc=hongzhen@linux.alibaba.com \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.