Lines Matching refs:vblk

176 	struct virtio_blk *vblk = vq->vdev->priv;  in virtblk_done()  local
183 spin_lock_irqsave(&vblk->vqs[qid].lock, flags); in virtblk_done()
186 while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) { in virtblk_done()
199 blk_mq_start_stopped_hw_queues(vblk->disk->queue, true); in virtblk_done()
200 spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); in virtblk_done()
205 struct virtio_blk *vblk = hctx->queue->queuedata; in virtio_commit_rqs() local
206 struct virtio_blk_vq *vq = &vblk->vqs[hctx->queue_num]; in virtio_commit_rqs()
220 struct virtio_blk *vblk = hctx->queue->queuedata; in virtio_queue_rq() local
256 (req->nr_phys_segments + 2 > vblk->sg_elems)); in virtio_queue_rq()
258 vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, type); in virtio_queue_rq()
260 0 : cpu_to_virtio64(vblk->vdev, blk_rq_pos(req)); in virtio_queue_rq()
261 vbr->out_hdr.ioprio = cpu_to_virtio32(vblk->vdev, req_get_ioprio(req)); in virtio_queue_rq()
274 vbr->out_hdr.type |= cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_OUT); in virtio_queue_rq()
276 vbr->out_hdr.type |= cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_IN); in virtio_queue_rq()
279 spin_lock_irqsave(&vblk->vqs[qid].lock, flags); in virtio_queue_rq()
280 err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num); in virtio_queue_rq()
282 virtqueue_kick(vblk->vqs[qid].vq); in virtio_queue_rq()
288 spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); in virtio_queue_rq()
299 if (bd->last && virtqueue_kick_prepare(vblk->vqs[qid].vq)) in virtio_queue_rq()
301 spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); in virtio_queue_rq()
304 virtqueue_notify(vblk->vqs[qid].vq); in virtio_queue_rq()
312 struct virtio_blk *vblk = disk->private_data; in virtblk_get_id() local
313 struct request_queue *q = vblk->disk->queue; in virtblk_get_id()
325 blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); in virtblk_get_id()
332 static void virtblk_get(struct virtio_blk *vblk) in virtblk_get() argument
334 refcount_inc(&vblk->refs); in virtblk_get()
337 static void virtblk_put(struct virtio_blk *vblk) in virtblk_put() argument
339 if (refcount_dec_and_test(&vblk->refs)) { in virtblk_put()
340 ida_simple_remove(&vd_index_ida, vblk->index); in virtblk_put()
341 mutex_destroy(&vblk->vdev_mutex); in virtblk_put()
342 kfree(vblk); in virtblk_put()
348 struct virtio_blk *vblk = bd->bd_disk->private_data; in virtblk_open() local
351 mutex_lock(&vblk->vdev_mutex); in virtblk_open()
353 if (vblk->vdev) in virtblk_open()
354 virtblk_get(vblk); in virtblk_open()
358 mutex_unlock(&vblk->vdev_mutex); in virtblk_open()
364 struct virtio_blk *vblk = disk->private_data; in virtblk_release() local
366 virtblk_put(vblk); in virtblk_release()
372 struct virtio_blk *vblk = bd->bd_disk->private_data; in virtblk_getgeo() local
375 mutex_lock(&vblk->vdev_mutex); in virtblk_getgeo()
377 if (!vblk->vdev) { in virtblk_getgeo()
383 if (virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_GEOMETRY)) { in virtblk_getgeo()
384 virtio_cread(vblk->vdev, struct virtio_blk_config, in virtblk_getgeo()
386 virtio_cread(vblk->vdev, struct virtio_blk_config, in virtblk_getgeo()
388 virtio_cread(vblk->vdev, struct virtio_blk_config, in virtblk_getgeo()
397 mutex_unlock(&vblk->vdev_mutex); in virtblk_getgeo()
441 static void virtblk_update_capacity(struct virtio_blk *vblk, bool resize) in virtblk_update_capacity() argument
443 struct virtio_device *vdev = vblk->vdev; in virtblk_update_capacity()
444 struct request_queue *q = vblk->disk->queue; in virtblk_update_capacity()
468 vblk->disk->disk_name, in virtblk_update_capacity()
475 set_capacity_revalidate_and_notify(vblk->disk, capacity, true); in virtblk_update_capacity()
480 struct virtio_blk *vblk = in virtblk_config_changed_work() local
483 virtblk_update_capacity(vblk, true); in virtblk_config_changed_work()
488 struct virtio_blk *vblk = vdev->priv; in virtblk_config_changed() local
490 queue_work(virtblk_wq, &vblk->config_work); in virtblk_config_changed()
493 static int init_vq(struct virtio_blk *vblk) in init_vq() argument
501 struct virtio_device *vdev = vblk->vdev; in init_vq()
512 vblk->vqs = kmalloc_array(num_vqs, sizeof(*vblk->vqs), GFP_KERNEL); in init_vq()
513 if (!vblk->vqs) in init_vq()
526 snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%d", i); in init_vq()
527 names[i] = vblk->vqs[i].name; in init_vq()
536 spin_lock_init(&vblk->vqs[i].lock); in init_vq()
537 vblk->vqs[i].vq = vqs[i]; in init_vq()
539 vblk->num_vqs = num_vqs; in init_vq()
546 kfree(vblk->vqs); in init_vq()
600 struct virtio_blk *vblk = vdev->priv; in virtblk_update_cache_mode() local
602 blk_queue_write_cache(vblk->disk->queue, writeback, false); in virtblk_update_cache_mode()
603 revalidate_disk_size(vblk->disk, true); in virtblk_update_cache_mode()
615 struct virtio_blk *vblk = disk->private_data; in cache_type_store() local
616 struct virtio_device *vdev = vblk->vdev; in cache_type_store()
619 BUG_ON(!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_CONFIG_WCE)); in cache_type_store()
633 struct virtio_blk *vblk = disk->private_data; in cache_type_show() local
634 u8 writeback = virtblk_get_cache_mode(vblk->vdev); in cache_type_show()
653 struct virtio_blk *vblk = disk->private_data; in virtblk_attrs_are_visible() local
654 struct virtio_device *vdev = vblk->vdev; in virtblk_attrs_are_visible()
676 struct virtio_blk *vblk = set->driver_data; in virtblk_init_request() local
679 sg_init_table(vbr->sg, vblk->sg_elems); in virtblk_init_request()
685 struct virtio_blk *vblk = set->driver_data; in virtblk_map_queues() local
688 vblk->vdev, 0); in virtblk_map_queues()
704 struct virtio_blk *vblk; in virtblk_probe() local
735 vdev->priv = vblk = kmalloc(sizeof(*vblk), GFP_KERNEL); in virtblk_probe()
736 if (!vblk) { in virtblk_probe()
742 refcount_set(&vblk->refs, 1); in virtblk_probe()
743 mutex_init(&vblk->vdev_mutex); in virtblk_probe()
745 vblk->vdev = vdev; in virtblk_probe()
746 vblk->sg_elems = sg_elems; in virtblk_probe()
748 INIT_WORK(&vblk->config_work, virtblk_config_changed_work); in virtblk_probe()
750 err = init_vq(vblk); in virtblk_probe()
755 vblk->disk = alloc_disk(1 << PART_BITS); in virtblk_probe()
756 if (!vblk->disk) { in virtblk_probe()
763 virtblk_queue_depth = vblk->vqs[0].vq->num_free; in virtblk_probe()
769 memset(&vblk->tag_set, 0, sizeof(vblk->tag_set)); in virtblk_probe()
770 vblk->tag_set.ops = &virtio_mq_ops; in virtblk_probe()
771 vblk->tag_set.queue_depth = virtblk_queue_depth; in virtblk_probe()
772 vblk->tag_set.numa_node = NUMA_NO_NODE; in virtblk_probe()
773 vblk->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; in virtblk_probe()
774 vblk->tag_set.cmd_size = in virtblk_probe()
777 vblk->tag_set.driver_data = vblk; in virtblk_probe()
778 vblk->tag_set.nr_hw_queues = vblk->num_vqs; in virtblk_probe()
780 err = blk_mq_alloc_tag_set(&vblk->tag_set); in virtblk_probe()
784 q = blk_mq_init_queue(&vblk->tag_set); in virtblk_probe()
789 vblk->disk->queue = q; in virtblk_probe()
791 q->queuedata = vblk; in virtblk_probe()
793 virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN); in virtblk_probe()
795 vblk->disk->major = major; in virtblk_probe()
796 vblk->disk->first_minor = index_to_minor(index); in virtblk_probe()
797 vblk->disk->private_data = vblk; in virtblk_probe()
798 vblk->disk->fops = &virtblk_fops; in virtblk_probe()
799 vblk->disk->flags |= GENHD_FL_EXT_DEVT; in virtblk_probe()
800 vblk->index = index; in virtblk_probe()
807 set_disk_ro(vblk->disk, 1); in virtblk_probe()
810 blk_queue_max_segments(q, vblk->sg_elems-2); in virtblk_probe()
902 virtblk_update_capacity(vblk, false); in virtblk_probe()
905 device_add_disk(&vdev->dev, vblk->disk, virtblk_attr_groups); in virtblk_probe()
909 blk_cleanup_queue(vblk->disk->queue); in virtblk_probe()
911 blk_mq_free_tag_set(&vblk->tag_set); in virtblk_probe()
913 put_disk(vblk->disk); in virtblk_probe()
916 kfree(vblk->vqs); in virtblk_probe()
918 kfree(vblk); in virtblk_probe()
927 struct virtio_blk *vblk = vdev->priv; in virtblk_remove() local
930 flush_work(&vblk->config_work); in virtblk_remove()
932 del_gendisk(vblk->disk); in virtblk_remove()
933 blk_cleanup_queue(vblk->disk->queue); in virtblk_remove()
935 blk_mq_free_tag_set(&vblk->tag_set); in virtblk_remove()
937 mutex_lock(&vblk->vdev_mutex); in virtblk_remove()
943 vblk->vdev = NULL; in virtblk_remove()
945 put_disk(vblk->disk); in virtblk_remove()
947 kfree(vblk->vqs); in virtblk_remove()
949 mutex_unlock(&vblk->vdev_mutex); in virtblk_remove()
951 virtblk_put(vblk); in virtblk_remove()
957 struct virtio_blk *vblk = vdev->priv; in virtblk_freeze() local
963 flush_work(&vblk->config_work); in virtblk_freeze()
965 blk_mq_quiesce_queue(vblk->disk->queue); in virtblk_freeze()
968 kfree(vblk->vqs); in virtblk_freeze()
975 struct virtio_blk *vblk = vdev->priv; in virtblk_restore() local
984 blk_mq_unquiesce_queue(vblk->disk->queue); in virtblk_restore()