Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jun 2016 01:47:30 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r302107 - stable/10/sys/dev/hyperv/vmbus
Message-ID:  <201606230147.u5N1lUUc096034@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Thu Jun 23 01:47:30 2016
New Revision: 302107
URL: https://svnweb.freebsd.org/changeset/base/302107

Log:
  MFC 299889,299890,299892
  
  299889
      hyperv/vmbus: Simplify event processing
  
      While I'm here, remove useless comment and unnecessary return.
  
      MFC after:  1 week
      Sponsored by:       Microsoft OSTC
      Differential Revision:      https://reviews.freebsd.org/D6332
  
  299890
      hyperv/vmbus: Simplify event processing
  
      For channel0, it will never be processed on event handling path,
      so there is no need to install it.  After skipping in the channel0
      installation, we could discard the channel0 check on event
      handling hot code path.
  
      MFC after:  1 week
      Sponsored by:       Microsoft OSTC
      Differential Revision:      https://reviews.freebsd.org/D6333
  
  299892
      hyperv/vmbus: Fix event processing loop indentation.
  
      No functional changes.
  
      MFC after:  1 week
      Sponsored by:       Microsoft OSTC
      Differential Revision:      https://reviews.freebsd.org/D6334

Modified:
  stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
  stable/10/sys/dev/hyperv/vmbus/hv_connection.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Thu Jun 23 01:15:35 2016	(r302106)
+++ stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c	Thu Jun 23 01:47:30 2016	(r302107)
@@ -186,7 +186,14 @@ vmbus_channel_process_offer(hv_vmbus_cha
 	 * Make sure this is a new offer
 	 */
 	mtx_lock(&hv_vmbus_g_connection.channel_lock);
-	hv_vmbus_g_connection.channels[relid] = new_channel;
+	if (relid == 0) {
+		/*
+		 * XXX channel0 will not be processed; skip it.
+		 */
+		printf("VMBUS: got channel0 offer\n");
+	} else {
+		hv_vmbus_g_connection.channels[relid] = new_channel;
+	}
 
 	TAILQ_FOREACH(channel, &hv_vmbus_g_connection.channel_anchor,
 	    list_entry) {

Modified: stable/10/sys/dev/hyperv/vmbus/hv_connection.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hv_connection.c	Thu Jun 23 01:15:35 2016	(r302106)
+++ stable/10/sys/dev/hyperv/vmbus/hv_connection.c	Thu Jun 23 01:47:30 2016	(r302107)
@@ -303,7 +303,6 @@ hv_vmbus_on_events(int cpu)
 	int rel_id;
 	int maxdword;
 	hv_vmbus_synic_event_flags *event;
-	/* int maxdword = PAGE_SIZE >> 3; */
 
 	KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: "
 	    "cpu out of range!"));
@@ -317,9 +316,12 @@ hv_vmbus_on_events(int cpu)
 		/*
 		 * receive size is 1/2 page and divide that by 4 bytes
 		 */
-		if (synch_test_and_clear_bit(0, &event->flags32[0]))
+		if (synch_test_and_clear_bit(0, &event->flags32[0])) {
 			recv_interrupt_page =
 			    hv_vmbus_g_connection.recv_interrupt_page;
+		} else {
+			return;
+		}
 	} else {
 		/*
 		 * On Host with Win8 or above, the event page can be
@@ -333,36 +335,32 @@ hv_vmbus_on_events(int cpu)
 	/*
 	 * Check events
 	 */
-	if (recv_interrupt_page != NULL) {
-	    for (dword = 0; dword < maxdword; dword++) {
-		if (recv_interrupt_page[dword]) {
-		    for (bit = 0; bit < HV_CHANNEL_DWORD_LEN; bit++) {
+	for (dword = 0; dword < maxdword; dword++) {
+		if (recv_interrupt_page[dword] == 0)
+			continue;
+
+	        for (bit = 0; bit < HV_CHANNEL_DWORD_LEN; bit++) {
 			if (synch_test_and_clear_bit(bit,
-			    (uint32_t *) &recv_interrupt_page[dword])) {
-			    rel_id = (dword << 5) + bit;
-			    if (rel_id == 0) {
-				/*
-				 * Special case -
-				 * vmbus channel protocol msg.
-				 */
-				continue;
-			    } else {
-				hv_vmbus_channel * channel = hv_vmbus_g_connection.channels[rel_id];
+			    (uint32_t *)&recv_interrupt_page[dword])) {
+				struct hv_vmbus_channel *channel;
+
+				rel_id = (dword << 5) + bit;
+				channel =
+				    hv_vmbus_g_connection.channels[rel_id];
+
 				/* if channel is closed or closing */
 				if (channel == NULL || channel->rxq == NULL)
 					continue;
 
-				if (channel->batched_reading)
-					hv_ring_buffer_read_begin(&channel->inbound);
-				taskqueue_enqueue_fast(channel->rxq, &channel->channel_task);
-			    }
+				if (channel->batched_reading) {
+					hv_ring_buffer_read_begin(
+					    &channel->inbound);
+				}
+				taskqueue_enqueue(channel->rxq,
+				    &channel->channel_task);
 			}
-		    }
-		}
-	    }
+	        }
 	}
-
-	return;
 }
 
 /**



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