Author: sephe
Date: Wed Jan  4 05:41:47 2017
New Revision: 311257
URL: https://svnweb.freebsd.org/changeset/base/311257

Log:
  MFC 310651
  
      hyperv/vmbus: Nuke unnecessary critical sections.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D8906

Modified:
  stable/10/sys/dev/hyperv/vmbus/vmbus.c
  stable/10/sys/dev/hyperv/vmbus/vmbus_chan.c
  stable/10/sys/dev/hyperv/vmbus/vmbus_var.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/hyperv/vmbus/vmbus.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/vmbus.c      Wed Jan  4 05:36:38 2017        
(r311256)
+++ stable/10/sys/dev/hyperv/vmbus/vmbus.c      Wed Jan  4 05:41:47 2017        
(r311257)
@@ -1472,7 +1472,7 @@ cleanup:
                vmbus_xact_ctx_destroy(sc->vmbus_xc);
                sc->vmbus_xc = NULL;
        }
-       free(sc->vmbus_chmap, M_DEVBUF);
+       free(__DEVOLATILE(void *, sc->vmbus_chmap), M_DEVBUF);
        mtx_destroy(&sc->vmbus_prichan_lock);
        mtx_destroy(&sc->vmbus_chan_lock);
 
@@ -1534,7 +1534,7 @@ vmbus_detach(device_t dev)
                sc->vmbus_xc = NULL;
        }
 
-       free(sc->vmbus_chmap, M_DEVBUF);
+       free(__DEVOLATILE(void *, sc->vmbus_chmap), M_DEVBUF);
        mtx_destroy(&sc->vmbus_prichan_lock);
        mtx_destroy(&sc->vmbus_chan_lock);
 

Modified: stable/10/sys/dev/hyperv/vmbus/vmbus_chan.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/vmbus_chan.c Wed Jan  4 05:36:38 2017        
(r311256)
+++ stable/10/sys/dev/hyperv/vmbus/vmbus_chan.c Wed Jan  4 05:41:47 2017        
(r311257)
@@ -775,9 +775,7 @@ vmbus_chan_clrchmap_task(void *xchan, in
 {
        struct vmbus_channel *chan = xchan;
 
-       critical_enter();
        chan->ch_vmbus->vmbus_chmap[chan->ch_id] = NULL;
-       critical_exit();
 }
 
 static void
@@ -1308,15 +1306,17 @@ vmbus_chan_pollcfg_task(void *xarg, int 
        chan->ch_poll_flags = poll_flags;
 
        /*
-        * Disable interrupt from the RX bufring (TX bufring does not
-        * generate interrupt to VM), and disconnect this channel from
-        * the channel map to make sure that ISR can not enqueue this
-        * channel task anymore.
+        * Disconnect this channel from the channel map to make sure that
+        * the RX bufring interrupt enabling bit can not be touched, and
+        * ISR can not enqueue this channel task anymore.  THEN, disable
+        * interrupt from the RX bufring (TX bufring does not generate
+        * interrupt to VM).
+        *
+        * NOTE: order is critical.
         */
-       critical_enter();
-       vmbus_rxbr_intr_mask(&chan->ch_rxbr);
        chan->ch_vmbus->vmbus_chmap[chan->ch_id] = NULL;
-       critical_exit();
+       __compiler_membar();
+       vmbus_rxbr_intr_mask(&chan->ch_rxbr);
 
        /*
         * NOTE:
@@ -1380,11 +1380,9 @@ vmbus_chan_polldis_task(void *xchan, int
         * Plug this channel back to the channel map and unmask
         * the RX bufring interrupt.
         */
-       critical_enter();
        chan->ch_vmbus->vmbus_chmap[chan->ch_id] = chan;
        __compiler_membar();
        vmbus_rxbr_intr_unmask(&chan->ch_rxbr);
-       critical_exit();
 
        /*
         * Kick start the interrupt task, just in case unmasking

Modified: stable/10/sys/dev/hyperv/vmbus/vmbus_var.h
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/vmbus_var.h  Wed Jan  4 05:36:38 2017        
(r311256)
+++ stable/10/sys/dev/hyperv/vmbus/vmbus_var.h  Wed Jan  4 05:41:47 2017        
(r311257)
@@ -92,7 +92,7 @@ struct vmbus_softc {
 
        u_long                  *vmbus_rx_evtflags;
                                                /* compat evtflgs from host */
-       struct vmbus_channel    **vmbus_chmap;
+       struct vmbus_channel *volatile *vmbus_chmap;
        struct vmbus_xact_ctx   *vmbus_xc;
        struct vmbus_pcpu_data  vmbus_pcpu[MAXCPU];
 
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to