Page MenuHomeFreeBSD

D30743.id99467.diff
No OneTemporary

D30743.id99467.diff

Index: sys/x86/xen/xen_intr.c
===================================================================
--- sys/x86/xen/xen_intr.c
+++ sys/x86/xen/xen_intr.c
@@ -120,10 +120,6 @@
DPCPU_DECLARE(struct vcpu_info *, vcpu_info);
-#define XEN_INVALID_EVTCHN 0 /* Invalid event channel */
-
-#define is_valid_evtchn(x) ((x) != XEN_INVALID_EVTCHN)
-
struct xenisrc {
struct intsrc xi_intsrc;
enum evtchn_type xi_type;
@@ -333,10 +329,10 @@
return (isrc);
}
- if (xen_intr_auto_vector_count > NR_EVENT_CHANNELS) {
+ if (xen_intr_auto_vector_count >= NR_EVENT_CHANNELS) {
if (!warned) {
warned = 1;
- printf("%s: Event channels exhausted.\n", __func__);
+ printf("%s: Xen interrupts exhausted.\n", __func__);
}
mtx_unlock(&xen_intr_x86_lock);
return (NULL);
@@ -372,28 +368,31 @@
xen_intr_release_isrc(struct xenisrc *isrc)
{
- mtx_lock(&xen_intr_isrc_lock);
KASSERT(isrc->xi_intsrc.is_handlers == 0,
("Release called, but xenisrc still in use"));
- evtchn_mask_port(isrc->xi_port);
- evtchn_clear_port(isrc->xi_port);
+ if (isrc->xi_port < NR_EVENT_CHANNELS) {
+ mtx_lock(&xen_intr_isrc_lock);
- /* Rebind port to CPU 0. */
- evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
- evtchn_cpu_unmask_port(0, isrc->xi_port);
+ evtchn_mask_port(isrc->xi_port);
+ evtchn_clear_port(isrc->xi_port);
- if (isrc->xi_close != 0 && is_valid_evtchn(isrc->xi_port)) {
- struct evtchn_close close = { .port = isrc->xi_port };
- if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
- panic("EVTCHNOP_close failed");
- }
+ /* Rebind port to CPU 0. */
+ evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
+ evtchn_cpu_unmask_port(0, isrc->xi_port);
- xen_intr_port_to_isrc[isrc->xi_port] = NULL;
- /* not reachable from xen_intr_port_to_isrc[], unlock */
- mtx_unlock(&xen_intr_isrc_lock);
+ if (isrc->xi_close != 0) {
+ struct evtchn_close close = { .port = isrc->xi_port };
+ if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
+ panic("EVTCHNOP_close failed");
+ }
+
+ xen_intr_port_to_isrc[isrc->xi_port] = NULL;
+ /* not reachable from xen_intr_port_to_isrc[], unlock */
+ mtx_unlock(&xen_intr_isrc_lock);
+ }
isrc->xi_cpu = 0;
- isrc->xi_port = 0;
+ isrc->xi_port = ~0U;
isrc->xi_cookie = NULL;
/*
* Only when ->xi_type == EVTCHN_TYPE_UNBOUND is the isrc under control
@@ -445,9 +444,13 @@
if (isrc == NULL)
return (ENOSPC);
isrc->xi_port = local_port;
- mtx_lock(&xen_intr_isrc_lock);
- xen_intr_port_to_isrc[local_port] = isrc;
refcount_init(&isrc->xi_refcount, 1);
+ mtx_lock(&xen_intr_isrc_lock);
+ if (xen_intr_port_to_isrc[isrc->xi_port] != NULL) {
+ xen_intr_port_to_isrc[isrc->xi_port]->xi_port = ~0U;
+ isrc->xi_cpu = xen_intr_port_to_isrc[isrc->xi_port]->xi_cpu;
+ }
+ xen_intr_port_to_isrc[isrc->xi_port] = isrc;
mtx_unlock(&xen_intr_isrc_lock);
/* Assign the opaque handler */
@@ -792,7 +795,7 @@
vector = first_evtchn_irq + isrc_idx;
isrc = (struct xenisrc *)intr_lookup_source(vector);
if (isrc != NULL) {
- isrc->xi_port = 0;
+ isrc->xi_port = ~0U;
switch (isrc->xi_type) {
case EVTCHN_TYPE_IPI:
xen_rebind_ipi(isrc);
@@ -896,7 +899,7 @@
mtx_lock(&xen_intr_isrc_lock);
isrc = (struct xenisrc *)base_isrc;
- if (!is_valid_evtchn(isrc->xi_port)) {
+ if (isrc->xi_port >= NR_EVENT_CHANNELS) {
mtx_unlock(&xen_intr_isrc_lock);
return (EINVAL);
}
@@ -1315,7 +1318,8 @@
xen_intr_get_evtchn_from_port(evtchn_port_t port, xen_intr_handle_t *handlep)
{
- if (!is_valid_evtchn(port) || port >= NR_EVENT_CHANNELS)
+ /* event channel 0 is reserved, >= NR_EVENT_CHANNELS is invalid */
+ if (port == 0 || port >= NR_EVENT_CHANNELS)
return (EINVAL);
if (handlep == NULL) {

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 20, 11:43 PM (14 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31872170
Default Alt Text
D30743.id99467.diff (3 KB)

Event Timeline