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, |
