[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 07/12] xen/events: add struct evtchn_ops for the low-level port operations
On Fri, Aug 09, 2013 at 07:15:16PM +0100, David Vrabel wrote: > From: David Vrabel <david.vrabel@xxxxxxxxxx> > > evtchn_ops contains the low-level operations that access the shared > data structures. This allows alternate ABIs to be supported. > > Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> > --- > drivers/xen/events/events.c | 4 ++ > drivers/xen/events/events_internal.h | 62 +++++++++++++++++++++++++++++---- > drivers/xen/events/n-level.c | 32 +++++++++++++---- > 3 files changed, 82 insertions(+), 16 deletions(-) > > diff --git a/drivers/xen/events/events.c b/drivers/xen/events/events.c > index 8d5a5cf..dff8134 100644 > --- a/drivers/xen/events/events.c > +++ b/drivers/xen/events/events.c > @@ -60,6 +60,8 @@ > > #include "events_internal.h" > > +const struct evtchn_ops *evtchn_ops; > + > /* > * This lock protects updates to the following mapping and reference-count > * arrays. The lock does not need to be acquired to read the mapping tables. > @@ -1497,6 +1499,8 @@ void __init xen_init_IRQ(void) > { > int i; > > + xen_evtchn_init_nlevel(); > + There is only 2-level ABI, more importantly, it is the default ABI, so use xen_evtchn_init_default instead? > evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq), > GFP_KERNEL); > BUG_ON(!evtchn_to_irq); > diff --git a/drivers/xen/events/events_internal.h > b/drivers/xen/events/events_internal.h > index 79ac70b..513c34d 100644 > --- a/drivers/xen/events/events_internal.h > +++ b/drivers/xen/events/events_internal.h > @@ -54,21 +54,67 @@ struct irq_info { > #define PIRQ_NEEDS_EOI (1 << 0) > #define PIRQ_SHAREABLE (1 << 1) > > +struct evtchn_ops { > + void (*bind_to_cpu)(struct irq_info *info, int cpu); > + > + void (*clear_pending)(int port); > + void (*set_pending)(int port); > + bool (*is_pending)(int port); > + bool (*test_and_set_mask)(int port); > + void (*mask)(int port); > + void (*unmask)(int port); > + > + void (*handle_events)(int cpu); > +}; > + > +extern const struct evtchn_ops *evtchn_ops; > + > extern int *evtchn_to_irq; > > struct irq_info *info_for_irq(unsigned irq); > unsigned cpu_from_irq(unsigned irq); > unsigned cpu_from_evtchn(unsigned int evtchn); > > -void xen_evtchn_port_bind_to_cpu(struct irq_info *info, int cpu); > +static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info, int > cpu) > +{ > + evtchn_ops->bind_to_cpu(info, cpu); > +} > + > +static inline void clear_evtchn(int port) > +{ > + evtchn_ops->clear_pending(port); > +} > + > +static inline void set_evtchn(int port) > +{ > + evtchn_ops->set_pending(port); > +} > + > +static inline bool test_evtchn(int port) > +{ > + return evtchn_ops->is_pending(port); > +} > + > +static inline bool test_and_set_mask(int port) > +{ > + return evtchn_ops->test_and_set_mask(port); > +} > + > +static inline void mask_evtchn(int port) > +{ > + return evtchn_ops->mask(port); > +} > + > +static inline void unmask_evtchn(int port) > +{ > + return evtchn_ops->unmask(port); > +} > > -void clear_evtchn(int port); > -void set_evtchn(int port); > -int test_evtchn(int port); > -int test_and_set_mask(int port); > -void mask_evtchn(int port); > -void unmask_evtchn(int port); > +static inline void xen_evtchn_handle_events(int cpu) > +{ > + return evtchn_ops->handle_events(cpu); > +} > > -void xen_evtchn_handle_events(int cpu); > +void xen_evtchn_init_nlevel(void); > > #endif /* #ifndef __EVENTS_INTERNAL_H__ */ > diff --git a/drivers/xen/events/n-level.c b/drivers/xen/events/n-level.c > index 05762d5..a449b69 100644 > --- a/drivers/xen/events/n-level.c > +++ b/drivers/xen/events/n-level.c > @@ -39,43 +39,43 @@ > static DEFINE_PER_CPU(xen_ulong_t [NR_EVENT_CHANNELS/BITS_PER_EVTCHN_WORD], > cpu_evtchn_mask); > > -void xen_evtchn_port_bind_to_cpu(struct irq_info *info, int cpu) > +static void nlevel_bind_to_cpu(struct irq_info *info, int cpu) > { > clear_bit(info->evtchn, BM(per_cpu(cpu_evtchn_mask, info->cpu))); > set_bit(info->evtchn, BM(per_cpu(cpu_evtchn_mask, cpu))); > } > > -void clear_evtchn(int port) > +static void nlevel_clear_pending(int port) > { > struct shared_info *s = HYPERVISOR_shared_info; > sync_clear_bit(port, BM(&s->evtchn_pending[0])); > } > > -void set_evtchn(int port) > +static void nlevel_set_pending(int port) > { > struct shared_info *s = HYPERVISOR_shared_info; > sync_set_bit(port, BM(&s->evtchn_pending[0])); > } > > -int test_evtchn(int port) > +static bool nlevel_is_pending(int port) > { > struct shared_info *s = HYPERVISOR_shared_info; > return sync_test_bit(port, BM(&s->evtchn_pending[0])); > } > > -int test_and_set_mask(int port) > +static bool nlevel_test_and_set_mask(int port) > { > struct shared_info *s = HYPERVISOR_shared_info; > return sync_test_and_set_bit(port, BM(&s->evtchn_mask[0])); > } > > -void mask_evtchn(int port) > +static void nlevel_mask(int port) > { > struct shared_info *s = HYPERVISOR_shared_info; > sync_set_bit(port, BM(&s->evtchn_mask[0])); > } > > -void unmask_evtchn(int port) > +static void nlevel_unmask(int port) > { > struct shared_info *s = HYPERVISOR_shared_info; > unsigned int cpu = get_cpu(); > @@ -141,7 +141,7 @@ static inline xen_ulong_t active_evtchns(unsigned int cpu, > * a bitset of words which contain pending event bits. The second > * level is a bitset of pending events themselves. > */ > -void xen_evtchn_handle_events(int cpu) > +static void nlevel_handle_events(int cpu) > { > xen_ulong_t pending_words; > int start_word_idx, start_bit_idx; > @@ -313,3 +313,19 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id) > > return IRQ_HANDLED; > } > + > +static const struct evtchn_ops evtchn_ops_nlevel = { > + .bind_to_cpu = nlevel_bind_to_cpu, > + .clear_pending = nlevel_clear_pending, > + .set_pending = nlevel_set_pending, > + .is_pending = nlevel_is_pending, > + .test_and_set_mask = nlevel_test_and_set_mask, > + .mask = nlevel_mask, > + .unmask = nlevel_unmask, > + .handle_events = nlevel_handle_events, > +}; > + How about use 2level_* or default_*? Just my two cents. :-) Wei. > +void __init xen_evtchn_init_nlevel(void) > +{ > + evtchn_ops = &evtchn_ops_nlevel; > +} > -- > 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |