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()
502 struct vhost_scsi *vs = container_of(work, struct vhost_scsi, in vhost_scsi_evt_work() local
504 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_evt_work()
509 llnode = llist_del_all(&vs->vs_event_list); in vhost_scsi_evt_work()
511 vhost_scsi_do_evt_work(vs, evt); in vhost_scsi_evt_work()
512 vhost_scsi_free_evt(vs, evt); in vhost_scsi_evt_work()
591 vhost_signal(&svq->vs->dev, &svq->vq); in vhost_scsi_complete_cmd_work()
916 vhost_scsi_send_bad_target(struct vhost_scsi *vs, in vhost_scsi_send_bad_target() argument
929 vhost_add_used_and_signal(&vs->dev, vq, head, 0); in vhost_scsi_send_bad_target()
935 vhost_scsi_get_desc(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_get_desc() argument
953 if (unlikely(vhost_enable_notify(&vs->dev, vq))) { in vhost_scsi_get_desc()
954 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_get_desc()
1038 vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_handle_vq() argument
1066 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_handle_vq()
1069 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_handle_vq()
1106 * iovec sizes + incoming iovec sizes vs. virtio-scsi request + in vhost_scsi_handle_vq()
1203 cmd->tvc_vhost = vs; in vhost_scsi_handle_vq()
1241 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); in vhost_scsi_handle_vq()
1248 vhost_scsi_send_tmf_resp(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_tmf_resp() argument
1264 vhost_add_used_and_signal(&vs->dev, vq, vq_desc, 0); in vhost_scsi_send_tmf_resp()
1301 vhost_scsi_handle_tmf(struct vhost_scsi *vs, struct vhost_scsi_tpg *tpg, in vhost_scsi_handle_tmf() argument
1324 tmf->vhost = vs; in vhost_scsi_handle_tmf()
1342 vhost_scsi_send_tmf_resp(vs, vq, vc->in, vc->head, &vq->iov[vc->out], in vhost_scsi_handle_tmf()
1347 vhost_scsi_send_an_resp(struct vhost_scsi *vs, in vhost_scsi_send_an_resp() argument
1363 vhost_add_used_and_signal(&vs->dev, vq, vc->head, 0); in vhost_scsi_send_an_resp()
1369 vhost_scsi_ctl_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq) in vhost_scsi_ctl_handle_vq() argument
1391 vhost_disable_notify(&vs->dev, vq); in vhost_scsi_ctl_handle_vq()
1394 ret = vhost_scsi_get_desc(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1458 vhost_scsi_handle_tmf(vs, tpg, vq, &v_req.tmf, &vc); in vhost_scsi_ctl_handle_vq()
1460 vhost_scsi_send_an_resp(vs, vq, &vc); in vhost_scsi_ctl_handle_vq()
1471 vhost_scsi_send_bad_target(vs, vq, vc.head, vc.out); in vhost_scsi_ctl_handle_vq()
1481 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_ctl_handle_kick() local
1484 vhost_scsi_ctl_handle_vq(vs, vq); in vhost_scsi_ctl_handle_kick()
1488 vhost_scsi_send_evt(struct vhost_scsi *vs, struct vhost_virtqueue *vq, in vhost_scsi_send_evt() argument
1494 evt = vhost_scsi_allocate_evt(vs, event, reason); in vhost_scsi_send_evt()
1511 llist_add(&evt->list, &vs->vs_event_list); in vhost_scsi_send_evt()
1512 vhost_vq_work_queue(vq, &vs->vs_event_work); in vhost_scsi_send_evt()
1519 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_evt_handle_kick() local
1525 if (vs->vs_events_missed) in vhost_scsi_evt_handle_kick()
1526 vhost_scsi_send_evt(vs, vq, NULL, NULL, VIRTIO_SCSI_T_NO_EVENT, in vhost_scsi_evt_handle_kick()
1536 struct vhost_scsi *vs = container_of(vq->dev, struct vhost_scsi, dev); in vhost_scsi_handle_kick() local
1538 vhost_scsi_handle_vq(vs, vq); in vhost_scsi_handle_kick()
1542 static void vhost_scsi_flush(struct vhost_scsi *vs) in vhost_scsi_flush() argument
1547 vhost_scsi_init_inflight(vs, vs->old_inflight); in vhost_scsi_flush()
1554 for (i = 0; i < vs->dev.nvqs; i++) in vhost_scsi_flush()
1555 kref_put(&vs->old_inflight[i]->kref, vhost_scsi_done_inflight); in vhost_scsi_flush()
1558 vhost_dev_flush(&vs->dev); in vhost_scsi_flush()
1561 for (i = 0; i < vs->dev.nvqs; i++) in vhost_scsi_flush()
1562 wait_for_completion(&vs->old_inflight[i]->comp); in vhost_scsi_flush()
1656 * vs->dev.mutex -> vhost_scsi_mutex -> tpg->tv_tpg_mutex -> vq->mutex
1659 vhost_scsi_set_endpoint(struct vhost_scsi *vs, in vhost_scsi_set_endpoint() argument
1670 mutex_lock(&vs->dev.mutex); in vhost_scsi_set_endpoint()
1673 for (index = 0; index < vs->dev.nvqs; ++index) { in vhost_scsi_set_endpoint()
1675 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_set_endpoint()
1687 if (vs->vs_tpg) in vhost_scsi_set_endpoint()
1688 memcpy(vs_tpg, vs->vs_tpg, len); in vhost_scsi_set_endpoint()
1704 if (vs->vs_tpg && vs->vs_tpg[tpg->tport_tpgt]) { in vhost_scsi_set_endpoint()
1725 tpg->vhost_scsi = vs; in vhost_scsi_set_endpoint()
1734 memcpy(vs->vs_vhost_wwpn, t->vhost_wwpn, in vhost_scsi_set_endpoint()
1735 sizeof(vs->vs_vhost_wwpn)); in vhost_scsi_set_endpoint()
1737 for (i = VHOST_SCSI_VQ_IO; i < vs->dev.nvqs; i++) { in vhost_scsi_set_endpoint()
1738 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1747 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_set_endpoint()
1748 vq = &vs->vqs[i].vq; in vhost_scsi_set_endpoint()
1761 * old vs->vs_tpg is finished. in vhost_scsi_set_endpoint()
1763 vhost_scsi_flush(vs); in vhost_scsi_set_endpoint()
1764 kfree(vs->vs_tpg); in vhost_scsi_set_endpoint()
1765 vs->vs_tpg = vs_tpg; in vhost_scsi_set_endpoint()
1770 if (!vhost_vq_get_backend(&vs->vqs[i].vq)) in vhost_scsi_set_endpoint()
1771 vhost_scsi_destroy_vq_cmds(&vs->vqs[i].vq); in vhost_scsi_set_endpoint()
1786 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_endpoint()
1791 vhost_scsi_clear_endpoint(struct vhost_scsi *vs, in vhost_scsi_clear_endpoint() argument
1802 mutex_lock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1804 for (index = 0; index < vs->dev.nvqs; ++index) { in vhost_scsi_clear_endpoint()
1805 if (!vhost_vq_access_ok(&vs->vqs[index].vq)) { in vhost_scsi_clear_endpoint()
1811 if (!vs->vs_tpg) { in vhost_scsi_clear_endpoint()
1818 tpg = vs->vs_tpg[target]; in vhost_scsi_clear_endpoint()
1842 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_clear_endpoint()
1843 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
1849 vhost_scsi_flush(vs); in vhost_scsi_clear_endpoint()
1851 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_clear_endpoint()
1852 vq = &vs->vqs[i].vq; in vhost_scsi_clear_endpoint()
1862 tpg = vs->vs_tpg[target]; in vhost_scsi_clear_endpoint()
1870 vs->vs_tpg[target] = NULL; in vhost_scsi_clear_endpoint()
1881 * old vs->vs_tpg is finished. in vhost_scsi_clear_endpoint()
1883 vhost_scsi_flush(vs); in vhost_scsi_clear_endpoint()
1884 kfree(vs->vs_tpg); in vhost_scsi_clear_endpoint()
1885 vs->vs_tpg = NULL; in vhost_scsi_clear_endpoint()
1886 WARN_ON(vs->vs_events_nr); in vhost_scsi_clear_endpoint()
1887 mutex_unlock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1891 mutex_unlock(&vs->dev.mutex); in vhost_scsi_clear_endpoint()
1895 static int vhost_scsi_set_features(struct vhost_scsi *vs, u64 features) in vhost_scsi_set_features() argument
1903 mutex_lock(&vs->dev.mutex); in vhost_scsi_set_features()
1905 !vhost_log_access_ok(&vs->dev)) { in vhost_scsi_set_features()
1906 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_features()
1910 for (i = 0; i < vs->dev.nvqs; i++) { in vhost_scsi_set_features()
1911 vq = &vs->vqs[i].vq; in vhost_scsi_set_features()
1916 mutex_unlock(&vs->dev.mutex); in vhost_scsi_set_features()
1923 struct vhost_scsi *vs; in vhost_scsi_open() local
1927 vs = kvzalloc(sizeof(*vs), GFP_KERNEL); in vhost_scsi_open()
1928 if (!vs) in vhost_scsi_open()
1941 vs->old_inflight = kmalloc_array(nvqs, sizeof(*vs->old_inflight), in vhost_scsi_open()
1943 if (!vs->old_inflight) in vhost_scsi_open()
1946 vs->vqs = kmalloc_array(nvqs, sizeof(*vs->vqs), in vhost_scsi_open()
1948 if (!vs->vqs) in vhost_scsi_open()
1955 vhost_work_init(&vs->vs_event_work, vhost_scsi_evt_work); in vhost_scsi_open()
1957 vs->vs_events_nr = 0; in vhost_scsi_open()
1958 vs->vs_events_missed = false; in vhost_scsi_open()
1960 vqs[VHOST_SCSI_VQ_CTL] = &vs->vqs[VHOST_SCSI_VQ_CTL].vq; in vhost_scsi_open()
1961 vqs[VHOST_SCSI_VQ_EVT] = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_open()
1962 vs->vqs[VHOST_SCSI_VQ_CTL].vq.handle_kick = vhost_scsi_ctl_handle_kick; in vhost_scsi_open()
1963 vs->vqs[VHOST_SCSI_VQ_EVT].vq.handle_kick = vhost_scsi_evt_handle_kick; in vhost_scsi_open()
1965 svq = &vs->vqs[i]; in vhost_scsi_open()
1968 svq->vs = vs; in vhost_scsi_open()
1974 vhost_dev_init(&vs->dev, vqs, nvqs, UIO_MAXIOV, in vhost_scsi_open()
1977 vhost_scsi_init_inflight(vs, NULL); in vhost_scsi_open()
1979 f->private_data = vs; in vhost_scsi_open()
1983 kfree(vs->vqs); in vhost_scsi_open()
1985 kfree(vs->old_inflight); in vhost_scsi_open()
1987 kvfree(vs); in vhost_scsi_open()
1994 struct vhost_scsi *vs = f->private_data; in vhost_scsi_release() local
1997 mutex_lock(&vs->dev.mutex); in vhost_scsi_release()
1998 memcpy(t.vhost_wwpn, vs->vs_vhost_wwpn, sizeof(t.vhost_wwpn)); in vhost_scsi_release()
1999 mutex_unlock(&vs->dev.mutex); in vhost_scsi_release()
2000 vhost_scsi_clear_endpoint(vs, &t); in vhost_scsi_release()
2001 vhost_dev_stop(&vs->dev); in vhost_scsi_release()
2002 vhost_dev_cleanup(&vs->dev); in vhost_scsi_release()
2003 kfree(vs->dev.vqs); in vhost_scsi_release()
2004 kfree(vs->vqs); in vhost_scsi_release()
2005 kfree(vs->old_inflight); in vhost_scsi_release()
2006 kvfree(vs); in vhost_scsi_release()
2015 struct vhost_scsi *vs = f->private_data; in vhost_scsi_ioctl() local
2023 struct vhost_virtqueue *vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_ioctl()
2032 return vhost_scsi_set_endpoint(vs, &backend); in vhost_scsi_ioctl()
2039 return vhost_scsi_clear_endpoint(vs, &backend); in vhost_scsi_ioctl()
2048 vs->vs_events_missed = events_missed; in vhost_scsi_ioctl()
2053 events_missed = vs->vs_events_missed; in vhost_scsi_ioctl()
2066 return vhost_scsi_set_features(vs, features); in vhost_scsi_ioctl()
2071 mutex_lock(&vs->dev.mutex); in vhost_scsi_ioctl()
2072 r = vhost_worker_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2073 mutex_unlock(&vs->dev.mutex); in vhost_scsi_ioctl()
2076 mutex_lock(&vs->dev.mutex); in vhost_scsi_ioctl()
2077 r = vhost_dev_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2080 r = vhost_vring_ioctl(&vs->dev, ioctl, argp); in vhost_scsi_ioctl()
2081 mutex_unlock(&vs->dev.mutex); in vhost_scsi_ioctl()
2132 struct vhost_scsi *vs = tpg->vhost_scsi; in vhost_scsi_do_plug() local
2136 if (!vs) in vhost_scsi_do_plug()
2144 vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq; in vhost_scsi_do_plug()
2154 vhost_scsi_send_evt(vs, vq, tpg, lun, in vhost_scsi_do_plug()