Lines Matching refs:dev

17 static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)  in null_zone_no()  argument
19 return sect >> ilog2(dev->zone_size_sects); in null_zone_no()
22 static inline void null_lock_zone_res(struct nullb_device *dev) in null_lock_zone_res() argument
24 if (dev->need_zone_res_mgmt) in null_lock_zone_res()
25 spin_lock_irq(&dev->zone_res_lock); in null_lock_zone_res()
28 static inline void null_unlock_zone_res(struct nullb_device *dev) in null_unlock_zone_res() argument
30 if (dev->need_zone_res_mgmt) in null_unlock_zone_res()
31 spin_unlock_irq(&dev->zone_res_lock); in null_unlock_zone_res()
34 static inline void null_init_zone_lock(struct nullb_device *dev, in null_init_zone_lock() argument
37 if (!dev->memory_backed) in null_init_zone_lock()
43 static inline void null_lock_zone(struct nullb_device *dev, in null_lock_zone() argument
46 if (!dev->memory_backed) in null_lock_zone()
52 static inline void null_unlock_zone(struct nullb_device *dev, in null_unlock_zone() argument
55 if (!dev->memory_backed) in null_unlock_zone()
61 int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q) in null_init_zoned_dev() argument
68 if (!is_power_of_2(dev->zone_size)) { in null_init_zoned_dev()
72 if (dev->zone_size > dev->size) { in null_init_zoned_dev()
77 if (!dev->zone_capacity) in null_init_zoned_dev()
78 dev->zone_capacity = dev->zone_size; in null_init_zoned_dev()
80 if (dev->zone_capacity > dev->zone_size) { in null_init_zoned_dev()
82 dev->zone_capacity, dev->zone_size); in null_init_zoned_dev()
91 if (dev->zone_capacity != dev->zone_size && in null_init_zoned_dev()
92 dev->size & (dev->zone_size - 1)) { in null_init_zoned_dev()
97 zone_capacity_sects = mb_to_sects(dev->zone_capacity); in null_init_zoned_dev()
98 dev_capacity_sects = mb_to_sects(dev->size); in null_init_zoned_dev()
99 dev->zone_size_sects = mb_to_sects(dev->zone_size); in null_init_zoned_dev()
100 dev->nr_zones = round_up(dev_capacity_sects, dev->zone_size_sects) in null_init_zoned_dev()
101 >> ilog2(dev->zone_size_sects); in null_init_zoned_dev()
103 dev->zones = kvmalloc_array(dev->nr_zones, sizeof(struct nullb_zone), in null_init_zoned_dev()
105 if (!dev->zones) in null_init_zoned_dev()
108 spin_lock_init(&dev->zone_res_lock); in null_init_zoned_dev()
110 if (dev->zone_nr_conv >= dev->nr_zones) { in null_init_zoned_dev()
111 dev->zone_nr_conv = dev->nr_zones - 1; in null_init_zoned_dev()
113 dev->zone_nr_conv); in null_init_zoned_dev()
117 if (dev->zone_max_active >= dev->nr_zones - dev->zone_nr_conv) { in null_init_zoned_dev()
118 dev->zone_max_active = 0; in null_init_zoned_dev()
123 if (dev->zone_max_active && dev->zone_max_open > dev->zone_max_active) { in null_init_zoned_dev()
124 dev->zone_max_open = dev->zone_max_active; in null_init_zoned_dev()
126 dev->zone_max_open); in null_init_zoned_dev()
127 } else if (dev->zone_max_open >= dev->nr_zones - dev->zone_nr_conv) { in null_init_zoned_dev()
128 dev->zone_max_open = 0; in null_init_zoned_dev()
131 dev->need_zone_res_mgmt = dev->zone_max_active || dev->zone_max_open; in null_init_zoned_dev()
132 dev->imp_close_zone_no = dev->zone_nr_conv; in null_init_zoned_dev()
134 for (i = 0; i < dev->zone_nr_conv; i++) { in null_init_zoned_dev()
135 zone = &dev->zones[i]; in null_init_zoned_dev()
137 null_init_zone_lock(dev, zone); in null_init_zoned_dev()
139 zone->len = dev->zone_size_sects; in null_init_zoned_dev()
145 sector += dev->zone_size_sects; in null_init_zoned_dev()
148 for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) { in null_init_zoned_dev()
149 zone = &dev->zones[i]; in null_init_zoned_dev()
151 null_init_zone_lock(dev, zone); in null_init_zoned_dev()
153 if (zone->start + dev->zone_size_sects > dev_capacity_sects) in null_init_zoned_dev()
156 zone->len = dev->zone_size_sects; in null_init_zoned_dev()
162 sector += dev->zone_size_sects; in null_init_zoned_dev()
170 struct nullb_device *dev = nullb->dev; in null_register_zoned_dev() local
176 blk_queue_chunk_sectors(q, dev->zone_size_sects); in null_register_zoned_dev()
178 blk_queue_max_zone_append_sectors(q, dev->zone_size_sects); in null_register_zoned_dev()
179 disk_set_max_open_zones(nullb->disk, dev->zone_max_open); in null_register_zoned_dev()
180 disk_set_max_active_zones(nullb->disk, dev->zone_max_active); in null_register_zoned_dev()
188 void null_free_zoned_dev(struct nullb_device *dev) in null_free_zoned_dev() argument
190 kvfree(dev->zones); in null_free_zoned_dev()
191 dev->zones = NULL; in null_free_zoned_dev()
198 struct nullb_device *dev = nullb->dev; in null_report_zones() local
204 first_zone = null_zone_no(dev, sector); in null_report_zones()
205 if (first_zone >= dev->nr_zones) in null_report_zones()
208 nr_zones = min(nr_zones, dev->nr_zones - first_zone); in null_report_zones()
212 zone = &dev->zones[first_zone]; in null_report_zones()
220 null_lock_zone(dev, zone); in null_report_zones()
227 null_unlock_zone(dev, zone); in null_report_zones()
244 struct nullb_device *dev = nullb->dev; in null_zone_valid_read_len() local
245 struct nullb_zone *zone = &dev->zones[null_zone_no(dev, sector)]; in null_zone_valid_read_len()
259 static blk_status_t __null_close_zone(struct nullb_device *dev, in __null_close_zone() argument
267 dev->nr_zones_imp_open--; in __null_close_zone()
270 dev->nr_zones_exp_open--; in __null_close_zone()
282 dev->nr_zones_closed++; in __null_close_zone()
288 static void null_close_imp_open_zone(struct nullb_device *dev) in null_close_imp_open_zone() argument
293 zno = dev->imp_close_zone_no; in null_close_imp_open_zone()
294 if (zno >= dev->nr_zones) in null_close_imp_open_zone()
295 zno = dev->zone_nr_conv; in null_close_imp_open_zone()
297 for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) { in null_close_imp_open_zone()
298 zone = &dev->zones[zno]; in null_close_imp_open_zone()
300 if (zno >= dev->nr_zones) in null_close_imp_open_zone()
301 zno = dev->zone_nr_conv; in null_close_imp_open_zone()
304 __null_close_zone(dev, zone); in null_close_imp_open_zone()
305 dev->imp_close_zone_no = zno; in null_close_imp_open_zone()
311 static blk_status_t null_check_active(struct nullb_device *dev) in null_check_active() argument
313 if (!dev->zone_max_active) in null_check_active()
316 if (dev->nr_zones_exp_open + dev->nr_zones_imp_open + in null_check_active()
317 dev->nr_zones_closed < dev->zone_max_active) in null_check_active()
323 static blk_status_t null_check_open(struct nullb_device *dev) in null_check_open() argument
325 if (!dev->zone_max_open) in null_check_open()
328 if (dev->nr_zones_exp_open + dev->nr_zones_imp_open < dev->zone_max_open) in null_check_open()
331 if (dev->nr_zones_imp_open) { in null_check_open()
332 if (null_check_active(dev) == BLK_STS_OK) { in null_check_open()
333 null_close_imp_open_zone(dev); in null_check_open()
354 static blk_status_t null_check_zone_resources(struct nullb_device *dev, in null_check_zone_resources() argument
361 ret = null_check_active(dev); in null_check_zone_resources()
366 return null_check_open(dev); in null_check_zone_resources()
377 struct nullb_device *dev = cmd->nq->dev; in null_zone_write() local
378 unsigned int zno = null_zone_no(dev, sector); in null_zone_write()
379 struct nullb_zone *zone = &dev->zones[zno]; in null_zone_write()
390 null_lock_zone(dev, zone); in null_zone_write()
408 if (dev->queue_mode == NULL_Q_MQ) in null_zone_write()
424 null_lock_zone_res(dev); in null_zone_write()
426 ret = null_check_zone_resources(dev, zone); in null_zone_write()
428 null_unlock_zone_res(dev); in null_zone_write()
432 dev->nr_zones_closed--; in null_zone_write()
433 dev->nr_zones_imp_open++; in null_zone_write()
435 dev->nr_zones_imp_open++; in null_zone_write()
441 null_unlock_zone_res(dev); in null_zone_write()
450 null_lock_zone_res(dev); in null_zone_write()
452 dev->nr_zones_exp_open--; in null_zone_write()
454 dev->nr_zones_imp_open--; in null_zone_write()
456 null_unlock_zone_res(dev); in null_zone_write()
462 null_unlock_zone(dev, zone); in null_zone_write()
467 static blk_status_t null_open_zone(struct nullb_device *dev, in null_open_zone() argument
475 null_lock_zone_res(dev); in null_open_zone()
482 ret = null_check_zone_resources(dev, zone); in null_open_zone()
487 dev->nr_zones_imp_open--; in null_open_zone()
490 ret = null_check_zone_resources(dev, zone); in null_open_zone()
493 dev->nr_zones_closed--; in null_open_zone()
502 dev->nr_zones_exp_open++; in null_open_zone()
505 null_unlock_zone_res(dev); in null_open_zone()
510 static blk_status_t null_close_zone(struct nullb_device *dev, in null_close_zone() argument
518 null_lock_zone_res(dev); in null_close_zone()
519 ret = __null_close_zone(dev, zone); in null_close_zone()
520 null_unlock_zone_res(dev); in null_close_zone()
525 static blk_status_t null_finish_zone(struct nullb_device *dev, in null_finish_zone() argument
533 null_lock_zone_res(dev); in null_finish_zone()
540 ret = null_check_zone_resources(dev, zone); in null_finish_zone()
545 dev->nr_zones_imp_open--; in null_finish_zone()
548 dev->nr_zones_exp_open--; in null_finish_zone()
551 ret = null_check_zone_resources(dev, zone); in null_finish_zone()
554 dev->nr_zones_closed--; in null_finish_zone()
565 null_unlock_zone_res(dev); in null_finish_zone()
570 static blk_status_t null_reset_zone(struct nullb_device *dev, in null_reset_zone() argument
576 null_lock_zone_res(dev); in null_reset_zone()
581 null_unlock_zone_res(dev); in null_reset_zone()
584 dev->nr_zones_imp_open--; in null_reset_zone()
587 dev->nr_zones_exp_open--; in null_reset_zone()
590 dev->nr_zones_closed--; in null_reset_zone()
595 null_unlock_zone_res(dev); in null_reset_zone()
602 null_unlock_zone_res(dev); in null_reset_zone()
604 if (dev->memory_backed) in null_reset_zone()
605 return null_handle_discard(dev, zone->start, zone->len); in null_reset_zone()
613 struct nullb_device *dev = cmd->nq->dev; in null_zone_mgmt() local
620 for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) { in null_zone_mgmt()
621 zone = &dev->zones[i]; in null_zone_mgmt()
622 null_lock_zone(dev, zone); in null_zone_mgmt()
626 null_reset_zone(dev, zone); in null_zone_mgmt()
629 null_unlock_zone(dev, zone); in null_zone_mgmt()
634 zone_no = null_zone_no(dev, sector); in null_zone_mgmt()
635 zone = &dev->zones[zone_no]; in null_zone_mgmt()
637 null_lock_zone(dev, zone); in null_zone_mgmt()
647 ret = null_reset_zone(dev, zone); in null_zone_mgmt()
650 ret = null_open_zone(dev, zone); in null_zone_mgmt()
653 ret = null_close_zone(dev, zone); in null_zone_mgmt()
656 ret = null_finish_zone(dev, zone); in null_zone_mgmt()
667 null_unlock_zone(dev, zone); in null_zone_mgmt()
675 struct nullb_device *dev; in null_process_zoned_cmd() local
691 dev = cmd->nq->dev; in null_process_zoned_cmd()
692 zone = &dev->zones[null_zone_no(dev, sector)]; in null_process_zoned_cmd()
696 null_lock_zone(dev, zone); in null_process_zoned_cmd()
698 null_unlock_zone(dev, zone); in null_process_zoned_cmd()
706 static void null_set_zone_cond(struct nullb_device *dev, in null_set_zone_cond() argument
713 null_lock_zone(dev, zone); in null_set_zone_cond()
725 if (dev->memory_backed) in null_set_zone_cond()
726 null_handle_discard(dev, zone->start, zone->len); in null_set_zone_cond()
730 null_finish_zone(dev, zone); in null_set_zone_cond()
735 null_unlock_zone(dev, zone); in null_set_zone_cond()
742 ssize_t zone_cond_store(struct nullb_device *dev, const char *page, in zone_cond_store() argument
749 if (!dev->zoned) { in zone_cond_store()
754 if (!dev->zones) { in zone_cond_store()
763 zone_no = null_zone_no(dev, sector); in zone_cond_store()
764 if (zone_no >= dev->nr_zones) { in zone_cond_store()
769 if (dev->zones[zone_no].type == BLK_ZONE_TYPE_CONVENTIONAL) { in zone_cond_store()
774 null_set_zone_cond(dev, &dev->zones[zone_no], cond); in zone_cond_store()