Re: [bug report] platform/chrome: wilco_ec: Add event handling

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

 



On Fri, Jun 7, 2019 at 2:18 AM Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote:
>
> Hello Nick Crews,
>
> The patch f7b0bc5eafa4: "platform/chrome: wilco_ec: Add event
> handling" from May 23, 2019, leads to the following static checker
> warning:
>
>   drivers/platform/chrome/wilco_ec/event.c:352 event_read()
>   warn: inconsistent returns 'dev_data->lock'.
>     Locked on  : 345
>     Unlocked on: 323,333,352
>
> drivers/platform/chrome/wilco_ec/event.c
>    306  static ssize_t event_read(struct file *filp, char __user *buf, size_t count,
>    307                            loff_t *pos)
>    308  {
>    309          struct event_device_data *dev_data = filp->private_data;
>    310          struct ec_event_entry *entry;
>    311          ssize_t n_bytes_written = 0;
>    312          int err;
>    313
>    314          /* We only will give them the entire event at once */
>    315          if (count != 0 && count < EC_ACPI_MAX_EVENT_SIZE)
>    316                  return -EINVAL;
>    317
>    318          mutex_lock(&dev_data->lock);
>    319
>    320          while (dev_data->num_events == 0) {
>    321                  if (filp->f_flags & O_NONBLOCK) {
>    322                          mutex_unlock(&dev_data->lock);
>    323                          return -EAGAIN;
>    324                  }
>    325                  /* Need to unlock so that data can actually get added to the
>    326                   * queue, and since we recheck before use and it's just
>    327                   * comparing pointers, this is safe unlocked.
>    328                   */
>    329                  mutex_unlock(&dev_data->lock);
>    330                  err = wait_event_interruptible(dev_data->wq,
>    331                                                 dev_data->num_events);
>    332                  if (err)
>    333                          return err;
>    334
>    335                  /* Device was removed as we waited? */
>    336                  if (!dev_data->exist)
>    337                          return -ENODEV;
>    338                  mutex_lock(&dev_data->lock);
>    339          }
>    340
>    341          entry = list_first_entry(&dev_data->events,
>    342                                   struct ec_event_entry, list);
>    343          n_bytes_written = entry->size;
>    344          if (copy_to_user(buf, &entry->event, n_bytes_written))
>    345                  return -EFAULT;
>
> We need to unlock here.  But also maybe we should do other error
> handling like the list_del() as well?  I'm not sure.

Thanks, I'll look into this.

Enric, should I submit a completely new version of this,
or just a patch on top of this? Also, I still want to add in
the circular buffer for events to prevent OOM.

Nick

>
>    346          list_del(&entry->list);
>    347          kfree(entry);
>    348          dev_data->num_events--;
>    349
>    350          mutex_unlock(&dev_data->lock);
>    351
>    352          return n_bytes_written;
>    353  }
>
> regards,
> dan carpenter



[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux