Author: sephe
Date: Tue Mar 22 06:13:27 2016
New Revision: 297177
URL: https://svnweb.freebsd.org/changeset/base/297177

Log:
  hyperv/vmbus: Use taskqueue_fast for non-performance critical messages
  
  This gets rid of the per-cpu SWIs.
  
  Submitted by: Jun Su <junsu microsoft com>
  Reviewed by:  Dexuan Cui <decui microsoft com>, sephe
  MFC after:    1 week
  Sponsored by: Microsoft OSTC
  Differential Revision:        https://reviews.freebsd.org/D5215

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

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c    Tue Mar 22 05:48:51 
2016        (r297176)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c    Tue Mar 22 06:13:27 
2016        (r297177)
@@ -76,7 +76,7 @@ static char *vmbus_ids[] = { "VMBUS", NU
  * the hypervisor.
  */
 static void
-vmbus_msg_swintr(void *arg)
+vmbus_msg_swintr(void *arg, int pending __unused)
 {
        int                     cpu;
        void*                   page_addr;
@@ -204,7 +204,7 @@ hv_vmbus_isr(struct trapframe *frame)
 
        msg = (hv_vmbus_message*) page_addr + HV_VMBUS_MESSAGE_SINT;
        if (msg->header.message_type != HV_MESSAGE_TYPE_NONE) {
-               swi_sched(hv_vmbus_g_context.msg_swintr[cpu], 0);
+               taskqueue_enqueue(taskqueue_fast, 
&hv_vmbus_g_context.hv_msg_task[cpu]);
        }
 
        return (FILTER_HANDLED);
@@ -510,9 +510,6 @@ vmbus_bus_init(void)
        setup_args.vector = hv_vmbus_g_context.hv_cb_vector;
 
        CPU_FOREACH(j) {
-               hv_vmbus_g_context.hv_msg_intr_event[j] = NULL;
-               hv_vmbus_g_context.msg_swintr[j] = NULL;
-
                snprintf(buf, sizeof(buf), "cpu%d:hyperv", j);
                intrcnt_add(buf, &hv_vmbus_intr_cpu[j]);
 
@@ -539,30 +536,9 @@ vmbus_bus_init(void)
                        "hvevent%d", j);
 
                /*
-                * Setup software interrupt thread and handler for msg handling.
+                * Setup tasks to handle msg
                 */
-               ret = swi_add(&hv_vmbus_g_context.hv_msg_intr_event[j],
-                   "hv_msg", vmbus_msg_swintr, (void *)(long)j, SWI_CLOCK, 0,
-                   &hv_vmbus_g_context.msg_swintr[j]);
-               if (ret) {
-                       if(bootverbose)
-                               printf("VMBUS: failed to setup msg swi for "
-                                   "cpu %d\n", j);
-                       goto cleanup1;
-               }
-
-               /*
-                * Bind the swi thread to the cpu.
-                */
-               ret = intr_event_bind(hv_vmbus_g_context.hv_msg_intr_event[j],
-                   j);
-               if (ret) {
-                       if(bootverbose)
-                               printf("VMBUS: failed to bind msg swi thread "
-                                   "to cpu %d\n", j);
-                       goto cleanup1;
-               }
-
+               TASK_INIT(&hv_vmbus_g_context.hv_msg_task[j], 0, 
vmbus_msg_swintr, (void *)(long)j);
                /*
                 * Prepare the per cpu msg and event pages to be called on each 
cpu.
                 */
@@ -601,11 +577,10 @@ vmbus_bus_init(void)
         * remove swi and vmbus callback vector;
         */
        CPU_FOREACH(j) {
-               if (hv_vmbus_g_context.hv_event_queue[j] != NULL)
+               if (hv_vmbus_g_context.hv_event_queue[j] != NULL) {
                        taskqueue_free(hv_vmbus_g_context.hv_event_queue[j]);
-               if (hv_vmbus_g_context.msg_swintr[j] != NULL)
-                       swi_remove(hv_vmbus_g_context.msg_swintr[j]);
-               hv_vmbus_g_context.hv_msg_intr_event[j] = NULL; 
+                       hv_vmbus_g_context.hv_event_queue[j] = NULL;
+               }
        }
 
        vmbus_vector_free(hv_vmbus_g_context.hv_cb_vector);
@@ -670,11 +645,10 @@ vmbus_bus_exit(void)
 
        /* remove swi */
        CPU_FOREACH(i) {
-               if (hv_vmbus_g_context.hv_event_queue[i] != NULL)
+               if (hv_vmbus_g_context.hv_event_queue[i] != NULL) {
                        taskqueue_free(hv_vmbus_g_context.hv_event_queue[i]);
-               if (hv_vmbus_g_context.msg_swintr[i] != NULL)
-                       swi_remove(hv_vmbus_g_context.msg_swintr[i]);
-               hv_vmbus_g_context.hv_msg_intr_event[i] = NULL; 
+                       hv_vmbus_g_context.hv_event_queue[i] = NULL;
+               }
        }
 
        vmbus_vector_free(hv_vmbus_g_context.hv_cb_vector);

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h   Tue Mar 22 05:48:51 2016        
(r297176)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h   Tue Mar 22 06:13:27 2016        
(r297177)
@@ -204,8 +204,7 @@ typedef struct {
         * event and msg handling.
         */
        struct taskqueue                *hv_event_queue[MAXCPU];
-       struct intr_event               *hv_msg_intr_event[MAXCPU];
-       void                            *msg_swintr[MAXCPU];
+       struct task                     hv_msg_task[MAXCPU];
        /*
         * Host use this vector to intrrupt guest for vmbus channel
         * event and msg.
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to