drivers/block/null_blk/main.c
1002
return __null_lookup_page(nullb, sector, for_write, false);
drivers/block/null_blk/main.c
1005
static struct nullb_page *null_insert_page(struct nullb *nullb,
drivers/block/null_blk/main.c
1007
__releases(&nullb->lock)
drivers/block/null_blk/main.c
1008
__acquires(&nullb->lock)
drivers/block/null_blk/main.c
1013
t_page = null_lookup_page(nullb, sector, true, ignore_cache);
drivers/block/null_blk/main.c
1017
spin_unlock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1026
spin_lock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1029
t_page = null_radix_tree_insert(nullb, idx, t_page, !ignore_cache);
drivers/block/null_blk/main.c
1036
spin_lock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1037
return null_lookup_page(nullb, sector, true, ignore_cache);
drivers/block/null_blk/main.c
1040
static int null_flush_cache_page(struct nullb *nullb, struct nullb_page *c_page)
drivers/block/null_blk/main.c
1050
t_page = null_insert_page(nullb, idx << PAGE_SECTORS_SHIFT, true);
drivers/block/null_blk/main.c
1056
ret = radix_tree_delete_item(&nullb->dev->data,
drivers/block/null_blk/main.c
1070
i += (nullb->dev->blocksize >> SECTOR_SHIFT)) {
drivers/block/null_blk/main.c
1074
nullb->dev->blocksize);
drivers/block/null_blk/main.c
1082
ret = radix_tree_delete_item(&nullb->dev->cache, idx, c_page);
drivers/block/null_blk/main.c
1084
nullb->dev->curr_cache -= PAGE_SIZE;
drivers/block/null_blk/main.c
1089
static int null_make_cache_space(struct nullb *nullb, unsigned long n)
drivers/block/null_blk/main.c
1096
if ((nullb->dev->cache_size * 1024 * 1024) >
drivers/block/null_blk/main.c
1097
nullb->dev->curr_cache + n || nullb->dev->curr_cache == 0)
drivers/block/null_blk/main.c
1100
nr_pages = radix_tree_gang_lookup(&nullb->dev->cache,
drivers/block/null_blk/main.c
1101
(void **)c_pages, nullb->cache_flush_pos, FREE_BATCH);
drivers/block/null_blk/main.c
1107
nullb->cache_flush_pos = c_pages[i]->page->private;
drivers/block/null_blk/main.c
1122
err = null_flush_cache_page(nullb, c_pages[i]);
drivers/block/null_blk/main.c
1131
nullb->cache_flush_pos = 0;
drivers/block/null_blk/main.c
1134
spin_unlock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1135
spin_lock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1142
static blk_status_t copy_to_nullb(struct nullb *nullb, void *source,
drivers/block/null_blk/main.c
1150
temp = min3(nullb->dev->blocksize, n - count,
drivers/block/null_blk/main.c
1154
if (null_cache_active(nullb) && !is_fua)
drivers/block/null_blk/main.c
1155
null_make_cache_space(nullb, PAGE_SIZE);
drivers/block/null_blk/main.c
1157
t_page = null_insert_page(nullb, sector,
drivers/block/null_blk/main.c
1158
!null_cache_active(nullb) || is_fua);
drivers/block/null_blk/main.c
1168
null_free_sector(nullb, sector, true);
drivers/block/null_blk/main.c
1176
static void copy_from_nullb(struct nullb *nullb, void *dest, loff_t pos,
drivers/block/null_blk/main.c
1184
temp = min3(nullb->dev->blocksize, n - count,
drivers/block/null_blk/main.c
1188
t_page = null_lookup_page(nullb, sector, false,
drivers/block/null_blk/main.c
1189
!null_cache_active(nullb));
drivers/block/null_blk/main.c
1204
struct nullb *nullb = dev->nullb;
drivers/block/null_blk/main.c
1208
spin_lock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1211
null_free_sector(nullb, sector, false);
drivers/block/null_blk/main.c
1212
if (null_cache_active(nullb))
drivers/block/null_blk/main.c
1213
null_free_sector(nullb, sector, true);
drivers/block/null_blk/main.c
1217
spin_unlock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1222
static blk_status_t null_handle_flush(struct nullb *nullb)
drivers/block/null_blk/main.c
1226
if (!null_cache_active(nullb))
drivers/block/null_blk/main.c
1229
spin_lock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1231
err = null_make_cache_space(nullb,
drivers/block/null_blk/main.c
1232
nullb->dev->cache_size * 1024 * 1024);
drivers/block/null_blk/main.c
1233
if (err || nullb->dev->curr_cache == 0)
drivers/block/null_blk/main.c
1237
WARN_ON(!radix_tree_empty(&nullb->dev->cache));
drivers/block/null_blk/main.c
1238
spin_unlock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1242
static blk_status_t null_transfer(struct nullb *nullb, struct page *page,
drivers/block/null_blk/main.c
1246
struct nullb_device *dev = nullb->dev;
drivers/block/null_blk/main.c
1254
valid_len = null_zone_valid_read_len(nullb,
drivers/block/null_blk/main.c
1261
copy_from_nullb(nullb, p, pos, valid_len);
drivers/block/null_blk/main.c
1271
err = copy_to_nullb(nullb, p, pos, len, is_fua);
drivers/block/null_blk/main.c
1286
struct nullb *nullb = cmd->nq->dev->nullb;
drivers/block/null_blk/main.c
1295
spin_lock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1300
err = null_transfer(nullb, bvec.bv_page, len, bvec.bv_offset,
drivers/block/null_blk/main.c
1310
spin_unlock_irq(&nullb->lock);
drivers/block/null_blk/main.c
1318
struct nullb *nullb = dev->nullb;
drivers/block/null_blk/main.c
1322
if (!hrtimer_active(&nullb->bw_timer))
drivers/block/null_blk/main.c
1323
hrtimer_restart(&nullb->bw_timer);
drivers/block/null_blk/main.c
1325
if (atomic_long_sub_return(blk_rq_bytes(rq), &nullb->cur_bytes) < 0) {
drivers/block/null_blk/main.c
1326
blk_mq_stop_hw_queues(nullb->q);
drivers/block/null_blk/main.c
1328
if (atomic_long_read(&nullb->cur_bytes) > 0)
drivers/block/null_blk/main.c
1329
blk_mq_start_stopped_hw_queues(nullb->q, true);
drivers/block/null_blk/main.c
1446
struct nullb *nullb = dev->nullb;
drivers/block/null_blk/main.c
1450
cmd->error = null_handle_flush(nullb);
drivers/block/null_blk/main.c
1469
struct nullb *nullb = container_of(timer, struct nullb, bw_timer);
drivers/block/null_blk/main.c
1471
unsigned int mbps = nullb->dev->mbps;
drivers/block/null_blk/main.c
1473
if (atomic_long_read(&nullb->cur_bytes) == mb_per_tick(mbps))
drivers/block/null_blk/main.c
1476
atomic_long_set(&nullb->cur_bytes, mb_per_tick(mbps));
drivers/block/null_blk/main.c
1477
blk_mq_start_stopped_hw_queues(nullb->q, true);
drivers/block/null_blk/main.c
1479
hrtimer_forward_now(&nullb->bw_timer, timer_interval);
drivers/block/null_blk/main.c
1484
static void nullb_setup_bwtimer(struct nullb *nullb)
drivers/block/null_blk/main.c
1488
hrtimer_setup(&nullb->bw_timer, nullb_bwtimer_fn, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
drivers/block/null_blk/main.c
1489
atomic_long_set(&nullb->cur_bytes, mb_per_tick(nullb->dev->mbps));
drivers/block/null_blk/main.c
1490
hrtimer_start(&nullb->bw_timer, timer_interval, HRTIMER_MODE_REL);
drivers/block/null_blk/main.c
1537
struct nullb *nullb = set->driver_data;
drivers/block/null_blk/main.c
1542
if (nullb) {
drivers/block/null_blk/main.c
1543
struct nullb_device *dev = nullb->dev;
drivers/block/null_blk/main.c
1725
static void null_init_queue(struct nullb *nullb, struct nullb_queue *nq)
drivers/block/null_blk/main.c
1727
nq->dev = nullb->dev;
drivers/block/null_blk/main.c
1735
struct nullb *nullb = hctx->queue->queuedata;
drivers/block/null_blk/main.c
1738
if (should_init_hctx_fail(nullb->dev))
drivers/block/null_blk/main.c
1741
nq = &nullb->queues[hctx_idx];
drivers/block/null_blk/main.c
1743
null_init_queue(nullb, nq);
drivers/block/null_blk/main.c
1758
static void null_del_dev(struct nullb *nullb)
drivers/block/null_blk/main.c
1762
if (!nullb)
drivers/block/null_blk/main.c
1765
dev = nullb->dev;
drivers/block/null_blk/main.c
1767
ida_free(&nullb_indexes, nullb->index);
drivers/block/null_blk/main.c
1769
list_del_init(&nullb->list);
drivers/block/null_blk/main.c
1771
del_gendisk(nullb->disk);
drivers/block/null_blk/main.c
1773
if (test_bit(NULLB_DEV_FL_THROTTLED, &nullb->dev->flags)) {
drivers/block/null_blk/main.c
1774
hrtimer_cancel(&nullb->bw_timer);
drivers/block/null_blk/main.c
1775
atomic_long_set(&nullb->cur_bytes, LONG_MAX);
drivers/block/null_blk/main.c
1776
blk_mq_start_stopped_hw_queues(nullb->q, true);
drivers/block/null_blk/main.c
1779
put_disk(nullb->disk);
drivers/block/null_blk/main.c
1780
if (nullb->tag_set == &nullb->__tag_set)
drivers/block/null_blk/main.c
1781
blk_mq_free_tag_set(nullb->tag_set);
drivers/block/null_blk/main.c
1782
kfree(nullb->queues);
drivers/block/null_blk/main.c
1783
if (null_cache_active(nullb))
drivers/block/null_blk/main.c
1784
null_free_device_storage(nullb->dev, true);
drivers/block/null_blk/main.c
1785
kfree(nullb);
drivers/block/null_blk/main.c
1786
dev->nullb = NULL;
drivers/block/null_blk/main.c
1789
static void null_config_discard(struct nullb *nullb, struct queue_limits *lim)
drivers/block/null_blk/main.c
1791
if (nullb->dev->discard == false)
drivers/block/null_blk/main.c
1794
if (!nullb->dev->memory_backed) {
drivers/block/null_blk/main.c
1795
nullb->dev->discard = false;
drivers/block/null_blk/main.c
1800
if (nullb->dev->zoned) {
drivers/block/null_blk/main.c
1801
nullb->dev->discard = false;
drivers/block/null_blk/main.c
1814
static int setup_queues(struct nullb *nullb)
drivers/block/null_blk/main.c
1821
nullb->queues = kzalloc_objs(struct nullb_queue, nqueues);
drivers/block/null_blk/main.c
1822
if (!nullb->queues)
drivers/block/null_blk/main.c
1864
static int null_setup_tagset(struct nullb *nullb)
drivers/block/null_blk/main.c
1866
if (nullb->dev->shared_tags) {
drivers/block/null_blk/main.c
1867
nullb->tag_set = &tag_set;
drivers/block/null_blk/main.c
1871
nullb->tag_set = &nullb->__tag_set;
drivers/block/null_blk/main.c
1872
nullb->tag_set->driver_data = nullb;
drivers/block/null_blk/main.c
1873
nullb->tag_set->nr_hw_queues = nullb->dev->submit_queues;
drivers/block/null_blk/main.c
1874
nullb->tag_set->queue_depth = nullb->dev->hw_queue_depth;
drivers/block/null_blk/main.c
1875
nullb->tag_set->numa_node = nullb->dev->home_node;
drivers/block/null_blk/main.c
1876
if (nullb->dev->no_sched)
drivers/block/null_blk/main.c
1877
nullb->tag_set->flags |= BLK_MQ_F_NO_SCHED_BY_DEFAULT;
drivers/block/null_blk/main.c
1878
if (nullb->dev->shared_tag_bitmap)
drivers/block/null_blk/main.c
1879
nullb->tag_set->flags |= BLK_MQ_F_TAG_HCTX_SHARED;
drivers/block/null_blk/main.c
1880
if (nullb->dev->blocking)
drivers/block/null_blk/main.c
1881
nullb->tag_set->flags |= BLK_MQ_F_BLOCKING;
drivers/block/null_blk/main.c
1882
return null_init_tag_set(nullb->tag_set, nullb->dev->poll_queues);
drivers/block/null_blk/main.c
1964
struct nullb *nullb;
drivers/block/null_blk/main.c
1971
nullb = kzalloc_node(sizeof(*nullb), GFP_KERNEL, dev->home_node);
drivers/block/null_blk/main.c
1972
if (!nullb) {
drivers/block/null_blk/main.c
1976
nullb->dev = dev;
drivers/block/null_blk/main.c
1977
dev->nullb = nullb;
drivers/block/null_blk/main.c
1979
spin_lock_init(&nullb->lock);
drivers/block/null_blk/main.c
1981
rv = setup_queues(nullb);
drivers/block/null_blk/main.c
1985
rv = null_setup_tagset(nullb);
drivers/block/null_blk/main.c
1991
null_config_discard(nullb, &lim);
drivers/block/null_blk/main.c
1999
set_bit(NULLB_DEV_FL_CACHE, &nullb->dev->flags);
drivers/block/null_blk/main.c
2008
nullb->disk = blk_mq_alloc_disk(nullb->tag_set, &lim, nullb);
drivers/block/null_blk/main.c
2009
if (IS_ERR(nullb->disk)) {
drivers/block/null_blk/main.c
2010
rv = PTR_ERR(nullb->disk);
drivers/block/null_blk/main.c
2013
nullb->q = nullb->disk->queue;
drivers/block/null_blk/main.c
2017
nullb_setup_bwtimer(nullb);
drivers/block/null_blk/main.c
2020
nullb->q->queuedata = nullb;
drivers/block/null_blk/main.c
2026
nullb->index = rv;
drivers/block/null_blk/main.c
2031
snprintf(nullb->disk_name, sizeof(nullb->disk_name),
drivers/block/null_blk/main.c
2034
sprintf(nullb->disk_name, "nullb%d", nullb->index);
drivers/block/null_blk/main.c
2037
set_capacity(nullb->disk,
drivers/block/null_blk/main.c
2038
((sector_t)nullb->dev->size * SZ_1M) >> SECTOR_SHIFT);
drivers/block/null_blk/main.c
2039
nullb->disk->major = null_major;
drivers/block/null_blk/main.c
2040
nullb->disk->first_minor = nullb->index;
drivers/block/null_blk/main.c
2041
nullb->disk->minors = 1;
drivers/block/null_blk/main.c
2042
nullb->disk->fops = &null_ops;
drivers/block/null_blk/main.c
2043
nullb->disk->private_data = nullb;
drivers/block/null_blk/main.c
2044
strscpy(nullb->disk->disk_name, nullb->disk_name);
drivers/block/null_blk/main.c
2046
if (nullb->dev->zoned) {
drivers/block/null_blk/main.c
2047
rv = null_register_zoned_dev(nullb);
drivers/block/null_blk/main.c
2052
rv = add_disk(nullb->disk);
drivers/block/null_blk/main.c
2056
list_add_tail(&nullb->list, &nullb_list);
drivers/block/null_blk/main.c
2058
pr_info("disk %s created\n", nullb->disk_name);
drivers/block/null_blk/main.c
2063
ida_free(&nullb_indexes, nullb->index);
drivers/block/null_blk/main.c
2065
put_disk(nullb->disk);
drivers/block/null_blk/main.c
2069
if (nullb->tag_set == &nullb->__tag_set)
drivers/block/null_blk/main.c
2070
blk_mq_free_tag_set(nullb->tag_set);
drivers/block/null_blk/main.c
2072
kfree(nullb->queues);
drivers/block/null_blk/main.c
2074
kfree(nullb);
drivers/block/null_blk/main.c
2075
dev->nullb = NULL;
drivers/block/null_blk/main.c
2080
static struct nullb *null_find_dev_by_name(const char *name)
drivers/block/null_blk/main.c
2082
struct nullb *nullb = NULL, *nb;
drivers/block/null_blk/main.c
2087
nullb = nb;
drivers/block/null_blk/main.c
2093
return nullb;
drivers/block/null_blk/main.c
2116
static void null_destroy_dev(struct nullb *nullb)
drivers/block/null_blk/main.c
2118
struct nullb_device *dev = nullb->dev;
drivers/block/null_blk/main.c
2120
null_del_dev(nullb);
drivers/block/null_blk/main.c
2129
struct nullb *nullb;
drivers/block/null_blk/main.c
2188
nullb = list_entry(nullb_list.next, struct nullb, list);
drivers/block/null_blk/main.c
2189
null_destroy_dev(nullb);
drivers/block/null_blk/main.c
2199
struct nullb *nullb;
drivers/block/null_blk/main.c
2207
nullb = list_entry(nullb_list.next, struct nullb, list);
drivers/block/null_blk/main.c
2208
null_destroy_dev(nullb);
drivers/block/null_blk/main.c
275
static void null_del_dev(struct nullb *nullb);
drivers/block/null_blk/main.c
277
static struct nullb *null_find_dev_by_name(const char *name);
drivers/block/null_blk/main.c
382
if (!dev->nullb)
drivers/block/null_blk/main.c
407
set = dev->nullb->tag_set;
drivers/block/null_blk/main.c
513
null_del_dev(dev->nullb);
drivers/block/null_blk/main.c
712
null_del_dev(dev->nullb);
drivers/block/null_blk/main.c
772
static inline int null_cache_active(struct nullb *nullb)
drivers/block/null_blk/main.c
774
return test_bit(NULLB_DEV_FL_CACHE, &nullb->dev->flags);
drivers/block/null_blk/main.c
900
static void null_free_sector(struct nullb *nullb, sector_t sector,
drivers/block/null_blk/main.c
908
root = is_cache ? &nullb->dev->cache : &nullb->dev->data;
drivers/block/null_blk/main.c
921
nullb->dev->curr_cache -= PAGE_SIZE;
drivers/block/null_blk/main.c
926
static struct nullb_page *null_radix_tree_insert(struct nullb *nullb, u64 idx,
drivers/block/null_blk/main.c
931
root = is_cache ? &nullb->dev->cache : &nullb->dev->data;
drivers/block/null_blk/main.c
938
nullb->dev->curr_cache += PAGE_SIZE;
drivers/block/null_blk/main.c
972
static struct nullb_page *__null_lookup_page(struct nullb *nullb,
drivers/block/null_blk/main.c
983
root = is_cache ? &nullb->dev->cache : &nullb->dev->data;
drivers/block/null_blk/main.c
993
static struct nullb_page *null_lookup_page(struct nullb *nullb,
drivers/block/null_blk/main.c
999
page = __null_lookup_page(nullb, sector, for_write, true);
drivers/block/null_blk/null_blk.h
143
int null_register_zoned_dev(struct nullb *nullb);
drivers/block/null_blk/null_blk.h
150
size_t null_zone_valid_read_len(struct nullb *nullb,
drivers/block/null_blk/null_blk.h
161
static inline int null_register_zoned_dev(struct nullb *nullb)
drivers/block/null_blk/null_blk.h
171
static inline size_t null_zone_valid_read_len(struct nullb *nullb,
drivers/block/null_blk/null_blk.h
54
struct nullb *nullb;
drivers/block/null_blk/trace.h
63
TP_PROTO(struct nullb *nullb, unsigned int nr_zones),
drivers/block/null_blk/trace.h
64
TP_ARGS(nullb, nr_zones),
drivers/block/null_blk/trace.h
71
__assign_disk_name(__entry->disk, nullb->disk);
drivers/block/null_blk/trace.h
9
#define TRACE_SYSTEM nullb
drivers/block/null_blk/zoned.c
175
int null_register_zoned_dev(struct nullb *nullb)
drivers/block/null_blk/zoned.c
177
struct request_queue *q = nullb->q;
drivers/block/null_blk/zoned.c
178
struct gendisk *disk = nullb->disk;
drivers/block/null_blk/zoned.c
196
struct nullb *nullb = disk->private_data;
drivers/block/null_blk/zoned.c
197
struct nullb_device *dev = nullb->dev;
drivers/block/null_blk/zoned.c
208
trace_nullb_report_zones(nullb, nr_zones);
drivers/block/null_blk/zoned.c
240
size_t null_zone_valid_read_len(struct nullb *nullb,
drivers/block/null_blk/zoned.c
243
struct nullb_device *dev = nullb->dev;