Author: sephe
Date: Mon Apr 25 09:00:06 2016
New Revision: 298574
URL: https://svnweb.freebsd.org/changeset/base/298574

Log:
  hyperv/channel: Add functions to synchronize sub-channel offers
  
  MFC after:    1 week
  Sponsored by: Microsoft OSTC

Modified:
  head/sys/dev/hyperv/include/hyperv.h
  head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c

Modified: head/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- head/sys/dev/hyperv/include/hyperv.h        Mon Apr 25 06:08:45 2016        
(r298573)
+++ head/sys/dev/hyperv/include/hyperv.h        Mon Apr 25 09:00:06 2016        
(r298574)
@@ -818,6 +818,7 @@ typedef struct hv_vmbus_channel {
         */
        TAILQ_HEAD(, hv_vmbus_channel)  sc_list_anchor;
        TAILQ_ENTRY(hv_vmbus_channel)   sc_list_entry;
+       int                             subchan_cnt;
 
        /*
         * The primary channel this sub-channle belongs to.
@@ -914,6 +915,9 @@ int         hv_vmbus_channel_teardown_gpdal(
 struct hv_vmbus_channel* vmbus_select_outgoing_channel(struct hv_vmbus_channel 
*promary);
 
 void           vmbus_channel_cpu_set(struct hv_vmbus_channel *chan, int cpu);
+struct hv_vmbus_channel **
+               vmbus_get_subchan(struct hv_vmbus_channel *pri_chan, int 
subchan_cnt);
+void           vmbus_rel_subchan(struct hv_vmbus_channel **subchan, int 
subchan_cnt);
 
 /**
  * @brief Get physical address from virtual

Modified: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c Mon Apr 25 06:08:45 2016        
(r298573)
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c Mon Apr 25 09:00:06 2016        
(r298574)
@@ -239,6 +239,17 @@ vmbus_channel_process_offer(hv_vmbus_cha
                        new_channel->state = HV_CHANNEL_OPEN_STATE;
                        if (channel->sc_creation_callback != NULL)
                                channel->sc_creation_callback(new_channel);
+
+                       /*
+                        * Bump up sub-channel count and notify anyone that is
+                        * interested in this sub-channel, after this 
sub-channel
+                        * is setup.
+                        */
+                       mtx_lock(&channel->sc_lock);
+                       channel->subchan_cnt++;
+                       mtx_unlock(&channel->sc_lock);
+                       wakeup(channel);
+
                        return;
                }
 
@@ -771,3 +782,41 @@ vmbus_scan(void)
                mtx_sleep(&vmbus_devcnt, &vmbus_chwait_lock, 0, "waitdev", 0);
        mtx_unlock(&vmbus_chwait_lock);
 }
+
+struct hv_vmbus_channel **
+vmbus_get_subchan(struct hv_vmbus_channel *pri_chan, int subchan_cnt)
+{
+       struct hv_vmbus_channel **ret, *chan;
+       int i;
+
+       ret = malloc(subchan_cnt * sizeof(struct hv_vmbus_channel *), M_TEMP,
+           M_WAITOK);
+
+       mtx_lock(&pri_chan->sc_lock);
+
+       while (pri_chan->subchan_cnt < subchan_cnt)
+               mtx_sleep(pri_chan, &pri_chan->sc_lock, 0, "subch", 0);
+
+       i = 0;
+       TAILQ_FOREACH(chan, &pri_chan->sc_list_anchor, sc_list_entry) {
+               /* TODO: refcnt chan */
+               ret[i] = chan;
+
+               ++i;
+               if (i == subchan_cnt)
+                       break;
+       }
+       KASSERT(i == subchan_cnt, ("invalid subchan count %d, should be %d",
+           pri_chan->subchan_cnt, subchan_cnt));
+
+       mtx_unlock(&pri_chan->sc_lock);
+
+       return ret;
+}
+
+void
+vmbus_rel_subchan(struct hv_vmbus_channel **subchan, int subchan_cnt __unused)
+{
+
+       free(subchan, M_TEMP);
+}
_______________________________________________
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