• Home
  • Raw
  • Download

Lines Matching full:vs

175 	struct vhost_scsi *vs;  member
252 static void vhost_scsi_init_inflight(struct vhost_scsi *vs, in vhost_scsi_init_inflight() argument
259 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_init_inflight()
260 vq = &vs->vqs[i].vq; in vhost_scsi_init_inflight()
265 idx = vs->vqs[i].inflight_idx; in vhost_scsi_init_inflight()
267 old_inflight[i] = &vs->vqs[i].inflights[idx]; in vhost_scsi_init_inflight()
270 vs->vqs[i].inflight_idx = idx ^ 1; in vhost_scsi_init_inflight()
271 new_inflight = &vs->vqs[i].inflights[idx ^ 1]; in vhost_scsi_init_inflight()
413 static void vhost_scsi_free_evt(struct vhost_scsi *vs, struct vhost_scsi_evt *evt) in vhost_scsi_free_evt() argument
415 vs->vs_events_nr--; in vhost_scsi_free_evt()
420 vhost_scsi_allocate_evt(struct vhost_scsi *vs, in vhost_scsi_allocate_evt() argument
423 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_allocate_evt()
426 if (vs->vs_events_nr > VHOST_SCSI_MAX_EVENT) { in vhost_scsi_allocate_evt()
427 vs->vs_events_missed = true; in vhost_scsi_allocate_evt()
434 vs->vs_events_missed = true; in vhost_scsi_allocate_evt()
440 vs->vs_events_nr++; in vhost_scsi_allocate_evt()
451 vhost_scsi_do_evt_work(struct vhost_scsi *vs, struct vhost_scsi_evt *evt) in vhost_scsi_do_evt_work() argument
453 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_evt_work()
460 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
465 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_do_evt_work()
470 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
474 if (vhost_enable_notify(&vs->dev, vq)) in vhost_scsi_do_evt_work()
476 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
483 vs->vs_events_missed = true; in vhost_scsi_do_evt_work()
487 if (vs->vs_events_missed) { in vhost_scsi_do_evt_work()
489 vs->vs_events_missed = false; in vhost_scsi_do_evt_work()
495 vhost_add_used_and_signal(&vs->dev, vq, head, 0); in vhost_scsi_do_evt_work()
500 static void vhost_scsi_complete_events(struct vhost_scsi *vs, bool drop) in vhost_scsi_complete_events() argument
502 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_complete_events()
507 llnode = llist_del_all(&vs->vs_event_list); in vhost_scsi_complete_events()
510 vhost_scsi_do_evt_work(vs, evt); in vhost_scsi_complete_events()
511 vhost_scsi_free_evt(vs, evt); in vhost_scsi_complete_events()
518 struct vhost_scsi *vs = container_of(work, struct vhost_scsi, in vhost_scsi_evt_work() local
520 vhost_scsi_complete_events(vs, false); in vhost_scsi_evt_work()
597 vhost_signal(&svq->vs->dev, &svq->vq); in vhost_scsi_complete_cmd_work()
922 vhost_scsi_send_bad_target(struct vhost_scsi *vs, in vhost_scsi_send_bad_target() argument
935 vhost_add_used_and_signal(&vs->dev, vq, head, 0); in vhost_scsi_send_bad_target()
941 vhost_scsi_get_desc(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_get_desc() argument
959 if (unlikely(vhost_enable_notify(&vs->dev, vq))) { in vhost_scsi_get_desc()
960 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_get_desc()
1047 vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_handle_vq() argument
1075 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_handle_vq()
1078 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_handle_vq()
1115 * iovec sizes + incoming iovec sizes vs. virtio-scsi request + in vhost_scsi_handle_vq()
1212 cmd->tvc_vhost = vs; in vhost_scsi_handle_vq()
1250 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); in vhost_scsi_handle_vq()
1257 vhost_scsi_send_tmf_resp(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_tmf_resp() argument
1273 vhost_add_used_and_signal(&vs->dev, vq, vq_desc, 0); in vhost_scsi_send_tmf_resp()
1310 vhost_scsi_handle_tmf(struct vhost_scsi *vs, struct vhost_scsi_tpg *tpg, in vhost_scsi_handle_tmf() argument
1333 tmf->vhost = vs; in vhost_scsi_handle_tmf()
1351 vhost_scsi_send_tmf_resp(vs, vq, vc->in, vc->head, &vq->iov[vc->out], in vhost_scsi_handle_tmf()
1356 vhost_scsi_send_an_resp(struct vhost_scsi *vs, in vhost_scsi_send_an_resp() argument
1372 vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0); in vhost_scsi_send_an_resp()
1378 vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_ctl_handle_vq() argument
1400 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_ctl_handle_vq()
1403 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1467 vhost_scsi_handle_tmf(vs, tpg, vq, &v_req.tmf, &vc); in vhost_scsi_ctl_handle_vq()
1469 vhost_scsi_send_an_resp(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1480 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); in vhost_scsi_ctl_handle_vq()
1490 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_ctl_handle_kick() local
1493 vhost_scsi_ctl_handle_vq(vs, vq); in vhost_scsi_ctl_handle_kick()
1497 vhost_scsi_send_evt(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_evt() argument
1503 evt = vhost_scsi_allocate_evt(vs, event, reason); in vhost_scsi_send_evt()
1520 llist_add(&evt->list, &vs->vs_event_list); in vhost_scsi_send_evt()
1521 if (!vhost_vq_work_queue(vq, &vs->vs_event_work)) in vhost_scsi_send_evt()
1522 vhost_scsi_complete_events(vs, true); in vhost_scsi_send_evt()
1529 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_evt_handle_kick() local
1535 if (vs->vs_events_missed) in vhost_scsi_evt_handle_kick()
1536 vhost_scsi_send_evt(vs, vq, NULL, NULL, VIRTIO_SCSI_T_NO_EVENT, in vhost_scsi_evt_handle_kick()
1546 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_handle_kick() local
1548 vhost_scsi_handle_vq(vs, vq); in vhost_scsi_handle_kick()
1552 static void vhost_scsi_flush(struct vhost_scsi *vs) in vhost_scsi_flush() argument
1557 vhost_scsi_init_inflight(vs, vs->old_inflight); in vhost_scsi_flush()
1564 for (i = 0; i < vs->dev.nvqs; i++) in vhost_scsi_flush()
1565 kref_put(&vs->old_inflight[i]->kref, vhost_scsi_done_inflight); in vhost_scsi_flush()
1568 vhost_dev_flush(&vs->dev); in vhost_scsi_flush()
1571 for (i = 0; i < vs->dev.nvqs; i++) in vhost_scsi_flush()
1572 wait_for_completion(&vs->old_inflight[i]->comp); in vhost_scsi_flush()
1666 * vs->dev.mutex -> vhost_scsi_mutex -> tpg->tv_tpg_mutex -> vq->mutex
1669 vhost_scsi_set_endpoint(struct vhost_scsi *vs, in vhost_scsi_set_endpoint() argument
1680 mutex_lock(&vs->dev.mutex); in vhost_scsi_set_endpoint()
1683 for (index = 0; index < vs->dev.nvqs; ++index) { in vhost_scsi_set_endpoint()
1685 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_set_endpoint()
1697 if (vs->vs_tpg) in vhost_scsi_set_endpoint()
1698 memcpy(vs_tpg, vs->vs_tpg, len); in vhost_scsi_set_endpoint()
1714 if (vs->vs_tpg && vs->vs_tpg[tpg->tport_tpgt]) { in vhost_scsi_set_endpoint()
1735 tpg->vhost_scsi = vs; in vhost_scsi_set_endpoint()
1744 memcpy(vs->vs_vhost_wwpn, t->vhost_wwpn, in vhost_scsi_set_endpoint()
1745 sizeof(vs->vs_vhost_wwpn)); in vhost_scsi_set_endpoint()
1747 for (i = VHOST_SCSI_VQ_IO; i < vs->dev.nvqs; i++) { in vhost_scsi_set_endpoint()
1748 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1757 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_set_endpoint()
1758 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1771 * old vs->vs_tpg is finished. in vhost_scsi_set_endpoint()
1773 vhost_scsi_flush(vs); in vhost_scsi_set_endpoint()
1774 kfree(vs->vs_tpg); in vhost_scsi_set_endpoint()
1775 vs->vs_tpg = vs_tpg; in vhost_scsi_set_endpoint()
1780 if (!vhost_vq_get_backend(&vs->vqs[i].vq)) in vhost_scsi_set_endpoint()
1781 vhost_scsi_destroy_vq_cmds(&vs->vqs[i].vq); in vhost_scsi_set_endpoint()
1796 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_endpoint()
1801 vhost_scsi_clear_endpoint(struct vhost_scsi *vs, in vhost_scsi_clear_endpoint() argument
1812 mutex_lock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1814 for (index = 0; index < vs->dev.nvqs; ++index) { in vhost_scsi_clear_endpoint()
1815 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_clear_endpoint()
1821 if (!vs->vs_tpg) { in vhost_scsi_clear_endpoint()
1828 tpg = vs->vs_tpg[target]; in vhost_scsi_clear_endpoint()
1852 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_clear_endpoint()
1853 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
1859 vhost_scsi_flush(vs); in vhost_scsi_clear_endpoint()
1861 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_clear_endpoint()
1862 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
1872 tpg = vs->vs_tpg[target]; in vhost_scsi_clear_endpoint()
1880 vs->vs_tpg[target] = NULL; in vhost_scsi_clear_endpoint()
1891 * old vs->vs_tpg is finished. in vhost_scsi_clear_endpoint()
1893 vhost_scsi_flush(vs); in vhost_scsi_clear_endpoint()
1894 kfree(vs->vs_tpg); in vhost_scsi_clear_endpoint()
1895 vs->vs_tpg = NULL; in vhost_scsi_clear_endpoint()
1896 WARN_ON(vs->vs_events_nr); in vhost_scsi_clear_endpoint()
1897 mutex_unlock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1901 mutex_unlock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1905 static int vhost_scsi_set_features(struct vhost_scsi *vs, u64 features) in vhost_scsi_set_features() argument
1913 mutex_lock(&vs->dev.mutex); in vhost_scsi_set_features()
1915 !vhost_log_access_ok(&vs->dev)) { in vhost_scsi_set_features()
1916 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_features()
1920 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_set_features()
1921 vq = &vs->vqs[i].vq; in vhost_scsi_set_features()
1926 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_features()
1933 struct vhost_scsi *vs; in vhost_scsi_open() local
1937 vs = kvzalloc(sizeof(*vs), GFP_KERNEL); in vhost_scsi_open()
1938 if (!vs) in vhost_scsi_open()
1951 vs->old_inflight = kmalloc_array(nvqs, sizeof(*vs->old_inflight), in vhost_scsi_open()
1953 if (!vs->old_inflight) in vhost_scsi_open()
1956 vs->vqs = kmalloc_array(nvqs, sizeof(*vs->vqs), in vhost_scsi_open()
1958 if (!vs->vqs) in vhost_scsi_open()
1965 vhost_work_init(&vs->vs_event_work, vhost_scsi_evt_work); in vhost_scsi_open()
1967 vs->vs_events_nr = 0; in vhost_scsi_open()
1968 vs->vs_events_missed = false; in vhost_scsi_open()
1970 vqs[VHOST_SCSI_VQ_CTL] = &vs->vqs[VHOST_SCSI_VQ_CTL].vq; in vhost_scsi_open()
1971 vqs[VHOST_SCSI_VQ_EVT] = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_open()
1972 vs->vqs[VHOST_SCSI_VQ_CTL].vq.handle_kick = vhost_scsi_ctl_handle_kick; in vhost_scsi_open()
1973 vs->vqs[VHOST_SCSI_VQ_EVT].vq.handle_kick = vhost_scsi_evt_handle_kick; in vhost_scsi_open()
1975 svq = &vs->vqs[i]; in vhost_scsi_open()
1978 svq->vs = vs; in vhost_scsi_open()
1984 vhost_dev_init(&vs->dev, vqs, nvqs, UIO_MAXIOV, in vhost_scsi_open()
1987 vhost_scsi_init_inflight(vs, NULL); in vhost_scsi_open()
1989 f->private_data = vs; in vhost_scsi_open()
1993 kfree(vs->vqs); in vhost_scsi_open()
1995 kfree(vs->old_inflight); in vhost_scsi_open()
1997 kvfree(vs); in vhost_scsi_open()
2004 struct vhost_scsi *vs = f->private_data; in vhost_scsi_release() local
2007 mutex_lock(&vs->dev.mutex); in vhost_scsi_release()
2008 memcpy(t.vhost_wwpn, vs->vs_vhost_wwpn, sizeof(t.vhost_wwpn)); in vhost_scsi_release()
2009 mutex_unlock(&vs->dev.mutex); in vhost_scsi_release()
2010 vhost_scsi_clear_endpoint(vs, &t); in vhost_scsi_release()
2011 vhost_dev_stop(&vs->dev); in vhost_scsi_release()
2012 vhost_dev_cleanup(&vs->dev); in vhost_scsi_release()
2013 kfree(vs->dev.vqs); in vhost_scsi_release()
2014 kfree(vs->vqs); in vhost_scsi_release()
2015 kfree(vs->old_inflight); in vhost_scsi_release()
2016 kvfree(vs); in vhost_scsi_release()
2025 struct vhost_scsi *vs = f->private_data; in vhost_scsi_ioctl() local
2033 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_ioctl()
2042 return vhost_scsi_set_endpoint(vs, &backend); in vhost_scsi_ioctl()
2049 return vhost_scsi_clear_endpoint(vs, &backend); in vhost_scsi_ioctl()
2058 vs->vs_events_missed = events_missed; in vhost_scsi_ioctl()
2063 events_missed = vs->vs_events_missed; in vhost_scsi_ioctl()
2076 return vhost_scsi_set_features(vs, features); in vhost_scsi_ioctl()
2081 mutex_lock(&vs->dev.mutex); in vhost_scsi_ioctl()
2082 r = vhost_worker_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2083 mutex_unlock(&vs->dev.mutex); in vhost_scsi_ioctl()
2086 mutex_lock(&vs->dev.mutex); in vhost_scsi_ioctl()
2087 r = vhost_dev_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2090 r = vhost_vring_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2091 mutex_unlock(&vs->dev.mutex); in vhost_scsi_ioctl()
2142 struct vhost_scsi *vs = tpg->vhost_scsi; in vhost_scsi_do_plug() local
2146 if (!vs) in vhost_scsi_do_plug()
2154 vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_plug()
2164 vhost_scsi_send_evt(vs, vq, tpg, lun, in vhost_scsi_do_plug()