Author: royger
Date: Fri Oct 23 15:46:42 2015
New Revision: 289836
URL: https://svnweb.freebsd.org/changeset/base/289836

Log:
  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

Modified:
  head/sys/dev/xen/blkfront/blkfront.c

Modified: head/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- head/sys/dev/xen/blkfront/blkfront.c        Fri Oct 23 15:40:44 2015        
(r289835)
+++ head/sys/dev/xen/blkfront/blkfront.c        Fri Oct 23 15:46:42 2015        
(r289836)
@@ -293,8 +293,12 @@ xbd_queue_request(struct xbd_softc *sc, 
 {
        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
 
        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,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to