]> xenbits.xensource.com Git - people/liuw/freebsd.git/commitdiff
blkfront: add support for unmapped IO
authorroyger <royger@FreeBSD.org>
Fri, 23 Oct 2015 15:46:42 +0000 (15:46 +0000)
committerroyger <royger@FreeBSD.org>
Fri, 23 Oct 2015 15:46:42 +0000 (15:46 +0000)
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

sys/dev/xen/blkfront/blkfront.c

index fa8d479331b4fdfc119d56f1d73622f0435cf2dd..0a75d79b1d257c5cc1efcf047c22014af39fd107 100644 (file)
@@ -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,