Author: sephe
Date: Tue Apr 26 05:15:15 2016
New Revision: 298616
URL: https://svnweb.freebsd.org/changeset/base/298616

Log:
  hyperv/stor: Avoid sub-channel creation callback.
  
  Since the sub-channel offers are synchronized, we can do our own
  channel setup without using the sub-channel creation callback.
  
  This paves the way to whack the sub-channel creation callback.
  
  MFC after:    1 week
  Sponsored by: Microsoft OSTC

Modified:
  head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c

Modified: head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c        Tue Apr 26 
05:08:55 2016        (r298615)
+++ head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c        Tue Apr 26 
05:15:15 2016        (r298616)
@@ -315,21 +315,14 @@ get_stor_device(struct hv_device *device
        return sc;
 }
 
-/**
- * @brief Callback handler, will be invoked when receive mutil-channel offer
- *
- * @param context  new multi-channel
- */
 static void
-storvsc_handle_sc_creation(void *context)
+storvsc_subchan_attach(struct hv_vmbus_channel *new_channel)
 {
-       hv_vmbus_channel *new_channel;
        struct hv_device *device;
        struct storvsc_softc *sc;
        struct vmstor_chan_props props;
        int ret = 0;
 
-       new_channel = (hv_vmbus_channel *)context;
        device = new_channel->device;
        sc = get_stor_device(device, TRUE);
        if (sc == NULL)
@@ -362,7 +355,7 @@ storvsc_send_multichannel_request(struct
        struct hv_storvsc_request *request;
        struct vstor_packet *vstor_packet;      
        int request_channels_cnt = 0;
-       int ret;
+       int ret, i;
 
        /* get multichannels count that need to create */
        request_channels_cnt = MIN(max_chans, mp_ncpus);
@@ -376,9 +369,6 @@ storvsc_send_multichannel_request(struct
 
        request = &sc->hs_init_req;
 
-       /* Establish a handler for multi-channel */
-       dev->channel->sc_creation_callback = storvsc_handle_sc_creation;
-
        /* request the host to create multi-channel */
        memset(request, 0, sizeof(struct hv_storvsc_request));
        
@@ -414,10 +404,14 @@ storvsc_send_multichannel_request(struct
                return;
        }
 
-       /*
-        * Wait for sub-channels setup to complete.
-        */
+       /* Wait for sub-channels setup to complete. */
        subchan = vmbus_get_subchan(dev->channel, request_channels_cnt);
+
+       /* Attach the sub-channels. */
+       for (i = 0; i < request_channels_cnt; ++i)
+               storvsc_subchan_attach(subchan[i]);
+
+       /* Release the sub-channels. */
        vmbus_rel_subchan(subchan, request_channels_cnt);
 
        if (bootverbose)
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to