All of lore.kernel.org
 help / color / mirror / Atom feed
From: michi1@michaelblizek.twilightparadox.com (michi1 at michaelblizek.twilightparadox.com)
To: kernelnewbies@lists.kernelnewbies.org
Subject: wake_up & wait_event are counting events ?
Date: Thu, 19 Jan 2017 18:16:01 +0100	[thread overview]
Message-ID: <20170119171601.GA3300@grml> (raw)
In-Reply-To: <CAJ2oMh+r0wW6V74HZcRrsxhrUKep0ZQ_+cZKrM_4ob2k=rRPtg@mail.gmail.com>

Hi!

On 15:14 Thu 19 Jan     , Ran Shalit wrote:
> Hello,
> 
> I am trying to correctly register interrupt in kernel for user interface:
> 
> irq handler
> =========
> 
> static irqreturn_t irq_handler(int irq, void *dev_id)
> {
>    struct elbit_irq_dev *elbit_irq = &elbit_irq_devices[0];
>     printk("irq in\n");
> 
>  <<==== clear interrupt in fpga  here or after the call to wake_up,
> (at the bottom of routine below ) ?
> 
>     atomic_set(&elbit_irq->flag, 1);
>     wake_up_interruptible(&elbit_irq->pollw);
> 
> 
> 
>     return IRQ_HANDLED;
> }
> 
> ioctl for waiting on interrupts
> ======================
> 
> static long elbit_device_ioctl( struct file *filp, /* ditto */
>          unsigned int ioctl_num, /* number and param for ioctl */
>          unsigned long ioctl_param)
> {
>     struct elbit_irq_dev *elbit_irq = &elbit_irq_devices[0];
> 
>     switch (ioctl_num) {
>     case IOCTL_WAIT_IRQ:
>         atomic_set(&elbit_irq->flag, 0);
>         wait_event_interruptible(elbit_irq->pollw,
> atomic_read(&elbit_irq->flag) != 0) ;
>         break;
> 
> 
>     default:
>         break;
>     }
>     return 0;
> }
> 
> my questions:
> 1. does wake_up and wait_event are countable, i.e. if there are 2
> interrupts for example before wait_event is called, does it mean it
> wake_event will not sleep on 2 consecutive calls ?

No, wait_event will sleep if the test "atomic_read(&elbit_irq->flag) != 0"
says so. In your code there is a race condition:

1) interrupt handler sets flag to 1
2) ioctl sets it to 0
==> wait_event_interruptible sleeps even tough it probably should not

You may want to replace the atomic_set() with atomic_inc() and atomic_dec() if
you want to wake up once every time the interrupt handler gets executed.

> 2. should we put the clear of interrupts in fpga in the interrupt
> before or after the wake_up ?

I do not think that this makes any difference.

> can we put them instead in the userspace handler (IOCTL_WAIT_IRQ) instead
> of clearing the interrupt in the interrupt handler ?

I do not think that this will work.

	-Michi
-- 
programing a layer 3+4 network protocol for mesh networks
see http://michaelblizek.twilightparadox.com

      reply	other threads:[~2017-01-19 17:16 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-19 13:14 wake_up & wait_event are counting events ? Ran Shalit
2017-01-19 17:16 ` michi1 at michaelblizek.twilightparadox.com [this message]

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=20170119171601.GA3300@grml \
    --to=michi1@michaelblizek.twilightparadox.com \
    --cc=kernelnewbies@lists.kernelnewbies.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.