aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Pau Monné <royger@FreeBSD.org>2015-10-23 15:46:42 +0000
committerRoger Pau Monné <royger@FreeBSD.org>2015-10-23 15:46:42 +0000
commitee74891fc77ba693965dd9306339107c5bd523a4 (patch)
tree7652c4552b790399fb8fb841aaf13123fd0b63e6
parentec9f6de7d25706248f0c969eff3a027fdf834f3e (diff)
downloadsrc-ee74891fc77ba693965dd9306339107c5bd523a4.tar.gz
src-ee74891fc77ba693965dd9306339107c5bd523a4.zip
blkfront: add support for unmapped IO
Using unmapped IO is really beneficial when running inside of a VM, since it avoids IPIs to other vCPUs in order to invalidate the mappings. This patch adds unmapped IO support to blkfront. The following tests results have been obtained when running on a Xen host without HAP: PVHVM 3165.84 real 6354.17 user 4483.32 sys PVHVM with unmapped IO 2099.46 real 4624.52 user 2967.38 sys This is because when running using shadow page tables TLB flushes and range invalidations are much more expensive, so using unmapped IO provides a very important performance boost. Sponsored by: Citrix Systems R&D MFC after: 2 weeks X-MFC-with: r289834
Notes
Notes: svn path=/head/; revision=289836
-rw-r--r--sys/dev/xen/blkfront/blkfront.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c
index fa8d479331b4..0a75d79b1d25 100644
--- a/sys/dev/xen/blkfront/blkfront.c
+++ b/sys/dev/xen/blkfront/blkfront.c
@@ -293,8 +293,12 @@ xbd_queue_request(struct xbd_softc *sc, struct xbd_command *cm)
{
int error;
- error = bus_dmamap_load(sc->xbd_io_dmat, cm->cm_map, cm->cm_data,
- cm->cm_datalen, xbd_queue_cb, cm, 0);
+ if (cm->cm_bp != NULL)
+ error = bus_dmamap_load_bio(sc->xbd_io_dmat, cm->cm_map,
+ cm->cm_bp, xbd_queue_cb, cm, 0);
+ else
+ error = bus_dmamap_load(sc->xbd_io_dmat, cm->cm_map,
+ cm->cm_data, cm->cm_datalen, xbd_queue_cb, cm, 0);
if (error == EINPROGRESS) {
/*
* Maintain queuing order by freezing the queue. The next
@@ -354,8 +358,6 @@ xbd_bio_command(struct xbd_softc *sc)
}
cm->cm_bp = bp;
- cm->cm_data = bp->bio_data;
- cm->cm_datalen = bp->bio_bcount;
cm->cm_sector_number = (blkif_sector_t)bp->bio_pblkno;
switch (bp->bio_cmd) {
@@ -1009,7 +1011,7 @@ xbd_instance_create(struct xbd_softc *sc, blkif_sector_t sectors,
sc->xbd_disk->d_mediasize = sectors * sector_size;
sc->xbd_disk->d_maxsize = sc->xbd_max_request_size;
- sc->xbd_disk->d_flags = 0;
+ sc->xbd_disk->d_flags = DISKFLAG_UNMAPPED_BIO;
if ((sc->xbd_flags & (XBDF_FLUSH|XBDF_BARRIER)) != 0) {
sc->xbd_disk->d_flags |= DISKFLAG_CANFLUSHCACHE;
device_printf(sc->xbd_dev,