aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2018-12-11 20:47:00 +0000
committerAlexander Motin <mav@FreeBSD.org>2018-12-11 20:47:00 +0000
commit49f8782283d5b64472eef5513e05399e42c34ff7 (patch)
treee5ba0439b99b5c4a7bdf263e603afdfa4443eb2e
parentcc426dd31990b8b50b210efc450e404596548ca1 (diff)
downloadsrc-49f8782283d5b64472eef5513e05399e42c34ff7.tar.gz
src-49f8782283d5b64472eef5513e05399e42c34ff7.zip
Allow CTL device specification in bhyve virtio-scsi.
There was a large refactoring done in CTL to allow multiple ioctl frontend ports (and respective devices) to be created, particularly for bhyve. Unfortunately, respective part of bhyve functionality got lost somehow from the original virtio-scsi commit. This change allows wanted device path to be specified in either of two ways: -s 6,virtio-scsi,/dev/cam/ctl1.1 -s 6,virtio-scsi,dev=/dev/cam/ctl2.3 If neither is specified, the default /dev/cam/ctl device is used. While there, remove per-queue CTL device opening, which makes no sense at this point. Reported by: wg Reviewed by: araujo MFC after: 3 days Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D18504
Notes
Notes: svn path=/head/; revision=341829
-rw-r--r--usr.sbin/bhyve/bhyve.813
-rw-r--r--usr.sbin/bhyve/pci_virtio_scsi.c45
2 files changed, 35 insertions, 23 deletions
diff --git a/usr.sbin/bhyve/bhyve.8 b/usr.sbin/bhyve/bhyve.8
index 0578676335e8..b80f5fa015db 100644
--- a/usr.sbin/bhyve/bhyve.8
+++ b/usr.sbin/bhyve/bhyve.8
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 24, 2018
+.Dd December 11, 2018
.Dt BHYVE 8
.Os
.Sh NAME
@@ -298,7 +298,16 @@ if not explicitly specified.
.Pp
SCSI devices:
.Bl -tag -width 10n
-.It Pa /dev/cam/ Ns Oo , Ns Ar port and initiator_id Oc
+.It Pa /dev/cam/ctl Ns Oo Ar pp . Ns Ar vp Oc Ns Oo , Ns Ar scsi-device-options Oc
+.El
+.Pp
+The
+.Ar scsi-device-options
+are:
+.Bl -tag -width 10n
+.It Li iid= Ns Ar IID
+Initiator ID to use when sending requests to specified CTL port.
+The default value is 0.
.El
.Pp
TTY devices:
diff --git a/usr.sbin/bhyve/pci_virtio_scsi.c b/usr.sbin/bhyve/pci_virtio_scsi.c
index 531073ffd6a3..238f07398b00 100644
--- a/usr.sbin/bhyve/pci_virtio_scsi.c
+++ b/usr.sbin/bhyve/pci_virtio_scsi.c
@@ -105,7 +105,6 @@ struct pci_vtscsi_config {
struct pci_vtscsi_queue {
struct pci_vtscsi_softc * vsq_sc;
struct vqueue_info * vsq_vq;
- int vsq_ctl_fd;
pthread_mutex_t vsq_mtx;
pthread_mutex_t vsq_qmtx;
pthread_cond_t vsq_cv;
@@ -529,7 +528,7 @@ pci_vtscsi_request_handle(struct pci_vtscsi_queue *q, struct iovec *iov_in,
sbuf_delete(sb);
}
- err = ioctl(q->vsq_ctl_fd, CTL_IO, io);
+ err = ioctl(sc->vss_ctl_fd, CTL_IO, io);
if (err != 0) {
WPRINTF(("CTL_IO: err=%d (%s)\n", errno, strerror(errno)));
cmd_wr->response = VIRTIO_SCSI_S_FAILURE;
@@ -639,14 +638,8 @@ pci_vtscsi_init_queue(struct pci_vtscsi_softc *sc,
int i;
queue->vsq_sc = sc;
- queue->vsq_ctl_fd = open("/dev/cam/ctl", O_RDWR);
queue->vsq_vq = &sc->vss_vq[num + 2];
- if (queue->vsq_ctl_fd < 0) {
- WPRINTF(("cannot open /dev/cam/ctl: %s\n", strerror(errno)));
- return (-1);
- }
-
pthread_mutex_init(&queue->vsq_mtx, NULL);
pthread_mutex_init(&queue->vsq_qmtx, NULL);
pthread_cond_init(&queue->vsq_cv, NULL);
@@ -672,26 +665,36 @@ static int
pci_vtscsi_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
{
struct pci_vtscsi_softc *sc;
- char *optname = NULL;
- char *opt;
- int i;
+ char *opt, *optname;
+ const char *devname;
+ int i, optidx = 0;
sc = calloc(1, sizeof(struct pci_vtscsi_softc));
- sc->vss_ctl_fd = open("/dev/cam/ctl", O_RDWR);
+ devname = "/dev/cam/ctl";
+ while ((opt = strsep(&opts, ",")) != NULL) {
+ optname = strsep(&opt, "=");
+ if (opt == NULL && optidx == 0) {
+ if (optname[0] != 0)
+ devname = optname;
+ } else if (strcmp(optname, "dev") == 0 && opt != NULL) {
+ devname = opt;
+ } else if (strcmp(optname, "iid") == 0 && opt != NULL) {
+ sc->vss_iid = strtoul(opt, NULL, 10);
+ } else {
+ fprintf(stderr, "Invalid option %s\n", optname);
+ free(sc);
+ return (1);
+ }
+ optidx++;
+ }
+ sc->vss_ctl_fd = open(devname, O_RDWR);
if (sc->vss_ctl_fd < 0) {
- WPRINTF(("cannot open /dev/cam/ctl: %s\n", strerror(errno)));
+ WPRINTF(("cannot open %s: %s\n", devname, strerror(errno)));
+ free(sc);
return (1);
}
- while ((opt = strsep(&opts, ",")) != NULL) {
- if ((optname = strsep(&opt, "=")) != NULL) {
- if (strcmp(optname, "iid") == 0) {
- sc->vss_iid = strtoul(opt, NULL, 10);
- }
- }
- }
-
vi_softc_linkup(&sc->vss_vs, &vtscsi_vi_consts, sc, pi, sc->vss_vq);
sc->vss_vs.vs_mtx = &sc->vss_mtx;