Revised patch.
Add code in libxl__device_disk_string_of_backend.
Upper limit of virtio disk follows scsi.
----------8<-------------
commit eef16001490d16e9c1ea5fe84cf3f1f59e270752
Author: Wei Liu <liuw@xxxxxxxxx>
Date: Fri May 27 10:22:05 2011 +0800
libxl: basic virtio disk support.
Use "vd*" in vm config file to enable virtio disk.
Virtio disk is not storing any information in Xenstore, since it is not
backed by any backend. A new backend type NONE is added.
Upper limit of virtio disk is the same as scsi. More work is needed to
support hotplug virtio disk.
Signed-off-by: Wei Liu <liuw@xxxxxxxxx>
diff --git a/docs/misc/vbd-interface.txt b/docs/misc/vbd-interface.txt
index d97c458..83cbe39 100644
--- a/docs/misc/vbd-interface.txt
+++ b/docs/misc/vbd-interface.txt
@@ -8,7 +8,7 @@ emulated IDE or SCSI disks.
The abstract interface involves specifying, for each block device:
* Nominal disk type: Xen virtual disk (aka xvd*, the default); SCSI
- (sd*); IDE (hd*).
+ (sd*); IDE (hd*); Virtio disk (vd*).
For HVM guests, each whole-disk hd* and and sd* device is made
available _both_ via emulated IDE resp. SCSI controller, _and_ as a
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index ccf6518..aa351e2 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -975,6 +975,10 @@ int libxl_device_disk_add(libxl_ctx *ctx,
uint32_t domid, libxl_device_disk *dis
" virtual disk identifier %s", disk->vdev);
rc = ERROR_INVAL;
goto out_free;
+ } else if (devid==-2) {
+ LIBXL__LOG(ctx, LIBXL__LOG_INFO, "Using QEMU virtio backend for"
+ " virtual disk %s", disk->vdev);
+ goto out_free;
}
device.backend_devid = devid;
@@ -1028,6 +1032,9 @@ int libxl_device_disk_add(libxl_ctx *ctx,
uint32_t domid, libxl_device_disk *dis
libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
device.backend_kind = DEVICE_QDISK;
break;
+ case LIBXL_DISK_BACKEND_NONE:
+ /* Nothing to do, not a Xen VBD */
+ break;
default:
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk
backend type: %d\n", disk->backend);
rc = ERROR_INVAL;
@@ -1095,6 +1102,10 @@ int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid,
case LIBXL_DISK_BACKEND_QDISK:
device.backend_kind = DEVICE_QDISK;
break;
+ case LIBXL_DISK_BACKEND_NONE:
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to delete a
none backend\n");
+ rc = ERROR_INVAL;
+ goto out_free;
default:
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk
backend type: %d\n",
disk->backend);
@@ -1167,6 +1178,9 @@ char * libxl_device_disk_local_attach(libxl_ctx
*ctx, libxl_device_disk *disk)
disk->pdev_path);
dev = disk->pdev_path;
break;
+ case LIBXL_DISK_BACKEND_NONE:
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to attach a
none backend\n");
+ break;
case LIBXL_DISK_BACKEND_UNKNOWN:
default:
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend "
diff --git a/tools/libxl/libxl.idl b/tools/libxl/libxl.idl
index a5be66f..6b27eae 100644
--- a/tools/libxl/libxl.idl
+++ b/tools/libxl/libxl.idl
@@ -54,6 +54,7 @@ libxl_disk_backend = Enumeration("disk_backend", [
(1, "PHY"),
(2, "TAP"),
(3, "QDISK"),
+ (4, "NONE"),
])
libxl_nic_type = Enumeration("nic_type", [
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 5d85822..2bce7d7 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -136,6 +136,7 @@ char
*libxl__device_disk_string_of_backend(libxl_disk_backend backend)
case LIBXL_DISK_BACKEND_QDISK: return "qdisk";
case LIBXL_DISK_BACKEND_TAP: return "phy";
case LIBXL_DISK_BACKEND_PHY: return "phy";
+ case LIBXL_DISK_BACKEND_NONE: return "none";
default: return NULL;
}
}
@@ -239,6 +240,13 @@ int libxl__device_disk_dev_number(char *virtpath,
int *pdisk, int *ppartition)
if (ppartition) *ppartition = partition;
return (8 << 8) | (disk << 4) | partition;
}
+ if (device_virtdisk_matches(virtpath, "vd",
+ &disk, 15,
+ &partition, 15)) {
+ if (pdisk) *pdisk = disk;
+ if (ppartition) *ppartition = partition;
+ return -2;
+ }
return -1;
}
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 76479fe..407e8c5 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -419,6 +419,10 @@ static char **
libxl__build_device_model_args_new(libxl__gc *gc,
drive = libxl__sprintf
(gc, "file=%s,if=scsi,bus=0,unit=%d,format=%s",
disks[i].pdev_path, disk, format);
+ else if (strncmp(disks[i].vdev, "vd", 2) == 0)
+ drive = libxl__sprintf
+ (gc, "file=%s,if=virtio,index=%d,media=disk,format=%s",
+ disks[i].pdev_path, disk, format);
else if (disk < 4)
drive = libxl__sprintf
(gc, "file=%s,if=ide,index=%d,media=disk,format=%s",
@@ -976,6 +980,7 @@ int libxl__need_xenpv_qemu(libxl__gc *gc,
case LIBXL_DISK_BACKEND_PHY:
case LIBXL_DISK_BACKEND_UNKNOWN:
+ case LIBXL_DISK_BACKEND_NONE:
break;
}
}
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index 68b5a9a..7785c24 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -300,6 +300,8 @@ int libxl_string_to_backend(libxl_ctx *ctx, char
*s, libxl_disk_backend *backend
} else if (!strcmp(p, "qcow2")) {
*backend = LIBXL_DISK_BACKEND_QDISK;
}
+ } else if (!strcmp(s, "none")) {
+ *backend = LIBXL_DISK_BACKEND_NONE;
}
out:
return rc;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|