Lines Matching refs:vblk
133 struct virtio_blk *vblk = hctx->queue->queuedata; in get_virtio_blk_vq() local
134 struct virtio_blk_vq *vq = &vblk->vqs[hctx->queue_num]; in get_virtio_blk_vq()
338 struct virtio_blk *vblk = req->mq_hctx->queue->queuedata; in virtblk_request_done() local
344 req->__sector = virtio64_to_cpu(vblk->vdev, in virtblk_request_done()
352 struct virtio_blk *vblk = vq->vdev->priv; in virtblk_done() local
359 spin_lock_irqsave(&vblk->vqs[qid].lock, flags); in virtblk_done()
362 while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) { in virtblk_done()
373 blk_mq_start_stopped_hw_queues(vblk->disk->queue, true); in virtblk_done()
374 spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); in virtblk_done()
379 struct virtio_blk *vblk = hctx->queue->queuedata; in virtio_commit_rqs() local
380 struct virtio_blk_vq *vq = &vblk->vqs[hctx->queue_num]; in virtio_commit_rqs()
405 struct virtio_blk *vblk, in virtblk_prep_rq() argument
412 status = virtblk_setup_cmd(vblk->vdev, req, vbr); in virtblk_prep_rq()
429 struct virtio_blk *vblk = hctx->queue->queuedata; in virtio_queue_rq() local
438 status = virtblk_prep_rq(hctx, vblk, req, vbr); in virtio_queue_rq()
442 spin_lock_irqsave(&vblk->vqs[qid].lock, flags); in virtio_queue_rq()
443 err = virtblk_add_req(vblk->vqs[qid].vq, vbr); in virtio_queue_rq()
445 virtqueue_kick(vblk->vqs[qid].vq); in virtio_queue_rq()
451 spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); in virtio_queue_rq()
456 if (bd->last && virtqueue_kick_prepare(vblk->vqs[qid].vq)) in virtio_queue_rq()
458 spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); in virtio_queue_rq()
461 virtqueue_notify(vblk->vqs[qid].vq); in virtio_queue_rq()
467 struct virtio_blk *vblk = req->mq_hctx->queue->queuedata; in virtblk_prep_rq_batch() local
470 return virtblk_prep_rq(req->mq_hctx, vblk, req, vbr) == BLK_STS_OK; in virtblk_prep_rq_batch()
527 static void *virtblk_alloc_report_buffer(struct virtio_blk *vblk, in virtblk_alloc_report_buffer() argument
531 struct request_queue *q = vblk->disk->queue; in virtblk_alloc_report_buffer()
536 get_capacity(vblk->disk) >> ilog2(vblk->zone_sectors)); in virtblk_alloc_report_buffer()
556 static int virtblk_submit_zone_report(struct virtio_blk *vblk, in virtblk_submit_zone_report() argument
560 struct request_queue *q = vblk->disk->queue; in virtblk_submit_zone_report()
571 vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_ZONE_REPORT); in virtblk_submit_zone_report()
572 vbr->out_hdr.sector = cpu_to_virtio64(vblk->vdev, sector); in virtblk_submit_zone_report()
585 static int virtblk_parse_zone(struct virtio_blk *vblk, in virtblk_parse_zone() argument
592 zone.start = virtio64_to_cpu(vblk->vdev, entry->z_start); in virtblk_parse_zone()
593 if (zone.start + vblk->zone_sectors <= get_capacity(vblk->disk)) in virtblk_parse_zone()
594 zone.len = vblk->zone_sectors; in virtblk_parse_zone()
596 zone.len = get_capacity(vblk->disk) - zone.start; in virtblk_parse_zone()
597 zone.capacity = virtio64_to_cpu(vblk->vdev, entry->z_cap); in virtblk_parse_zone()
598 zone.wp = virtio64_to_cpu(vblk->vdev, entry->z_wp); in virtblk_parse_zone()
611 dev_err(&vblk->vdev->dev, "zone %llu: invalid type %#x\n", in virtblk_parse_zone()
645 dev_err(&vblk->vdev->dev, "zone %llu: invalid condition %#x\n", in virtblk_parse_zone()
654 return disk_report_zone(vblk->disk, &zone, idx, args); in virtblk_parse_zone()
661 struct virtio_blk *vblk = disk->private_data; in virtblk_report_zones() local
668 if (WARN_ON_ONCE(!vblk->zone_sectors)) in virtblk_report_zones()
671 report = virtblk_alloc_report_buffer(vblk, nr_zones, &buflen); in virtblk_report_zones()
675 mutex_lock(&vblk->vdev_mutex); in virtblk_report_zones()
677 if (!vblk->vdev) { in virtblk_report_zones()
682 while (zone_idx < nr_zones && sector < get_capacity(vblk->disk)) { in virtblk_report_zones()
685 ret = virtblk_submit_zone_report(vblk, (char *)report, in virtblk_report_zones()
690 nz = min_t(u64, virtio64_to_cpu(vblk->vdev, report->nr_zones), in virtblk_report_zones()
696 ret = virtblk_parse_zone(vblk, &report->zones[i], in virtblk_report_zones()
701 sector = virtio64_to_cpu(vblk->vdev, in virtblk_report_zones()
703 vblk->zone_sectors; in virtblk_report_zones()
713 mutex_unlock(&vblk->vdev_mutex); in virtblk_report_zones()
718 static int virtblk_read_zoned_limits(struct virtio_blk *vblk, in virtblk_read_zoned_limits() argument
721 struct virtio_device *vdev = vblk->vdev; in virtblk_read_zoned_limits()
754 &vblk->zone_sectors); in virtblk_read_zoned_limits()
755 if (vblk->zone_sectors == 0 || !is_power_of_2(vblk->zone_sectors)) { in virtblk_read_zoned_limits()
758 vblk->zone_sectors); in virtblk_read_zoned_limits()
761 lim->chunk_sectors = vblk->zone_sectors; in virtblk_read_zoned_limits()
762 dev_dbg(&vdev->dev, "zone sectors = %u\n", vblk->zone_sectors); in virtblk_read_zoned_limits()
765 dev_warn(&vblk->vdev->dev, in virtblk_read_zoned_limits()
793 static inline int virtblk_read_zoned_limits(struct virtio_blk *vblk, in virtblk_read_zoned_limits() argument
796 dev_err(&vblk->vdev->dev, in virtblk_read_zoned_limits()
806 struct virtio_blk *vblk = disk->private_data; in virtblk_get_id() local
807 struct request_queue *q = vblk->disk->queue; in virtblk_get_id()
818 vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_GET_ID); in virtblk_get_id()
835 struct virtio_blk *vblk = disk->private_data; in virtblk_getgeo() local
838 mutex_lock(&vblk->vdev_mutex); in virtblk_getgeo()
840 if (!vblk->vdev) { in virtblk_getgeo()
846 if (virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_GEOMETRY)) { in virtblk_getgeo()
847 virtio_cread(vblk->vdev, struct virtio_blk_config, in virtblk_getgeo()
849 virtio_cread(vblk->vdev, struct virtio_blk_config, in virtblk_getgeo()
851 virtio_cread(vblk->vdev, struct virtio_blk_config, in virtblk_getgeo()
860 mutex_unlock(&vblk->vdev_mutex); in virtblk_getgeo()
866 struct virtio_blk *vblk = disk->private_data; in virtblk_free_disk() local
868 ida_free(&vd_index_ida, vblk->index); in virtblk_free_disk()
869 mutex_destroy(&vblk->vdev_mutex); in virtblk_free_disk()
870 kfree(vblk); in virtblk_free_disk()
913 static void virtblk_update_capacity(struct virtio_blk *vblk, bool resize) in virtblk_update_capacity() argument
915 struct virtio_device *vdev = vblk->vdev; in virtblk_update_capacity()
916 struct request_queue *q = vblk->disk->queue; in virtblk_update_capacity()
933 vblk->disk->disk_name, in virtblk_update_capacity()
940 set_capacity_and_notify(vblk->disk, capacity); in virtblk_update_capacity()
945 struct virtio_blk *vblk = in virtblk_config_changed_work() local
948 virtblk_update_capacity(vblk, true); in virtblk_config_changed_work()
953 struct virtio_blk *vblk = vdev->priv; in virtblk_config_changed() local
955 queue_work(virtblk_wq, &vblk->config_work); in virtblk_config_changed()
958 static int init_vq(struct virtio_blk *vblk) in init_vq() argument
966 struct virtio_device *vdev = vblk->vdev; in init_vq()
985 vblk->io_queues[HCTX_TYPE_DEFAULT] = num_vqs - num_poll_vqs; in init_vq()
986 vblk->io_queues[HCTX_TYPE_READ] = 0; in init_vq()
987 vblk->io_queues[HCTX_TYPE_POLL] = num_poll_vqs; in init_vq()
990 vblk->io_queues[HCTX_TYPE_DEFAULT], in init_vq()
991 vblk->io_queues[HCTX_TYPE_READ], in init_vq()
992 vblk->io_queues[HCTX_TYPE_POLL]); in init_vq()
994 vblk->vqs = kmalloc_objs(*vblk->vqs, num_vqs); in init_vq()
995 if (!vblk->vqs) in init_vq()
1007 snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%u", i); in init_vq()
1008 vqs_info[i].name = vblk->vqs[i].name; in init_vq()
1012 snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%u", i); in init_vq()
1013 vqs_info[i].name = vblk->vqs[i].name; in init_vq()
1022 spin_lock_init(&vblk->vqs[i].lock); in init_vq()
1023 vblk->vqs[i].vq = vqs[i]; in init_vq()
1025 vblk->num_vqs = num_vqs; in init_vq()
1031 kfree(vblk->vqs); in init_vq()
1035 vblk->vqs = NULL; in init_vq()
1096 struct virtio_blk *vblk = disk->private_data; in cache_type_store() local
1097 struct virtio_device *vdev = vblk->vdev; in cache_type_store()
1101 BUG_ON(!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_CONFIG_WCE)); in cache_type_store()
1123 struct virtio_blk *vblk = disk->private_data; in cache_type_show() local
1124 u8 writeback = virtblk_get_cache_mode(vblk->vdev); in cache_type_show()
1143 struct virtio_blk *vblk = disk->private_data; in virtblk_attrs_are_visible() local
1144 struct virtio_device *vdev = vblk->vdev; in virtblk_attrs_are_visible()
1165 struct virtio_blk *vblk = set->driver_data; in virtblk_map_queues() local
1171 map->nr_queues = vblk->io_queues[i]; in virtblk_map_queues()
1187 &vblk->vdev->dev, 0); in virtblk_map_queues()
1204 struct virtio_blk *vblk = hctx->queue->queuedata; in virtblk_poll() local
1225 blk_mq_start_stopped_hw_queues(vblk->disk->queue, true); in virtblk_poll()
1244 static int virtblk_read_limits(struct virtio_blk *vblk, in virtblk_read_limits() argument
1247 struct virtio_device *vdev = vblk->vdev; in virtblk_read_limits()
1423 err = virtblk_read_zoned_limits(vblk, lim); in virtblk_read_limits()
1438 struct virtio_blk *vblk; in virtblk_probe() local
1458 vdev->priv = vblk = kmalloc_obj(*vblk); in virtblk_probe()
1459 if (!vblk) { in virtblk_probe()
1464 mutex_init(&vblk->vdev_mutex); in virtblk_probe()
1466 vblk->vdev = vdev; in virtblk_probe()
1468 INIT_WORK(&vblk->config_work, virtblk_config_changed_work); in virtblk_probe()
1470 err = init_vq(vblk); in virtblk_probe()
1476 queue_depth = vblk->vqs[0].vq->num_free; in virtblk_probe()
1484 memset(&vblk->tag_set, 0, sizeof(vblk->tag_set)); in virtblk_probe()
1485 vblk->tag_set.ops = &virtio_mq_ops; in virtblk_probe()
1486 vblk->tag_set.queue_depth = queue_depth; in virtblk_probe()
1487 vblk->tag_set.numa_node = NUMA_NO_NODE; in virtblk_probe()
1488 vblk->tag_set.cmd_size = in virtblk_probe()
1491 vblk->tag_set.driver_data = vblk; in virtblk_probe()
1492 vblk->tag_set.nr_hw_queues = vblk->num_vqs; in virtblk_probe()
1493 vblk->tag_set.nr_maps = 1; in virtblk_probe()
1494 if (vblk->io_queues[HCTX_TYPE_POLL]) in virtblk_probe()
1495 vblk->tag_set.nr_maps = 3; in virtblk_probe()
1497 err = blk_mq_alloc_tag_set(&vblk->tag_set); in virtblk_probe()
1501 err = virtblk_read_limits(vblk, &lim); in virtblk_probe()
1508 vblk->disk = blk_mq_alloc_disk(&vblk->tag_set, &lim, vblk); in virtblk_probe()
1509 if (IS_ERR(vblk->disk)) { in virtblk_probe()
1510 err = PTR_ERR(vblk->disk); in virtblk_probe()
1514 virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN); in virtblk_probe()
1516 vblk->disk->major = major; in virtblk_probe()
1517 vblk->disk->first_minor = index_to_minor(index); in virtblk_probe()
1518 vblk->disk->minors = 1 << PART_BITS; in virtblk_probe()
1519 vblk->disk->private_data = vblk; in virtblk_probe()
1520 vblk->disk->fops = &virtblk_fops; in virtblk_probe()
1521 vblk->index = index; in virtblk_probe()
1525 set_disk_ro(vblk->disk, 1); in virtblk_probe()
1527 virtblk_update_capacity(vblk, false); in virtblk_probe()
1536 err = blk_revalidate_disk_zones(vblk->disk); in virtblk_probe()
1541 err = device_add_disk(&vdev->dev, vblk->disk, virtblk_attr_groups); in virtblk_probe()
1548 put_disk(vblk->disk); in virtblk_probe()
1550 blk_mq_free_tag_set(&vblk->tag_set); in virtblk_probe()
1553 kfree(vblk->vqs); in virtblk_probe()
1555 kfree(vblk); in virtblk_probe()
1564 struct virtio_blk *vblk = vdev->priv; in virtblk_remove() local
1567 flush_work(&vblk->config_work); in virtblk_remove()
1569 del_gendisk(vblk->disk); in virtblk_remove()
1570 blk_mq_free_tag_set(&vblk->tag_set); in virtblk_remove()
1572 mutex_lock(&vblk->vdev_mutex); in virtblk_remove()
1578 vblk->vdev = NULL; in virtblk_remove()
1581 kfree(vblk->vqs); in virtblk_remove()
1583 mutex_unlock(&vblk->vdev_mutex); in virtblk_remove()
1585 put_disk(vblk->disk); in virtblk_remove()
1590 struct virtio_blk *vblk = vdev->priv; in virtblk_freeze_priv() local
1591 struct request_queue *q = vblk->disk->queue; in virtblk_freeze_priv()
1603 flush_work(&vblk->config_work); in virtblk_freeze_priv()
1606 kfree(vblk->vqs); in virtblk_freeze_priv()
1612 vblk->vqs = NULL; in virtblk_freeze_priv()
1619 struct virtio_blk *vblk = vdev->priv; in virtblk_restore_priv() local
1627 blk_mq_unquiesce_queue(vblk->disk->queue); in virtblk_restore_priv()