Author: sephe
Date: Mon May 23 07:32:34 2016
New Revision: 300487
URL: https://svnweb.freebsd.org/changeset/base/300487

Log:
  hyperv/vmbus: Move IDT vector to vmbus_softc
  
  Prepare to get rid of the hv_setup_arg.
  
  MFC after:    1 week
  Sponsored by: Microsoft OSTC
  Differential Revision:        https://reviews.freebsd.org/D6449

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

Modified: head/sys/dev/hyperv/vmbus/hv_hv.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_hv.c   Mon May 23 07:23:19 2016        
(r300486)
+++ head/sys/dev/hyperv/vmbus/hv_hv.c   Mon May 23 07:32:34 2016        
(r300487)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/hyperv/include/hyperv_busdma.h>
 #include <dev/hyperv/vmbus/hv_vmbus_priv.h>
 #include <dev/hyperv/vmbus/hyperv_reg.h>
+#include <dev/hyperv/vmbus/vmbus_var.h>
 
 #define HV_NANOSECONDS_PER_SEC         1000000000L
 
@@ -220,8 +221,8 @@ hv_vmbus_signal_event(void *con_id)
  */
 void
 hv_vmbus_synic_init(void *arg)
-
 {
+       struct vmbus_softc *sc = vmbus_get_softc();
        int                     cpu;
        uint64_t                hv_vcpu_index;
        hv_vmbus_synic_simp     simp;
@@ -266,7 +267,7 @@ hv_vmbus_synic_init(void *arg)
 
        /*HV_SHARED_SINT_IDT_VECTOR + 0x20; */
        shared_sint.as_uint64_t = 0;
-       shared_sint.u.vector = setup_args->vector;
+       shared_sint.u.vector = sc->vmbus_idtvec;
        shared_sint.u.masked = FALSE;
        shared_sint.u.auto_eoi = TRUE;
 

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c    Mon May 23 07:23:19 
2016        (r300486)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c    Mon May 23 07:32:34 
2016        (r300487)
@@ -385,25 +385,18 @@ vmbus_bus_init(void)
        sc = vmbus_get_softc();
 
        /*
-        * Find a free IDT slot for vmbus callback.
+        * Find a free IDT vector for vmbus messages/events.
         */
-       hv_vmbus_g_context.hv_cb_vector = 
lapic_ipi_alloc(IDTVEC(hv_vmbus_callback));
-       if (hv_vmbus_g_context.hv_cb_vector < 0) {
-               if(bootverbose)
-                       printf("Error VMBUS: Cannot find free IDT slot for "
-                           "vmbus callback!\n");
+       sc->vmbus_idtvec = lapic_ipi_alloc(IDTVEC(hv_vmbus_callback));
+       if (sc->vmbus_idtvec < 0) {
+               device_printf(sc->vmbus_dev, "cannot find free IDT vector\n");
                ret = ENXIO;
                goto cleanup;
        }
-
-       if(bootverbose)
-               printf("VMBUS: vmbus callback vector %d\n",
-                   hv_vmbus_g_context.hv_cb_vector);
-
-       /*
-        * Notify the hypervisor of our vector.
-        */
-       setup_args.vector = hv_vmbus_g_context.hv_cb_vector;
+       if(bootverbose) {
+               device_printf(sc->vmbus_dev, "vmbus IDT vector %d\n",
+                   sc->vmbus_idtvec);
+       }
 
        CPU_FOREACH(j) {
                snprintf(buf, sizeof(buf), "cpu%d:hyperv", j);
@@ -493,7 +486,7 @@ vmbus_bus_init(void)
                }
        }
 
-       lapic_ipi_free(hv_vmbus_g_context.hv_cb_vector);
+       lapic_ipi_free(sc->vmbus_idtvec);
 
        cleanup:
        return (ret);
@@ -553,6 +546,7 @@ vmbus_sysinit(void *arg __unused)
 static int
 vmbus_detach(device_t dev)
 {
+       struct vmbus_softc *sc = device_get_softc(dev);
        int i;
 
        hv_vmbus_release_unattached_channels();
@@ -573,7 +567,7 @@ vmbus_detach(device_t dev)
                }
        }
 
-       lapic_ipi_free(hv_vmbus_g_context.hv_cb_vector);
+       lapic_ipi_free(sc->vmbus_idtvec);
 
        return (0);
 }

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h   Mon May 23 07:23:19 2016        
(r300486)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h   Mon May 23 07:32:34 2016        
(r300487)
@@ -216,11 +216,6 @@ typedef struct {
        struct taskqueue                *hv_event_queue[MAXCPU];
        struct taskqueue                *hv_msg_tq[MAXCPU];
        struct task                     hv_msg_task[MAXCPU];
-       /*
-        * Host use this vector to interrupt guest for vmbus channel
-        * event and msg.
-        */
-       int                             hv_cb_vector;
 } hv_vmbus_context;
 
 /*
@@ -763,7 +758,6 @@ void                        hv_et_intr(struct trapframe*);
 void                   vmbus_scan(void);
 
 typedef struct {
-       unsigned int    vector;
        void            *page_buffers[2 * MAXCPU];
 } hv_setup_args;
 

Modified: head/sys/dev/hyperv/vmbus/vmbus_var.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_var.h       Mon May 23 07:23:19 2016        
(r300486)
+++ head/sys/dev/hyperv/vmbus/vmbus_var.h       Mon May 23 07:32:34 2016        
(r300487)
@@ -39,6 +39,7 @@ struct vmbus_softc {
        void                    (*vmbus_event_proc)(struct vmbus_softc *, int);
        struct vmbus_pcpu_data  vmbus_pcpu[MAXCPU];
        device_t                vmbus_dev;
+       int                     vmbus_idtvec;
 };
 
 extern struct vmbus_softc      *vmbus_sc;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to