* [PATCH] Make bind_interdomain_evtchn_to_irq() public
@ 2014-08-12 13:43 jgross
2014-08-13 9:29 ` [Xen-devel] " David Vrabel
2014-08-13 9:53 ` David Vrabel
0 siblings, 2 replies; 7+ messages in thread
From: jgross @ 2014-08-12 13:43 UTC (permalink / raw)
To: xen-devel, david.vrabel, konrad.wilk, linux-kernel; +Cc: Juergen Gross
From: Juergen Gross <jgross@suse.com>
bind_interdomain_evtchn_to_irq() is currently a private function. It is used
only by bind_interdomain_evtchn_to_irqhandler() to register an irq-handler for
an event channel.
By making it public it is possible to use e.g. threaded interrupts with
interdomain event channels.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
drivers/xen/events/events_base.c | 5 +++--
include/xen/events.h | 2 ++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
index c919d3d..0230aff 100644
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
@@ -900,8 +900,8 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
return irq;
}
-static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
- unsigned int remote_port)
+int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
+ unsigned int remote_port)
{
struct evtchn_bind_interdomain bind_interdomain;
int err;
@@ -914,6 +914,7 @@ static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
return err ? : bind_evtchn_to_irq(bind_interdomain.local_port);
}
+EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irq);
static int find_virq(unsigned int virq, unsigned int cpu)
{
diff --git a/include/xen/events.h b/include/xen/events.h
index 8bee7a7..5321cd9 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -28,6 +28,8 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
unsigned long irqflags,
const char *devname,
void *dev_id);
+int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
+ unsigned int remote_port);
int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
unsigned int remote_port,
irq_handler_t handler,
--
1.8.4.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Xen-devel] [PATCH] Make bind_interdomain_evtchn_to_irq() public
2014-08-12 13:43 [PATCH] Make bind_interdomain_evtchn_to_irq() public jgross
@ 2014-08-13 9:29 ` David Vrabel
2014-08-13 9:43 ` Juergen Gross
2014-08-13 9:53 ` David Vrabel
1 sibling, 1 reply; 7+ messages in thread
From: David Vrabel @ 2014-08-13 9:29 UTC (permalink / raw)
To: jgross, xen-devel, david.vrabel, konrad.wilk, linux-kernel
On 12/08/14 14:43, jgross@suse.com wrote:
> From: Juergen Gross <jgross@suse.com>
>
> bind_interdomain_evtchn_to_irq() is currently a private function. It is used
> only by bind_interdomain_evtchn_to_irqhandler() to register an irq-handler for
> an event channel.
>
> By making it public it is possible to use e.g. threaded interrupts with
> interdomain event channels.
Can you give an example of using this? Maybe we want a
bind_interdomain_evtchn_to_threaded_irqhandler() instead? Or add a flags
field to the existing function.
David
> --- a/drivers/xen/events/events_base.c
> +++ b/drivers/xen/events/events_base.c
> @@ -900,8 +900,8 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
> return irq;
> }
>
> -static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
> - unsigned int remote_port)
> +int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
> + unsigned int remote_port)
> {
> struct evtchn_bind_interdomain bind_interdomain;
> int err;
> @@ -914,6 +914,7 @@ static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
>
> return err ? : bind_evtchn_to_irq(bind_interdomain.local_port);
> }
> +EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irq);
>
> static int find_virq(unsigned int virq, unsigned int cpu)
> {
> diff --git a/include/xen/events.h b/include/xen/events.h
> index 8bee7a7..5321cd9 100644
> --- a/include/xen/events.h
> +++ b/include/xen/events.h
> @@ -28,6 +28,8 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
> unsigned long irqflags,
> const char *devname,
> void *dev_id);
> +int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
> + unsigned int remote_port);
> int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
> unsigned int remote_port,
> irq_handler_t handler,
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Xen-devel] [PATCH] Make bind_interdomain_evtchn_to_irq() public
2014-08-13 9:29 ` [Xen-devel] " David Vrabel
@ 2014-08-13 9:43 ` Juergen Gross
2014-08-13 9:54 ` David Vrabel
0 siblings, 1 reply; 7+ messages in thread
From: Juergen Gross @ 2014-08-13 9:43 UTC (permalink / raw)
To: David Vrabel, xen-devel, konrad.wilk, linux-kernel
On 08/13/2014 11:29 AM, David Vrabel wrote:
> On 12/08/14 14:43, jgross@suse.com wrote:
>> From: Juergen Gross <jgross@suse.com>
>>
>> bind_interdomain_evtchn_to_irq() is currently a private function. It is used
>> only by bind_interdomain_evtchn_to_irqhandler() to register an irq-handler for
>> an event channel.
>>
>> By making it public it is possible to use e.g. threaded interrupts with
>> interdomain event channels.
>
> Can you give an example of using this? Maybe we want a
> bind_interdomain_evtchn_to_threaded_irqhandler() instead? Or add a flags
> field to the existing function.
Instead of
static int scsiback_schedule(void *data)
{
struct vscsibk_info *info = (struct vscsibk_info *)data;
while (!kthread_should_stop()) {
wait_event_interruptible(info->wq,
info->waiting_reqs || kthread_should_stop());
info->waiting_reqs = 0;
smp_mb(); /* waiting_reqs used by other thread */
switch (scsiback_do_cmd_fn(info)) {
case 1:
info->waiting_reqs = 1;
default:
break;
}
cond_resched();
}
return 0;
}
static void scsiback_notify_work(struct vscsibk_info *info)
{
info->waiting_reqs = 1;
wake_up(&info->wq);
}
static irqreturn_t scsiback_intr(int irq, void *dev_id)
{
scsiback_notify_work((struct vscsibk_info *)dev_id);
return IRQ_HANDLED;
}
static int scsiback_init_sring(struct vscsibk_info *info, grant_ref_t
ring_ref,
evtchn_port_t evtchn)
{
...
bind_interdomain_evtchn_to_irqhandler(
info->domid, evtchn,
scsiback_intr, 0, "vscsiif-backend", info);
...
info->kthread = kthread_run(scsiback_schedule, info, name);
...
}
I only need the following:
static irqreturn_t scsiback_irq_fn(int irq, void *dev_id)
{
struct vscsibk_info *info = dev_id;
while (scsiback_do_cmd_fn(info))
cond_resched();
return IRQ_HANDLED;
}
static int scsiback_init_sring(struct vscsibk_info *info, grant_ref_t
ring_ref,
evtchn_port_t evtchn)
{
...
irq = bind_interdomain_evtchn_to_irq(info->domid, evtchn);
request_threaded_irq(irq, NULL, scsiback_irq_fn,
IRQF_ONESHOT, "vscsiif-backend", info)
...
}
So yes, it could be done via a flag, too.
Juergen
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Make bind_interdomain_evtchn_to_irq() public
2014-08-12 13:43 [PATCH] Make bind_interdomain_evtchn_to_irq() public jgross
2014-08-13 9:29 ` [Xen-devel] " David Vrabel
@ 2014-08-13 9:53 ` David Vrabel
2014-08-13 10:04 ` [Xen-devel] " Juergen Gross
1 sibling, 1 reply; 7+ messages in thread
From: David Vrabel @ 2014-08-13 9:53 UTC (permalink / raw)
To: jgross, xen-devel, konrad.wilk, linux-kernel
On 12/08/14 14:43, jgross@suse.com wrote:
> From: Juergen Gross <jgross@suse.com>
>
> bind_interdomain_evtchn_to_irq() is currently a private function. It is used
> only by bind_interdomain_evtchn_to_irqhandler() to register an irq-handler for
> an event channel.
>
> By making it public it is possible to use e.g. threaded interrupts with
> interdomain event channels.
Acked-by: David Vrabel <david.vrabel@citrix.com>
But can you change the subject/commit message to:
xen/events: support threaded irqs for interdomain event channels
Export bind_interdomain_evtchn_to_irq() so drivers can use threaded
interrupt handlers with:
irq = bind_interdomain_evtchn_to_irq(remote_dom, remote_port);
if (irq < 0)
/* error */
ret = request_threaded_irq(...);
Since your pvscsi series depends on this you will want to add this to
that series to be merged via the scsi tree.
David
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Xen-devel] [PATCH] Make bind_interdomain_evtchn_to_irq() public
2014-08-13 9:43 ` Juergen Gross
@ 2014-08-13 9:54 ` David Vrabel
2014-08-13 10:04 ` Juergen Gross
0 siblings, 1 reply; 7+ messages in thread
From: David Vrabel @ 2014-08-13 9:54 UTC (permalink / raw)
To: Juergen Gross, xen-devel, konrad.wilk, linux-kernel
On 13/08/14 10:43, Juergen Gross wrote:
>
> static int scsiback_init_sring(struct vscsibk_info *info, grant_ref_t
> ring_ref,
> evtchn_port_t evtchn)
> {
> ...
> irq = bind_interdomain_evtchn_to_irq(info->domid, evtchn);
> request_threaded_irq(irq, NULL, scsiback_irq_fn,
> IRQF_ONESHOT, "vscsiif-backend", info)
> ...
This usage is fine.
I assume the error checking of bind_interdomain_evtchn_to_irq() and
request_threaded_irq() was omitted for clarity in this example?
David
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Xen-devel] [PATCH] Make bind_interdomain_evtchn_to_irq() public
2014-08-13 9:53 ` David Vrabel
@ 2014-08-13 10:04 ` Juergen Gross
0 siblings, 0 replies; 7+ messages in thread
From: Juergen Gross @ 2014-08-13 10:04 UTC (permalink / raw)
To: David Vrabel, xen-devel, konrad.wilk, linux-kernel
On 08/13/2014 11:53 AM, David Vrabel wrote:
> On 12/08/14 14:43, jgross@suse.com wrote:
>> From: Juergen Gross <jgross@suse.com>
>>
>> bind_interdomain_evtchn_to_irq() is currently a private function. It is used
>> only by bind_interdomain_evtchn_to_irqhandler() to register an irq-handler for
>> an event channel.
>>
>> By making it public it is possible to use e.g. threaded interrupts with
>> interdomain event channels.
>
> Acked-by: David Vrabel <david.vrabel@citrix.com>
>
> But can you change the subject/commit message to:
>
> xen/events: support threaded irqs for interdomain event channels
>
> Export bind_interdomain_evtchn_to_irq() so drivers can use threaded
> interrupt handlers with:
>
> irq = bind_interdomain_evtchn_to_irq(remote_dom, remote_port);
> if (irq < 0)
> /* error */
> ret = request_threaded_irq(...);
>
> Since your pvscsi series depends on this you will want to add this to
> that series to be merged via the scsi tree.
Already done locally. :-)
Juergen
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Xen-devel] [PATCH] Make bind_interdomain_evtchn_to_irq() public
2014-08-13 9:54 ` David Vrabel
@ 2014-08-13 10:04 ` Juergen Gross
0 siblings, 0 replies; 7+ messages in thread
From: Juergen Gross @ 2014-08-13 10:04 UTC (permalink / raw)
To: David Vrabel, xen-devel, konrad.wilk, linux-kernel
On 08/13/2014 11:54 AM, David Vrabel wrote:
> On 13/08/14 10:43, Juergen Gross wrote:
>>
>> static int scsiback_init_sring(struct vscsibk_info *info, grant_ref_t
>> ring_ref,
>> evtchn_port_t evtchn)
>> {
>> ...
>> irq = bind_interdomain_evtchn_to_irq(info->domid, evtchn);
>> request_threaded_irq(irq, NULL, scsiback_irq_fn,
>> IRQF_ONESHOT, "vscsiif-backend", info)
>> ...
>
> This usage is fine.
>
> I assume the error checking of bind_interdomain_evtchn_to_irq() and
> request_threaded_irq() was omitted for clarity in this example?
Sure.
Juergen
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-08-13 10:05 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-12 13:43 [PATCH] Make bind_interdomain_evtchn_to_irq() public jgross
2014-08-13 9:29 ` [Xen-devel] " David Vrabel
2014-08-13 9:43 ` Juergen Gross
2014-08-13 9:54 ` David Vrabel
2014-08-13 10:04 ` Juergen Gross
2014-08-13 9:53 ` David Vrabel
2014-08-13 10:04 ` [Xen-devel] " Juergen Gross
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox