[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Make bind_interdomain_evtchn_to_irq() public



On 08/13/2014 11:29 AM, David Vrabel wrote:
On 12/08/14 14:43, jgross@xxxxxxxx wrote:
From: Juergen Gross <jgross@xxxxxxxx>

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

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.