All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xen.org
Cc: Wei Liu <wei.liu2@citrix.com>, Keir Fraser <keir@xen.org>,
	David Vrabel <david.vrabel@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [PATCH 08/12] xen/events: add struct evtchn_ops for the low-level port operations
Date: Tue, 19 Mar 2013 21:04:55 +0000	[thread overview]
Message-ID: <1363727099-25519-9-git-send-email-david.vrabel@citrix.com> (raw)
In-Reply-To: <1363727099-25519-1-git-send-email-david.vrabel@citrix.com>

From: David Vrabel <david.vrabel@citrix.com>

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@citrix.com>
---
 drivers/xen/events/events.c          |    4 ++
 drivers/xen/events/events_internal.h |   61 +++++++++++++++++++++++++++++----
 drivers/xen/events/n-level.c         |   27 ++++++++++----
 3 files changed, 76 insertions(+), 16 deletions(-)

diff --git a/drivers/xen/events/events.c b/drivers/xen/events/events.c
index e85c00a..1017d9f 100644
--- a/drivers/xen/events/events.c
+++ b/drivers/xen/events/events.c
@@ -58,6 +58,8 @@
 
 #include "events_internal.h"
 
+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.
@@ -1482,6 +1484,8 @@ void __init xen_init_IRQ(void)
 {
 	int i;
 
+	evtchn_ops = evtchn_ops_nlevel;
+
 	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..6badb05 100644
--- a/drivers/xen/events/events_internal.h
+++ b/drivers/xen/events/events_internal.h
@@ -54,21 +54,66 @@ 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 struct evtchn_ops evtchn_ops;
+extern struct evtchn_ops evtchn_ops_nlevel;
+
 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);
+}
 
-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 unmask_evtchn(int port)
+{
+	return evtchn_ops.unmask(port);
+}
 
-void xen_evtchn_handle_events(int cpu);
+static inline void xen_evtchn_handle_events(int cpu)
+{
+	return evtchn_ops.handle_events(cpu);
+}
 
 #endif /* #ifndef __EVENTS_INTERNAL_H__ */
diff --git a/drivers/xen/events/n-level.c b/drivers/xen/events/n-level.c
index 05762d5..74f8e94 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,14 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id)
 
 	return IRQ_HANDLED;
 }
+
+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,
+};
-- 
1.7.2.5

  parent reply	other threads:[~2013-03-19 21:04 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-19 21:04 [PATCH RFC 0/12] Linux: FIFO-based event channel ABI David Vrabel
2013-03-19 21:04 ` [PATCH 01/12] xen/events: avoid race with raising an event in unmask_evtchn() David Vrabel
2013-03-19 21:04 ` [PATCH 02/12] xen/events: refactor retrigger_dynirq() and resend_irq_on_evtchn() David Vrabel
2013-03-20 11:06   ` Jan Beulich
2013-03-19 21:04 ` [PATCH 03/12] xen/events: remove unnecessary init_evtchn_cpu_bindings() David Vrabel
2013-03-20 11:09   ` Jan Beulich
2013-03-20 13:20     ` David Vrabel
2013-03-20 13:40       ` Jan Beulich
2013-03-19 21:04 ` [PATCH 04/12] xen/events: introduce test_and_set_mask David Vrabel
2013-03-19 21:04 ` [PATCH 05/12] xen/events: replace raw bit ops with functions David Vrabel
2013-03-19 21:04 ` [PATCH 06/12] xen/events: move drivers/xen/events.c into drivers/xen/events/ David Vrabel
2013-03-19 21:04 ` [PATCH 07/12] xen/events: move 2-level specific code into its own file David Vrabel
2013-03-19 21:04 ` David Vrabel [this message]
2013-03-20 11:12   ` [PATCH 08/12] xen/events: add struct evtchn_ops for the low-level port operations Jan Beulich
2013-03-19 21:04 ` [PATCH 09/12] xen/events: allow setup of irq_info to fail David Vrabel
2013-03-19 21:04 ` [PATCH 10/12] xen/events: add a evtchn_op for port setup David Vrabel
2013-03-19 21:04 ` [PATCH 11/12] xen/events: Add the hypervisor interface for the FIFO-based event channels David Vrabel
2013-03-20 14:03   ` Wei Liu
2013-03-20 14:18     ` David Vrabel
2013-03-20 14:36       ` Wei Liu
2013-03-19 21:04 ` [PATCH 12/12] xen/events: use the FIFO-based ABI if available David Vrabel
2013-03-20  9:38   ` Roger Pau Monné
     [not found] ` <1363727099-25519-2-git-send-email-david.vrabel@citrix.com>
2013-03-20 11:00   ` [PATCH 01/12] xen/events: avoid race with raising an event in unmask_evtchn() Stefano Stabellini
     [not found]   ` <alpine.DEB.2.02.1303201052280.17662@kaball.uk.xensource.com>
2013-03-20 12:20     ` David Vrabel
2013-03-20 12:21       ` Stefano Stabellini
2013-05-06 19:51 ` [PATCH RFC 0/12] Linux: FIFO-based event channel ABI Konrad Rzeszutek Wilk
2013-05-07 12:26   ` David Vrabel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1363727099-25519-9-git-send-email-david.vrabel@citrix.com \
    --to=david.vrabel@citrix.com \
    --cc=keir@xen.org \
    --cc=konrad.wilk@oracle.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.