Thread (1 message) 1 message, 1 author, 2021-01-29

Re: [block:block-5.11 35/35] drivers/block/null_blk/zoned.c:86: undefined reference to `__udivdi3'

From: Damien Le Moal <hidden>
Date: 2021-01-29 04:16:59

On 2021/01/29 13:11, kernel test robot wrote:
tree:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git block-5.11
head:   e1aa139c97ef1fa60cbdd2b6e1d40e4fe182068d
commit: e1aa139c97ef1fa60cbdd2b6e1d40e4fe182068d [35/35] null_blk: cleanup zoned mode initialization
config: i386-randconfig-r004-20210128 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git/commit/?id=e1aa139c97ef1fa60cbdd2b6e1d40e4fe182068d
        git remote add block https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
        git fetch --no-tags block block-5.11
        git checkout e1aa139c97ef1fa60cbdd2b6e1d40e4fe182068d
        # save the attached .config to linux build tree
        make W=1 ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>

All errors (new ones prefixed by >>):

   ld: drivers/block/null_blk/zoned.o: in function `null_init_zoned_dev':
quoted
quoted
drivers/block/null_blk/zoned.c:86: undefined reference to `__udivdi3'
Jens,

Arg. 64-bit div on 32-bit arch... Forgot about that one.
I can send a fixed v2 or an incremental fix patch. Which do you prefer ?

vim +86 drivers/block/null_blk/zoned.c

    57	
    58	int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
    59	{
    60		sector_t dev_capacity_sects, zone_capacity_sects;
    61		struct nullb_zone *zone;
    62		sector_t sector = 0;
    63		unsigned int i;
    64	
    65		if (!is_power_of_2(dev->zone_size)) {
    66			pr_err("zone_size must be power-of-two\n");
    67			return -EINVAL;
    68		}
    69		if (dev->zone_size > dev->size) {
    70			pr_err("Zone size larger than device capacity\n");
    71			return -EINVAL;
    72		}
    73	
    74		if (!dev->zone_capacity)
    75			dev->zone_capacity = dev->zone_size;
    76	
    77		if (dev->zone_capacity > dev->zone_size) {
    78			pr_err("null_blk: zone capacity (%lu MB) larger than zone size (%lu MB)\n",
    79						dev->zone_capacity, dev->zone_size);
    80			return -EINVAL;
    81		}
    82	
    83		zone_capacity_sects = mb_to_sects(dev->zone_capacity);
    84		dev_capacity_sects = mb_to_sects(dev->size);
    85		dev->zone_size_sects = mb_to_sects(dev->zone_size);
  > 86		dev->nr_zones = DIV_ROUND_UP(dev_capacity_sects, dev->zone_size_sects);
    87	
    88		dev->zones = kvmalloc_array(dev->nr_zones, sizeof(struct nullb_zone),
    89					    GFP_KERNEL | __GFP_ZERO);
    90		if (!dev->zones)
    91			return -ENOMEM;
    92	
    93		spin_lock_init(&dev->zone_res_lock);
    94	
    95		if (dev->zone_nr_conv >= dev->nr_zones) {
    96			dev->zone_nr_conv = dev->nr_zones - 1;
    97			pr_info("changed the number of conventional zones to %u",
    98				dev->zone_nr_conv);
    99		}
   100	
   101		/* Max active zones has to be < nbr of seq zones in order to be enforceable */
   102		if (dev->zone_max_active >= dev->nr_zones - dev->zone_nr_conv) {
   103			dev->zone_max_active = 0;
   104			pr_info("zone_max_active limit disabled, limit >= zone count\n");
   105		}
   106	
   107		/* Max open zones has to be <= max active zones */
   108		if (dev->zone_max_active && dev->zone_max_open > dev->zone_max_active) {
   109			dev->zone_max_open = dev->zone_max_active;
   110			pr_info("changed the maximum number of open zones to %u\n",
   111				dev->nr_zones);
   112		} else if (dev->zone_max_open >= dev->nr_zones - dev->zone_nr_conv) {
   113			dev->zone_max_open = 0;
   114			pr_info("zone_max_open limit disabled, limit >= zone count\n");
   115		}
   116		dev->need_zone_res_mgmt = dev->zone_max_active || dev->zone_max_open;
   117		dev->imp_close_zone_no = dev->zone_nr_conv;
   118	
   119		for (i = 0; i <  dev->zone_nr_conv; i++) {
   120			zone = &dev->zones[i];
   121	
   122			null_init_zone_lock(dev, zone);
   123			zone->start = sector;
   124			zone->len = dev->zone_size_sects;
   125			zone->capacity = zone->len;
   126			zone->wp = zone->start + zone->len;
   127			zone->type = BLK_ZONE_TYPE_CONVENTIONAL;
   128			zone->cond = BLK_ZONE_COND_NOT_WP;
   129	
   130			sector += dev->zone_size_sects;
   131		}
   132	
   133		for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) {
   134			zone = &dev->zones[i];
   135	
   136			null_init_zone_lock(dev, zone);
   137			zone->start = zone->wp = sector;
   138			if (zone->start + dev->zone_size_sects > dev_capacity_sects)
   139				zone->len = dev_capacity_sects - zone->start;
   140			else
   141				zone->len = dev->zone_size_sects;
   142			zone->capacity =
   143				min_t(sector_t, zone->len, zone_capacity_sects);
   144			zone->type = BLK_ZONE_TYPE_SEQWRITE_REQ;
   145			zone->cond = BLK_ZONE_COND_EMPTY;
   146	
   147			sector += dev->zone_size_sects;
   148		}
   149	
   150		q->limits.zoned = BLK_ZONED_HM;
   151		blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
   152		blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
   153	
   154		return 0;
   155	}
   156	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

-- 
Damien Le Moal
Western Digital Research
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help