CC: [email protected]
TO: Sasha Levin <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/sashal/linux-stable.git 
pending-5.10
head:   bad4da9638500d57a66a7be1ea924ee29b8c33c1
commit: 1a133d454f7627c2ddd185e7f24ea10ef4db5f41 [55/132] pinctrl: mcp23s08: 
fix race condition in irq handler
:::::: branch date: 25 hours ago
:::::: commit date: 25 hours ago
config: nios2-randconfig-c003-20210714 (attached as .config)
compiler: nios2-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
Reported-by: Julia Lawall <[email protected]>


cocci warnings: (new ones prefixed by >>)
>> drivers/pinctrl/pinctrl-mcp23s08.c:356:2-8: preceding lock on line 350

vim +356 drivers/pinctrl/pinctrl-mcp23s08.c

e58b9e2762a6ef drivers/gpio/mcp23s08.c            David Brownell    2008-02-04  
340  
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
341  /*----------------------------------------------------------------------*/
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
342  static irqreturn_t mcp23s08_irq(int irq, void *data)
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
343  {
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
344     struct mcp23s08 *mcp = data;
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
345     int intcap, intcon, intf, i, gpio, gpio_orig, intcap_mask, defval;
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
346     unsigned int child_irq;
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
347     bool intf_set, intcap_changed, gpio_bit_changed,
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
348             defval_changed, gpio_set;
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
349  
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16 
@350     mutex_lock(&mcp->lock);
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
351     if (mcp_read(mcp, MCP_INTF, &intf))
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
352             goto unlock;
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
353  
1a133d454f7627 drivers/pinctrl/pinctrl-mcp23s08.c Radim Pavlik      2021-06-01  
354     if (intf == 0) {
1a133d454f7627 drivers/pinctrl/pinctrl-mcp23s08.c Radim Pavlik      2021-06-01  
355             /* There is no interrupt pending */
1a133d454f7627 drivers/pinctrl/pinctrl-mcp23s08.c Radim Pavlik      2021-06-01 
@356             return IRQ_HANDLED;
1a133d454f7627 drivers/pinctrl/pinctrl-mcp23s08.c Radim Pavlik      2021-06-01  
357     }
1a133d454f7627 drivers/pinctrl/pinctrl-mcp23s08.c Radim Pavlik      2021-06-01  
358  
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
359     if (mcp_read(mcp, MCP_INTCAP, &intcap))
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
360             goto unlock;
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
361  
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
362     if (mcp_read(mcp, MCP_INTCON, &intcon))
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
363             goto unlock;
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
364  
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
365     if (mcp_read(mcp, MCP_DEFVAL, &defval))
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
366             goto unlock;
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
367  
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
368     /* This clears the interrupt(configurable on S18) */
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
369     if (mcp_read(mcp, MCP_GPIO, &gpio))
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
370             goto unlock;
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
371  
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
372     gpio_orig = mcp->cached_gpio;
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
373     mcp->cached_gpio = gpio;
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
374     mutex_unlock(&mcp->lock);
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
375  
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
376     dev_dbg(mcp->chip.parent,
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
377             "intcap 0x%04X intf 0x%04X gpio_orig 0x%04X gpio 0x%04X\n",
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
378             intcap, intf, gpio_orig, gpio);
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
379  
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
380     for (i = 0; i < mcp->chip.ngpio; i++) {
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
381             /* We must check all of the inputs on the chip,
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
382              * otherwise we may not notice a change on >=2 pins.
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
383              *
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
384              * On at least the mcp23s17, INTCAP is only updated
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
385              * one byte at a time(INTCAPA and INTCAPB are
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
386              * not written to at the same time - only on a per-bank
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
387              * basis).
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
388              *
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
389              * INTF only contains the single bit that caused the
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
390              * interrupt per-bank.  On the mcp23s17, there is
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
391              * INTFA and INTFB.  If two pins are changed on the A
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
392              * side at the same time, INTF will only have one bit
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
393              * set.  If one pin on the A side and one pin on the B
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
394              * side are changed at the same time, INTF will have
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
395              * two bits set.  Thus, INTF can't be the only check
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
396              * to see if the input has changed.
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
397              */
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
398  
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
399             intf_set = intf & BIT(i);
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
400             if (i < 8 && intf_set)
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
401                     intcap_mask = 0x00FF;
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
402             else if (i >= 8 && intf_set)
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
403                     intcap_mask = 0xFF00;
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
404             else
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
405                     intcap_mask = 0x00;
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
406  
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
407             intcap_changed = (intcap_mask &
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
408                     (intcap & BIT(i))) !=
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
409                     (intcap_mask & (BIT(i) & gpio_orig));
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
410             gpio_set = BIT(i) & gpio;
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
411             gpio_bit_changed = (BIT(i) & gpio_orig) !=
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
412                     (BIT(i) & gpio);
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
413             defval_changed = (BIT(i) & intcon) &&
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
414                     ((BIT(i) & gpio) !=
8f38910ba4f662 drivers/pinctrl/pinctrl-mcp23s08.c Sebastian Reichel 2017-05-15  
415                     (BIT(i) & defval));
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
416  
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
417             if (((gpio_bit_changed || intcap_changed) &&
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
418                     (BIT(i) & mcp->irq_rise) && gpio_set) ||
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
419                 ((gpio_bit_changed || intcap_changed) &&
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
420                     (BIT(i) & mcp->irq_fall) && !gpio_set) ||
2cd29f2387be70 drivers/gpio/gpio-mcp23s08.c       Robert Middleton  2017-03-15  
421                 defval_changed) {
f0fbe7bce73356 drivers/pinctrl/pinctrl-mcp23s08.c Thierry Reding    2017-11-07  
422                     child_irq = irq_find_mapping(mcp->chip.irq.domain, i);
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
423                     handle_nested_irq(child_irq);
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
424             }
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
425     }
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
426  
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
427     return IRQ_HANDLED;
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
428  
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
429  unlock:
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
430     mutex_unlock(&mcp->lock);
7f6f50dfb51b14 drivers/pinctrl/pinctrl-mcp23s08.c Markus Elfring    2017-10-30  
431     return IRQ_HANDLED;
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
432  }
4e47f91bf741e0 drivers/gpio/gpio-mcp23s08.c       Lars Poeschel     2014-01-16  
433  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to