* Re: [RFC PATCH 4/4] device-dax: Add a block device persistent type, BLK, for DAX KMEM
[not found] <Yulo96W5ofaJranB@memverge.com>
@ 2022-08-03 20:00 ` kernel test robot
2022-08-04 10:45 ` kernel test robot
1 sibling, 0 replies; 2+ messages in thread
From: kernel test robot @ 2022-08-03 20:00 UTC (permalink / raw)
To: Srinivas Aji; +Cc: llvm, kbuild-all
Hi Srinivas,
[FYI, it's a private test report for your RFC patch.]
[auto build test ERROR on linus/master]
[also build test ERROR on v5.19 next-20220802]
[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/Srinivas-Aji/Allow-persistent-data-on-DAX-device-being-used-as-KMEM/20220803-021320
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 0805c6fb39f66e01cb0adccfae8d9e0615c70fd7
config: x86_64-randconfig-a003 (https://download.01.org/0day-ci/archive/20220804/202208040329.87LkXtmz-lkp@intel.com/config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 495519e5f8232d144ed26e9c18dbcbac6a5f25eb)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/1d821cfc1cd5b2a7034ca77e84b59cf808b09a4f
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Srinivas-Aji/Allow-persistent-data-on-DAX-device-being-used-as-KMEM/20220803-021320
git checkout 1d821cfc1cd5b2a7034ca77e84b59cf808b09a4f
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/dax/
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/dax/kmem_blk.c:338:21: error: use of undeclared identifier 'QUEUE_FLAG_DISCARD'
blk_queue_flag_set(QUEUE_FLAG_DISCARD, disk->queue);
^
>> drivers/dax/kmem_blk.c:479:11: error: incompatible pointer types passing 'char[47]' to parameter of type 'const struct device *' [-Werror,-Wincompatible-pointer-types]
dev_err("KMEM not formatted for blk, magic %lx type %d\n",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:144:44: note: expanded from macro 'dev_err'
dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
^~~
include/linux/dev_printk.h:110:11: note: expanded from macro 'dev_printk_index_wrap'
_p_func(dev, fmt, ##__VA_ARGS__); \
^~~
include/linux/dev_printk.h:50:36: note: passing argument to parameter 'dev' here
void _dev_err(const struct device *dev, const char *fmt, ...);
^
>> drivers/dax/kmem_blk.c:480:4: error: incompatible integer to pointer conversion passing 'unsigned long' to parameter of type 'const char *' [-Wint-conversion]
super->header.magic, super->header.type);
^~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:144:57: note: expanded from macro 'dev_err'
dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
^~~
include/linux/dev_printk.h:19:22: note: expanded from macro 'dev_fmt'
#define dev_fmt(fmt) fmt
^~~
include/linux/dev_printk.h:110:16: note: expanded from macro 'dev_printk_index_wrap'
_p_func(dev, fmt, ##__VA_ARGS__); \
^~~
include/linux/dev_printk.h:50:53: note: passing argument to parameter 'fmt' here
void _dev_err(const struct device *dev, const char *fmt, ...);
^
3 errors generated.
vim +/QUEUE_FLAG_DISCARD +338 drivers/dax/kmem_blk.c
305
306
307
308
309
310 static int kmem_blk_disk_init(struct kmem_blk_data *data)
311 {
312 struct gendisk *disk;
313 int err;
314
315 disk = blk_alloc_disk(data->dev_dax->target_node);
316 data->disk = disk;
317
318 disk->flags = GENHD_FL_NO_PART;
319 disk->fops = &kmem_blk_fops;
320 disk->private_data = data;
321 snprintf(disk->disk_name, DISK_NAME_LEN, "kmem%d",
322 data->dev_dax->target_node);
323
324 set_capacity(disk,
325 data->super->num_index_entries << PAGE_SECTORS_SHIFT);
326
327 // TODO: Handle cases where PAGE_SIZE is too big.
328 /* Set physical and logical block size to PAGE_SIZE */
329 blk_queue_physical_block_size(disk->queue, PAGE_SIZE);
330 blk_queue_logical_block_size(disk->queue, PAGE_SIZE);
331
332 /* Tell the block layer that this is not a rotational device */
333 blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue);
334 /* Don't use this for randomness */
335 blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, disk->queue);
336
337 /* Support discard */
> 338 blk_queue_flag_set(QUEUE_FLAG_DISCARD, disk->queue);
339 disk->queue->limits.discard_granularity = PAGE_SIZE;
340 blk_queue_max_discard_sectors(disk->queue, UINT_MAX);
341 /* We can handle WRITE_ZEROES as DISCARD, at units of page size */
342 blk_queue_max_write_zeroes_sectors(disk->queue, UINT_MAX);
343
344 err = add_disk(disk);
345 if (err)
346 goto out_cleanup_disk;
347
348 return 0;
349 out_cleanup_disk:
350 blk_cleanup_disk(data->disk);
351 data->disk = NULL;
352 return err;
353 }
354
355
356 static void kmem_blk_disk_cleanup(struct kmem_blk_data *data)
357 {
358 if (data->disk == NULL)
359 return;
360 del_gendisk(data->disk);
361 blk_cleanup_disk(data->disk);
362 data->disk = NULL;
363 }
364
365 /* Format device with full allocation */
366 static int kmem_blk_format(struct dev_dax *dev_dax)
367 {
368 struct kmem_blk_super *super =
369 kmap_local_page(dax_kmem_index_to_page(0, dev_dax));
370
371 unsigned long num_pages = dax_kmem_num_pages(dev_dax);
372 u64 i;
373 /*
374 * c = a / b => c is largest c s.t. c * b <= a.
375 * c = (a + b - 1) / b is smallest c s.t. c * b >= a
376 * num_index_pages is the largest number such that
377 * 1 + num_index_pages + num_index_pages * index_entries_per_page >= num_pages
378 * num_index_pages *(1 + index_entries_per_page) >= num_pages - 1
379 * num_index_pages =
380 * ((num_pages - 1) + (1 + index_entries_per_page) - 1 ) /
381 * (1 + index_entries_per_page)
382 */
383 u64 num_index_pages =
384 (num_pages + index_entries_per_page - 1) /
385 (1 + index_entries_per_page);
386 super->header.magic = kmem_persist_magic;
387 super->header.type = KMEM_PERSIST_BLK;
388 super->num_index_pages = num_index_pages;
389 super->num_index_entries = num_pages - 1 - num_index_pages;
390
391 for (i = 0; i < num_index_pages; i++) {
392 u64 *index_array =
393 kmap_local_page(dax_kmem_index_to_page(1 + i, dev_dax));
394 #if !defined(KMEM_PERSIST_BLK_FORMAT_FULL)
395 memset(index_array, 0, PAGE_SIZE);
396 #else /* KMEM_PERSIST_BLK_FORMAT_FULL */
397 u64 j;
398
399 for (j = 0; j < index_entries_per_page; j++) {
400 u64 idx =
401 1 + num_index_pages +
402 i * index_entries_per_page + j;
403
404 if (idx >= num_pages)
405 idx = 0;
406 index_array[j] = idx;
407 }
408 #endif
409 kunmap_local(index_array);
410 }
411 kunmap_local(super);
412 return 0;
413 }
414
415 /* Free unused blocks in the dax memory to system */
416 static int kmem_blk_free_unused(struct kmem_blk_data *data)
417 {
418 struct kmem_blk_super *super = data->super;
419 unsigned long num_pages = dax_kmem_num_pages(data->dev_dax);
420 u64 *alloc_bitmap;
421 unsigned long i;
422
423 /* Bitmap for tracking allocated pages. Temporary */
424 alloc_bitmap =
425 kvzalloc(sizeof(u64) * BITS_TO_U64(num_pages), GFP_KERNEL);
426 if (alloc_bitmap == NULL) {
427 dev_err(&data->dev_dax->dev,
428 "Unable to allocate bit array. Not freeing unused space.\n");
429 return -ENOMEM;
430 }
431
432 /* Free up pages unused by block storage to memory */
433 for (i = 0; i < super->num_index_entries; i++) {
434 u64 page_num = data->index_page
435 [i / index_entries_per_page]
436 [i % index_entries_per_page];
437
438 if (page_num != 0) {
439 BUG_ON(page_num < 1 + super->num_index_pages ||
440 page_num >= num_pages);
441 /* Set bit */
442 alloc_bitmap[page_num / 64] |= 1 << (page_num % 64);
443 }
444 }
445
446 for (i = 1 + super->num_index_pages; i < num_pages; i++) {
447 struct page *page;
448
449 if (!(alloc_bitmap[i / 64] & (1 << (i % 64)))) {
450 /* Bit clear. Page not used */
451 page = dax_kmem_index_to_page(i, data->dev_dax);
452 __free_page(page);
453 }
454 }
455
456 kvfree(alloc_bitmap);
457 return 0;
458 }
459
460 static int kmem_blk_probe(struct dev_dax *dev_dax, void **persist_data)
461 {
462 struct device *dev = &dev_dax->dev;
463 struct kmem_blk_super *super;
464 unsigned long i;
465 struct kmem_blk_data *data;
466 unsigned long num_pages = dax_kmem_num_pages(dev_dax);
467
468 if (num_pages == 0) {
469 dev_err(dev, "Dax device for KMEM has no pages\n");
470 *persist_data = NULL;
471 return -1;
472 }
473
474 super = kmap(dax_kmem_index_to_page(0, dev_dax));
475
476 /* Validate superblock magic and type */
477 if (super->header.magic != kmem_persist_magic ||
478 super->header.type != KMEM_PERSIST_BLK) {
> 479 dev_err("KMEM not formatted for blk, magic %lx type %d\n",
> 480 super->header.magic, super->header.type);
481 kunmap(dax_kmem_index_to_page(0, dev_dax));
482 *persist_data = NULL;
483 return -EINVAL;
484 }
485
486 /* Validate superblock index page counts */
487 if (super->num_index_entries <=
488 super->num_index_pages * index_entries_per_page &&
489 1 + super->num_index_pages + super->num_index_entries
490 == num_pages) {
491 dev_info(dev,
492 "Found kmem_blk superblock num_index_entries %llu num_index_pages %llu num_pages %lu\n",
493 super->num_index_entries,
494 super->num_index_pages, num_pages);
495 } else {
496 dev_warn(dev,
497 "Invalid kmem_blk superblock num_index_entries %llu num_index_pages %llu num_pages %lu\n",
498 super->num_index_entries,
499 super->num_index_pages, num_pages);
500 kunmap(dax_kmem_index_to_page(0, dev_dax));
501 *persist_data = NULL;
502 return -EINVAL;
503 }
504
505 data = kzalloc(struct_size(data, index_page, super->num_index_pages),
506 GFP_KERNEL);
507 if (!data) {
508 kunmap(dax_kmem_index_to_page(0, dev_dax));
509 *persist_data = NULL;
510 return -ENOMEM;
511 }
512
513 *persist_data = data;
514 data->dev_dax = dev_dax;
515 data->super = super;
516 spin_lock_init(&data->index_lock);
517
518 for (i = 0; i < super->num_index_pages; i++)
519 data->index_page[i] =
520 kmap(dax_kmem_index_to_page(i + 1, dev_dax));
521
522 kmem_blk_free_unused(data);
523
524 kmem_blk_disk_init(data);
525
526 return 0;
527 }
528
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [RFC PATCH 4/4] device-dax: Add a block device persistent type, BLK, for DAX KMEM
[not found] <Yulo96W5ofaJranB@memverge.com>
2022-08-03 20:00 ` [RFC PATCH 4/4] device-dax: Add a block device persistent type, BLK, for DAX KMEM kernel test robot
@ 2022-08-04 10:45 ` kernel test robot
1 sibling, 0 replies; 2+ messages in thread
From: kernel test robot @ 2022-08-04 10:45 UTC (permalink / raw)
To: Srinivas Aji; +Cc: llvm, kbuild-all
Hi Srinivas,
[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on linus/master]
[also build test WARNING on v5.19 next-20220803]
[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/Srinivas-Aji/Allow-persistent-data-on-DAX-device-being-used-as-KMEM/20220803-021320
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 0805c6fb39f66e01cb0adccfae8d9e0615c70fd7
config: s390-buildonly-randconfig-r005-20220804 (https://download.01.org/0day-ci/archive/20220804/202208041827.gXLXUdlo-lkp@intel.com/config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 26dd42705c2af0b8f6e5d6cdb32c9bd5ed9524eb)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install s390 cross compiling tool for clang build
# apt-get install binutils-s390x-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/1d821cfc1cd5b2a7034ca77e84b59cf808b09a4f
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Srinivas-Aji/Allow-persistent-data-on-DAX-device-being-used-as-KMEM/20220803-021320
git checkout 1d821cfc1cd5b2a7034ca77e84b59cf808b09a4f
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash drivers/dax/
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
drivers/dax/kmem_blk.c:338:21: error: use of undeclared identifier 'QUEUE_FLAG_DISCARD'
blk_queue_flag_set(QUEUE_FLAG_DISCARD, disk->queue);
^
>> drivers/dax/kmem_blk.c:479:3: warning: pointer/integer type mismatch in conditional expression ('unsigned long' and 'void *') [-Wconditional-type-mismatch]
dev_err("KMEM not formatted for blk, magic %lx type %d\n",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:144:2: note: expanded from macro 'dev_err'
dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:109:3: note: expanded from macro 'dev_printk_index_wrap'
dev_printk_index_emit(level, fmt); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:105:2: note: expanded from macro 'dev_printk_index_emit'
printk_index_subsys_emit("%s %s: ", level, fmt)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/printk.h:431:2: note: expanded from macro 'printk_index_subsys_emit'
__printk_index_emit(fmt, level, subsys_fmt_prefix)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/printk.h:397:39: note: expanded from macro '__printk_index_emit'
.fmt = __builtin_constant_p(_fmt) ? (_fmt) : NULL, \
^ ~~~~~~ ~~~~
drivers/dax/kmem_blk.c:479:11: error: incompatible pointer types passing 'char[47]' to parameter of type 'const struct device *' [-Werror,-Wincompatible-pointer-types]
dev_err("KMEM not formatted for blk, magic %lx type %d\n",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:144:44: note: expanded from macro 'dev_err'
dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
^~~
include/linux/dev_printk.h:110:11: note: expanded from macro 'dev_printk_index_wrap'
_p_func(dev, fmt, ##__VA_ARGS__); \
^~~
include/linux/dev_printk.h:50:36: note: passing argument to parameter 'dev' here
void _dev_err(const struct device *dev, const char *fmt, ...);
^
drivers/dax/kmem_blk.c:480:4: error: incompatible integer to pointer conversion passing 'unsigned long' to parameter of type 'const char *' [-Wint-conversion]
super->header.magic, super->header.type);
^~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:144:57: note: expanded from macro 'dev_err'
dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
^~~
include/linux/dev_printk.h:19:22: note: expanded from macro 'dev_fmt'
#define dev_fmt(fmt) fmt
^~~
include/linux/dev_printk.h:110:16: note: expanded from macro 'dev_printk_index_wrap'
_p_func(dev, fmt, ##__VA_ARGS__); \
^~~
include/linux/dev_printk.h:50:53: note: passing argument to parameter 'fmt' here
void _dev_err(const struct device *dev, const char *fmt, ...);
^
1 warning and 3 errors generated.
vim +479 drivers/dax/kmem_blk.c
459
460 static int kmem_blk_probe(struct dev_dax *dev_dax, void **persist_data)
461 {
462 struct device *dev = &dev_dax->dev;
463 struct kmem_blk_super *super;
464 unsigned long i;
465 struct kmem_blk_data *data;
466 unsigned long num_pages = dax_kmem_num_pages(dev_dax);
467
468 if (num_pages == 0) {
469 dev_err(dev, "Dax device for KMEM has no pages\n");
470 *persist_data = NULL;
471 return -1;
472 }
473
474 super = kmap(dax_kmem_index_to_page(0, dev_dax));
475
476 /* Validate superblock magic and type */
477 if (super->header.magic != kmem_persist_magic ||
478 super->header.type != KMEM_PERSIST_BLK) {
> 479 dev_err("KMEM not formatted for blk, magic %lx type %d\n",
480 super->header.magic, super->header.type);
481 kunmap(dax_kmem_index_to_page(0, dev_dax));
482 *persist_data = NULL;
483 return -EINVAL;
484 }
485
486 /* Validate superblock index page counts */
487 if (super->num_index_entries <=
488 super->num_index_pages * index_entries_per_page &&
489 1 + super->num_index_pages + super->num_index_entries
490 == num_pages) {
491 dev_info(dev,
492 "Found kmem_blk superblock num_index_entries %llu num_index_pages %llu num_pages %lu\n",
493 super->num_index_entries,
494 super->num_index_pages, num_pages);
495 } else {
496 dev_warn(dev,
497 "Invalid kmem_blk superblock num_index_entries %llu num_index_pages %llu num_pages %lu\n",
498 super->num_index_entries,
499 super->num_index_pages, num_pages);
500 kunmap(dax_kmem_index_to_page(0, dev_dax));
501 *persist_data = NULL;
502 return -EINVAL;
503 }
504
505 data = kzalloc(struct_size(data, index_page, super->num_index_pages),
506 GFP_KERNEL);
507 if (!data) {
508 kunmap(dax_kmem_index_to_page(0, dev_dax));
509 *persist_data = NULL;
510 return -ENOMEM;
511 }
512
513 *persist_data = data;
514 data->dev_dax = dev_dax;
515 data->super = super;
516 spin_lock_init(&data->index_lock);
517
518 for (i = 0; i < super->num_index_pages; i++)
519 data->index_page[i] =
520 kmap(dax_kmem_index_to_page(i + 1, dev_dax));
521
522 kmem_blk_free_unused(data);
523
524 kmem_blk_disk_init(data);
525
526 return 0;
527 }
528
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-08-04 10:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <Yulo96W5ofaJranB@memverge.com>
2022-08-03 20:00 ` [RFC PATCH 4/4] device-dax: Add a block device persistent type, BLK, for DAX KMEM kernel test robot
2022-08-04 10:45 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox