svn commit: r302813 - head/sys/dev/hyperv/vmbus

Sepherosa Ziehau sephe at FreeBSD.org
Thu Jul 14 07:09:01 UTC 2016


Author: sephe
Date: Thu Jul 14 07:08:59 2016
New Revision: 302813
URL: https://svnweb.freebsd.org/changeset/base/302813

Log:
  hyperv/vmbus: Cleanup vmbus_chan_add()
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D7106

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

Modified: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Thu Jul 14 06:59:04 2016	(r302812)
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Thu Jul 14 07:08:59 2016	(r302813)
@@ -108,105 +108,85 @@ vmbus_chan_free(struct hv_vmbus_channel 
 	free(chan, M_DEVBUF);
 }
 
-/**
- * @brief Process the offer by creating a channel/device
- * associated with this offer
- */
 static int
-vmbus_chan_add(hv_vmbus_channel *new_channel)
+vmbus_chan_add(struct hv_vmbus_channel *newchan)
 {
-	struct vmbus_softc *sc = new_channel->vmbus_sc;
-	hv_vmbus_channel*	channel;
+	struct vmbus_softc *sc = newchan->vmbus_sc;
+	struct hv_vmbus_channel *prichan;
 
-	/*
-	 * Make sure this is a new offer
-	 */
-	mtx_lock(&sc->vmbus_chlist_lock);
-	if (new_channel->ch_id == 0) {
+	if (newchan->ch_id == 0) {
 		/*
 		 * XXX
 		 * Chan0 will neither be processed nor should be offered;
 		 * skip it.
 		 */
-		mtx_unlock(&sc->vmbus_chlist_lock);
-		device_printf(sc->vmbus_dev, "got chan0 offer\n");
+		device_printf(sc->vmbus_dev, "got chan0 offer, discard\n");
 		return EINVAL;
-	} else {
-		sc->vmbus_chmap[new_channel->ch_id] = new_channel;
+	} else if (newchan->ch_id >= VMBUS_CHAN_MAX) {
+		device_printf(sc->vmbus_dev, "invalid chan%u offer\n",
+		    newchan->ch_id);
+		return EINVAL;
+	}
+	sc->vmbus_chmap[newchan->ch_id] = newchan;
+
+	if (bootverbose) {
+		device_printf(sc->vmbus_dev, "chan%u subidx%u offer\n",
+		    newchan->ch_id, newchan->ch_subidx);
 	}
 
-	TAILQ_FOREACH(channel, &sc->vmbus_chlist, ch_link) {
-		if (memcmp(&channel->ch_guid_type, &new_channel->ch_guid_type,
+	mtx_lock(&sc->vmbus_chlist_lock);
+	TAILQ_FOREACH(prichan, &sc->vmbus_chlist, ch_link) {
+		if (memcmp(&prichan->ch_guid_type, &newchan->ch_guid_type,
 		    sizeof(struct hyperv_guid)) == 0 &&
-		    memcmp(&channel->ch_guid_inst, &new_channel->ch_guid_inst,
+		    memcmp(&prichan->ch_guid_inst, &newchan->ch_guid_inst,
 		    sizeof(struct hyperv_guid)) == 0)
 			break;
 	}
-
-	if (channel == NULL) {
+	if (prichan == NULL) {
 		/* Install the new primary channel */
-		TAILQ_INSERT_TAIL(&sc->vmbus_chlist, new_channel, ch_link);
+		TAILQ_INSERT_TAIL(&sc->vmbus_chlist, newchan, ch_link);
 	}
 	mtx_unlock(&sc->vmbus_chlist_lock);
 
-	if (bootverbose) {
-		char logstr[64];
-
-		logstr[0] = '\0';
-		if (channel != NULL) {
-			snprintf(logstr, sizeof(logstr), ", primary chan%u",
-			    channel->ch_id);
+	if (prichan != NULL) {
+		if (newchan->ch_subidx == 0) {
+			device_printf(sc->vmbus_dev, "duplicated primary "
+			    "chan%u\n", newchan->ch_id);
+			return EINVAL;
 		}
-		device_printf(sc->vmbus_dev, "chan%u subchanid%u offer%s\n",
-		    new_channel->ch_id,
-		    new_channel->ch_subidx, logstr);
-	}
 
-	if (channel != NULL) {
 		/*
-		 * Check if this is a sub channel.
+		 * This is a sub-channel.
 		 */
-		if (new_channel->ch_subidx != 0) {
-			/*
-			 * It is a sub channel offer, process it.
-			 */
-			new_channel->primary_channel = channel;
-			new_channel->ch_dev = channel->ch_dev;
-			mtx_lock(&channel->sc_lock);
-			TAILQ_INSERT_TAIL(&channel->sc_list_anchor,
-			    new_channel, sc_list_entry);
-			mtx_unlock(&channel->sc_lock);
-
-			/*
-			 * Insert the new channel to the end of the global
-			 * channel list.
-			 *
-			 * NOTE:
-			 * The new sub-channel MUST be inserted AFTER it's
-			 * primary channel, so that the primary channel will
-			 * be found in the above loop for its baby siblings.
-			 */
-			mtx_lock(&sc->vmbus_chlist_lock);
-			TAILQ_INSERT_TAIL(&sc->vmbus_chlist, new_channel,
-			    ch_link);
-			mtx_unlock(&sc->vmbus_chlist_lock);
-
-			/*
-			 * 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);
+		newchan->primary_channel = prichan;
+		newchan->ch_dev = prichan->ch_dev;
+		mtx_lock(&prichan->sc_lock);
+		TAILQ_INSERT_TAIL(&prichan->sc_list_anchor, newchan,
+		    sc_list_entry);
+		mtx_unlock(&prichan->sc_lock);
 
-			return 0;
-		}
+		/*
+		 * Insert the new channel to the end of the global
+		 * channel list.
+		 *
+		 * NOTE:
+		 * The new sub-channel MUST be inserted AFTER it's
+		 * primary channel, so that the primary channel will
+		 * be found in the above loop for its baby siblings.
+		 */
+		mtx_lock(&sc->vmbus_chlist_lock);
+		TAILQ_INSERT_TAIL(&sc->vmbus_chlist, newchan, ch_link);
+		mtx_unlock(&sc->vmbus_chlist_lock);
 
-		device_printf(sc->vmbus_dev, "duplicated primary chan%u\n",
-		    new_channel->ch_id);
-		return EINVAL;
+		/*
+		 * Bump up sub-channel count and notify anyone that is
+		 * interested in this sub-channel, after this sub-channel
+		 * is setup.
+		 */
+		mtx_lock(&prichan->sc_lock);
+		prichan->subchan_cnt++;
+		mtx_unlock(&prichan->sc_lock);
+		wakeup(prichan);
 	}
 	return 0;
 }


More information about the svn-src-head mailing list