diff options
author | David Vrabel <david.vrabel@citrix.com> | 2013-09-23 16:03:38 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2014-01-06 10:07:50 -0500 |
commit | 0dc0064add422bc0ef5165ebe9ece3052bbd457d (patch) | |
tree | 29dff7edc3c45bf038e3b36a53d3bf4a647f29ff | |
parent | fd21069dfe31a4b20f5ef580006abe72d1660f5b (diff) |
xen/evtchn: support more than 4096 ports
Remove the check during unbind for NR_EVENT_CHANNELS as this limits
support to less than 4096 ports.
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
-rw-r--r-- | drivers/xen/events/events_base.c | 13 | ||||
-rw-r--r-- | drivers/xen/events/events_internal.h | 5 | ||||
-rw-r--r-- | drivers/xen/evtchn.c | 2 | ||||
-rw-r--r-- | include/xen/events.h | 2 |
4 files changed, 16 insertions, 6 deletions
diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c index c6d64f1e191c..9d0d88cf74af 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c | |||
@@ -952,6 +952,19 @@ static int find_virq(unsigned int virq, unsigned int cpu) | |||
952 | return rc; | 952 | return rc; |
953 | } | 953 | } |
954 | 954 | ||
955 | /** | ||
956 | * xen_evtchn_nr_channels - number of usable event channel ports | ||
957 | * | ||
958 | * This may be less than the maximum supported by the current | ||
959 | * hypervisor ABI. Use xen_evtchn_max_channels() for the maximum | ||
960 | * supported. | ||
961 | */ | ||
962 | unsigned xen_evtchn_nr_channels(void) | ||
963 | { | ||
964 | return evtchn_ops->nr_channels(); | ||
965 | } | ||
966 | EXPORT_SYMBOL_GPL(xen_evtchn_nr_channels); | ||
967 | |||
955 | int bind_virq_to_irq(unsigned int virq, unsigned int cpu) | 968 | int bind_virq_to_irq(unsigned int virq, unsigned int cpu) |
956 | { | 969 | { |
957 | struct evtchn_bind_virq bind_virq; | 970 | struct evtchn_bind_virq bind_virq; |
diff --git a/drivers/xen/events/events_internal.h b/drivers/xen/events/events_internal.h index a3d9aeceda1a..2862e1cccf1c 100644 --- a/drivers/xen/events/events_internal.h +++ b/drivers/xen/events/events_internal.h | |||
@@ -85,11 +85,6 @@ static inline unsigned xen_evtchn_max_channels(void) | |||
85 | return evtchn_ops->max_channels(); | 85 | return evtchn_ops->max_channels(); |
86 | } | 86 | } |
87 | 87 | ||
88 | static inline unsigned xen_evtchn_nr_channels(void) | ||
89 | { | ||
90 | return evtchn_ops->nr_channels(); | ||
91 | } | ||
92 | |||
93 | /* | 88 | /* |
94 | * Do any ABI specific setup for a bound event channel before it can | 89 | * Do any ABI specific setup for a bound event channel before it can |
95 | * be unmasked and used. | 90 | * be unmasked and used. |
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c index 5de2063e16d3..00f40f051d95 100644 --- a/drivers/xen/evtchn.c +++ b/drivers/xen/evtchn.c | |||
@@ -417,7 +417,7 @@ static long evtchn_ioctl(struct file *file, | |||
417 | break; | 417 | break; |
418 | 418 | ||
419 | rc = -EINVAL; | 419 | rc = -EINVAL; |
420 | if (unbind.port >= NR_EVENT_CHANNELS) | 420 | if (unbind.port >= xen_evtchn_nr_channels()) |
421 | break; | 421 | break; |
422 | 422 | ||
423 | rc = -ENOTCONN; | 423 | rc = -ENOTCONN; |
diff --git a/include/xen/events.h b/include/xen/events.h index 32ae0f263749..55b42cc997f6 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
@@ -7,6 +7,8 @@ | |||
7 | #include <asm/xen/hypercall.h> | 7 | #include <asm/xen/hypercall.h> |
8 | #include <asm/xen/events.h> | 8 | #include <asm/xen/events.h> |
9 | 9 | ||
10 | unsigned xen_evtchn_nr_channels(void); | ||
11 | |||
10 | int bind_evtchn_to_irq(unsigned int evtchn); | 12 | int bind_evtchn_to_irq(unsigned int evtchn); |
11 | int bind_evtchn_to_irqhandler(unsigned int evtchn, | 13 | int bind_evtchn_to_irqhandler(unsigned int evtchn, |
12 | irq_handler_t handler, | 14 | irq_handler_t handler, |