* [dhowells-fs:netfs-next-3 12/13] lib/tests/kunit_bvecq.c:190:undefined reference to `bvecq_put'
@ 2026-10-15 2:14 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-10-15 2:14 UTC (permalink / raw)
To: David Howells; +Cc: oe-kbuild-all
tree: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git netfs-next-3
head: d43a7f2a38d9f9e2d1db0b79681d6b4bfe766738
commit: 56e1580c38e2bb8b44a40513f3756e78e2823d41 [12/13] iov_iter: Add a bvecq kunit test
config: sparc-randconfig-2000-20261015 (https://download.01.org/0day-ci/archive/20261015/202610150437.fT140VhX-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 13.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261015/202610150437.fT140VhX-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/202610150437.fT140VhX-lkp@intel.com/
All errors (new ones prefixed by >>):
sparc64-linux-ld: lib/tests/kunit_bvecq.o: in function `bvecq_kunit_bvecq_put':
>> lib/tests/kunit_bvecq.c:190:(.text+0x28): undefined reference to `bvecq_put'
sparc64-linux-ld: lib/tests/kunit_bvecq.o: in function `bvecq_kunit_load_chain':
>> lib/tests/kunit_bvecq.c:297:(.init.text+0xb0): undefined reference to `bvecq_alloc_one'
vim +190 lib/tests/kunit_bvecq.c
187
188 static void bvecq_kunit_bvecq_put(void *data)
189 {
> 190 bvecq_put(data);
191 }
192
193 /*
194 * Calculate the fill pattern, for a particular byte of a particular subpage of
195 * a particular folio.
196 */
197 static inline u8 bvecq_kunit_pattern(unsigned int folio, int subpage, int offset)
198 {
199 int fill_step = bvecq_kunit_fills[folio];
200
201 return (subpage + offset * fill_step) & 0xff;
202 }
203
204 /*
205 * Calculate the fill pattern, given the 'byte position' in the bvecq chain.
206 * This looks up the folio, subpage and offset from a table generated whilst
207 * the bvecq is being assembled.
208 */
209 static inline u8 bvecq_kunit_predict(struct kunit *test, size_t pos)
210 {
211 size_t last_pos = 0;
212
213 for (int i = 0; i < bvecq_kunit_pagemap_nr; i++) {
214 if (pos < bvecq_kunit_pagemap[i].pos)
215 return bvecq_kunit_pattern(bvecq_kunit_pagemap[i].folio,
216 bvecq_kunit_pagemap[i].subpage,
217 bvecq_kunit_pagemap[i].offset + (pos - last_pos));
218 last_pos = bvecq_kunit_pagemap[i].pos;
219 }
220
221 KUNIT_FAIL(test, "Overran pagemap pos=%zx\n", pos);
222 return 0;
223 }
224
225 /*
226 * Determine which page we're looking at, taking all the folios to be split
227 * into pages. This can be used to determine what iov_iter_npages() will say.
228 */
229 static inline int bvecq_kunit_pos2page(struct kunit *test, size_t pos)
230 {
231 for (int i = 0; i < bvecq_kunit_pagemap_nr; i++)
232 if (pos < bvecq_kunit_pagemap[i].pos)
233 return i;
234
235 if (pos > bvecq_kunit_pagemap[bvecq_kunit_pagemap_nr - 1].pos)
236 KUNIT_FAIL(test, "Overran pagemap pos=%zx\n", pos);
237 return bvecq_kunit_pagemap_nr;
238 }
239
240 /*
241 * Allocate a variety of folios of different orders and fill them with the
242 * pattern set for each folio.
243 */
244 static void __init iov_bvecq_alloc_folios(struct kunit *test)
245 {
246 struct folio *folio, **folios = bvecq_kunit_folios;
247 const int nr = ARRAY_SIZE(bvecq_kunit_folios);
248
249 bvecq_kunit_pagemap_nr = 0;
250 memset(bvecq_kunit_pagemap, 0, sizeof(bvecq_kunit_pagemap));
251 memset(bvecq_kunit_folios, 0, sizeof(bvecq_kunit_folios));
252
253 for (int i = 0; i < nr; i++) {
254 folio = folio_alloc(GFP_KERNEL, bvecq_kunit_orders[i]);
255 KUNIT_ASSERT_NOT_NULL(test, folio);
256 folios[i] = folio;
257
258 /* Fill each subpage with a different but predictable pattern. */
259 for (int j = 0; j < folio_nr_pages(folio); j++) {
260 u8 *p = kmap_local_folio(folio, PAGE_SIZE * j);
261
262 for (int k = 0; k < PAGE_SIZE; k++)
263 p[k] = bvecq_kunit_pattern(i, j, k);
264 kunmap_local(p);
265 }
266 }
267
268 kunit_add_action_or_reset(test, bvecq_kunit_release_folios, folios);
269 }
270
271 /*
272 * Follow the specified recipe to allocate a bvecq chain and stick the folios
273 * and empty gaps into it. Further, the offset into and length of each folio
274 * is adjusted from the partials list. Each ALLOC command will append a new
275 * bvecq to the chain and move to filling that.
276 */
277 static struct bvecq *__init bvecq_kunit_load_chain(struct kunit *test,
278 const struct bvecq_test_recipe *rec,
279 const struct bvecq_test_partials *parts,
280 size_t *size)
281 {
282 struct bvecq *head = NULL, *bq = NULL, *p;
283 size_t pos = 0;
284 int folio_index = 0;
285
286 *size = 0;
287
288 for (; rec->cmd != BVECQ_KUNIT_STOP; rec++) {
289 if (!head)
290 KUNIT_ASSERT_EQ(test, rec->cmd, BVECQ_KUNIT_ALLOC);
291
292 switch (rec->cmd) {
293 case BVECQ_KUNIT_STOP:
294 break;
295
296 case BVECQ_KUNIT_ALLOC:
> 297 p = bvecq_alloc_one(rec->count, GFP_KERNEL, false);
298 KUNIT_ASSERT_NOT_NULL(test, p);
299
300 if (!head) {
301 head = p;
302 kunit_add_action_or_reset(test, bvecq_kunit_bvecq_put, head);
303 bq = p;
304 } else {
305 bvecq_append(bq, p);
306 bq = p;
307 }
308 break;
309
310 case BVECQ_KUNIT_LOAD:
311 KUNIT_ASSERT_LE(test, folio_index + rec->count, ARRAY_SIZE(bvecq_kunit_orders));
312 KUNIT_ASSERT_LE(test, bq->nr_slots + rec->count, bq->max_slots);
313 for (int i = 0; i < rec->count; i++) {
314 struct folio *folio = bvecq_kunit_folios[folio_index];
315 size_t flen = PAGE_SIZE << bvecq_kunit_orders[folio_index];
316 size_t foff = 0;
317
318 KUNIT_ASSERT_LE(test,
319 parts[folio_index].add_start +
320 parts[folio_index].sub_end,
321 flen);
322
323 foff += parts[folio_index].add_start;
324 flen -= parts[folio_index].add_start;
325 flen -= parts[folio_index].sub_end;
326
327 bvec_set_page(&bq->bv[bq->nr_slots + i], folio_page(folio, 0), flen, foff);
328 *size += flen;
329
330 for (int j = 0; j < folio_nr_pages(folio); j++) {
331 size_t part;
332
333 if (foff >= PAGE_SIZE) {
334 foff -= PAGE_SIZE;
335 continue;
336 }
337 part = min(flen, PAGE_SIZE - foff);
338 pos += part;
339 bvecq_kunit_pagemap[bvecq_kunit_pagemap_nr].pos = pos;
340 bvecq_kunit_pagemap[bvecq_kunit_pagemap_nr].folio = folio_index;
341 bvecq_kunit_pagemap[bvecq_kunit_pagemap_nr].subpage = j;
342 bvecq_kunit_pagemap[bvecq_kunit_pagemap_nr].offset = foff;
343 bvecq_kunit_pagemap_nr++;
344 flen -= part;
345 if (!flen)
346 break;
347 foff = 0;
348 }
349
350 folio_index++;
351 }
352 bvecq_filled_to(bq, bq->nr_slots + rec->count);
353 break;
354
355 case BVECQ_KUNIT_EMPTY:
356 KUNIT_ASSERT_LE(test, bq->nr_slots + rec->count, bq->max_slots);
357 for (int i = 0; i < rec->count; i++) {
358 bq->bv[bq->nr_slots + i].bv_page = ERR_PTR(-EIO);
359 bq->bv[bq->nr_slots + i].bv_offset = 0;
360 bq->bv[bq->nr_slots + i].bv_len = 0;
361 }
362 bvecq_filled_to(bq, bq->nr_slots + rec->count);
363 break;
364 }
365 }
366
367 return head;
368 }
369
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-10-15 2:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-15 2:14 [dhowells-fs:netfs-next-3 12/13] lib/tests/kunit_bvecq.c:190:undefined reference to `bvecq_put' kernel test robot
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.