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]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
