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
This commit is contained in:
sephe 2016-05-23 07:32:34 +00:00
parent fc43db2e9e
commit b48bf88aec
4 changed files with 15 additions and 25 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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;

View File

@ -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;