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

Sepherosa Ziehau sephe at FreeBSD.org
Tue May 31 04:10:17 UTC 2016


Author: sephe
Date: Tue May 31 04:10:15 2016
New Revision: 301009
URL: https://svnweb.freebsd.org/changeset/base/301009

Log:
  hyperv/vmbus: Process event timer before checking events
  
  And update comment.
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D6600

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

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c	Tue May 31 04:09:17 2016	(r301008)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c	Tue May 31 04:10:15 2016	(r301009)
@@ -124,33 +124,22 @@ handled:
 	}
 }
 
-/**
- * @brief Interrupt filter routine for VMBUS.
- *
- * The purpose of this routine is to determine the type of VMBUS protocol
- * message to process - an event or a channel message.
- */
 static inline int
 hv_vmbus_isr(struct vmbus_softc *sc, struct trapframe *frame, int cpu)
 {
 	hv_vmbus_message *msg, *msg_base;
 
-	/*
-	 * The Windows team has advised that we check for events
-	 * before checking for messages. This is the way they do it
-	 * in Windows when running as a guest in Hyper-V
-	 */
-	sc->vmbus_event_proc(sc, cpu);
-
-	/* Check if there are actual msgs to be process */
 	msg_base = VMBUS_PCPU_GET(sc, message, cpu);
 
-	/* we call eventtimer process the message */
+	/*
+	 * Check event timer.
+	 *
+	 * TODO: move this to independent IDT vector.
+	 */
 	msg = msg_base + VMBUS_SINT_TIMER;
 	if (msg->header.message_type == HV_MESSAGE_TIMER_EXPIRED) {
 		msg->header.message_type = HV_MESSAGE_TYPE_NONE;
 
-		/* call intrrupt handler of event timer */
 		vmbus_et_intr(frame);
 
 		/*
@@ -175,8 +164,20 @@ hv_vmbus_isr(struct vmbus_softc *sc, str
 		}
 	}
 
+	/*
+	 * Check events.  Hot path for network and storage I/O data; high rate.
+	 *
+	 * NOTE:
+	 * As recommended by the Windows guest fellows, we check events before
+	 * checking messages.
+	 */
+	sc->vmbus_event_proc(sc, cpu);
+
+	/*
+	 * Check messages.  Mainly management stuffs; ultra low rate.
+	 */
 	msg = msg_base + VMBUS_SINT_MESSAGE;
-	if (msg->header.message_type != HV_MESSAGE_TYPE_NONE) {
+	if (__predict_false(msg->header.message_type != HV_MESSAGE_TYPE_NONE)) {
 		taskqueue_enqueue(VMBUS_PCPU_GET(sc, message_tq, cpu),
 		    VMBUS_PCPU_PTR(sc, message_task, cpu));
 	}


More information about the svn-src-all mailing list