Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Jul 2016 06:29:12 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r302809 - head/sys/dev/hyperv/vmbus
Message-ID:  <201607140629.u6E6TCTY060647@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Thu Jul 14 06:29:12 2016
New Revision: 302809
URL: https://svnweb.freebsd.org/changeset/base/302809

Log:
  hyperv/vmbus: Move device register and channel free to the caller.
  
  This paves the way for more cleanup/disentangle.
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D7102

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:18:11 2016	(r302808)
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Thu Jul 14 06:29:12 2016	(r302809)
@@ -114,8 +114,8 @@ vmbus_chan_free(struct hv_vmbus_channel 
  * @brief Process the offer by creating a channel/device
  * associated with this offer
  */
-static void
-vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
+static int
+vmbus_chan_add(hv_vmbus_channel *new_channel)
 {
 	struct vmbus_softc *sc = new_channel->vmbus_sc;
 	hv_vmbus_channel*	channel;
@@ -126,9 +126,13 @@ vmbus_channel_process_offer(hv_vmbus_cha
 	mtx_lock(&sc->vmbus_chlist_lock);
 	if (new_channel->ch_id == 0) {
 		/*
-		 * XXX channel0 will not be processed; skip it.
+		 * XXX
+		 * Chan0 will neither be processed nor should be offered;
+		 * skip it.
 		 */
-		printf("VMBUS: got channel0 offer\n");
+		mtx_unlock(&sc->vmbus_chlist_lock);
+		device_printf(sc->vmbus_dev, "got chan0 offer\n");
+		return EINVAL;
 	} else {
 		sc->vmbus_chmap[new_channel->ch_id] = new_channel;
 	}
@@ -201,27 +205,16 @@ vmbus_channel_process_offer(hv_vmbus_cha
 			mtx_unlock(&channel->sc_lock);
 			wakeup(channel);
 
-			return;
+			return 0;
 		}
 
-		printf("VMBUS: duplicated primary channel%u\n",
+		device_printf(sc->vmbus_dev, "duplicated primary chan%u\n",
 		    new_channel->ch_id);
-		vmbus_chan_free(new_channel);
-		return;
+		return EINVAL;
 	}
 
 	new_channel->state = HV_CHANNEL_OPEN_STATE;
-
-	/*
-	 * Add the new device to the bus. This will kick off device-driver
-	 * binding which eventually invokes the device driver's AddDevice()
-	 * method.
-	 *
-	 * NOTE:
-	 * Error is ignored here; don't have much to do if error really
-	 * happens.
-	 */
-	hv_vmbus_child_device_register(new_channel);
+	return 0;
 }
 
 void
@@ -286,6 +279,7 @@ vmbus_channel_on_offer_internal(struct v
     const struct vmbus_chanmsg_choffer *offer)
 {
 	hv_vmbus_channel* new_channel;
+	int error;
 
 	/*
 	 * Allocate the channel object and save this offer
@@ -323,7 +317,24 @@ vmbus_channel_on_offer_internal(struct v
 	/* Select default cpu for this channel. */
 	vmbus_channel_select_defcpu(new_channel);
 
-	vmbus_channel_process_offer(new_channel);
+	error = vmbus_chan_add(new_channel);
+	if (error) {
+		device_printf(sc->vmbus_dev, "add chan%u failed: %d\n",
+		    new_channel->ch_id, error);
+		vmbus_chan_free(new_channel);
+		return;
+	}
+
+	if (HV_VMBUS_CHAN_ISPRIMARY(new_channel)) {
+		/*
+		 * Add device for this primary channel.
+		 *
+		 * NOTE:
+		 * Error is ignored here; don't have much to do if error
+		 * really happens.
+		 */
+		hv_vmbus_child_device_register(new_channel);
+	}
 }
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607140629.u6E6TCTY060647>