Hi David, FYI, there are new smatch warnings show up in
tree: git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git char-misc-next head: d3a8a9dbb903c73a7ec2deae4c9b7d74b6834f4c commit: d3a8a9dbb903c73a7ec2deae4c9b7d74b6834f4c [29/29] w1: hold bus_mutex in netlink and search drivers/w1/masters/ds1wm.c:339 ds1wm_search() error: double lock 'mutex:&master_dev->bus_mutex' drivers/w1/masters/ds1wm.c:443 ds1wm_search() error: double unlock 'mutex:&master_dev->bus_mutex' git remote add char-misc git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git git remote update char-misc git checkout d3a8a9dbb903c73a7ec2deae4c9b7d74b6834f4c vim +339 drivers/w1/masters/ds1wm.c 26a6afb9 Jean-François Dagenais 2011-05-26 333 if (pass > 100) { 26a6afb9 Jean-François Dagenais 2011-05-26 334 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 335 "too many attempts (100), search aborted\n"); d3a8a9db David Fries 2014-01-15 336 break; 26a6afb9 Jean-François Dagenais 2011-05-26 337 } 26a6afb9 Jean-François Dagenais 2011-05-26 338 b02f8bed NeilBrown 2012-05-18 @339 mutex_lock(&master_dev->bus_mutex); 26a6afb9 Jean-François Dagenais 2011-05-26 340 if (ds1wm_reset(ds1wm_data)) { b02f8bed NeilBrown 2012-05-18 341 mutex_unlock(&master_dev->bus_mutex); 26a6afb9 Jean-François Dagenais 2011-05-26 342 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 343 "pass: %d reset error (or no slaves)\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 344 break; 26a6afb9 Jean-François Dagenais 2011-05-26 345 } 26a6afb9 Jean-François Dagenais 2011-05-26 346 26a6afb9 Jean-François Dagenais 2011-05-26 347 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 348 "pass: %d r : %0#18llx writing SEARCH_ROM\n", pass, r); 26a6afb9 Jean-François Dagenais 2011-05-26 349 ds1wm_write(ds1wm_data, search_type); 26a6afb9 Jean-François Dagenais 2011-05-26 350 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 351 "pass: %d entering ASM\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 352 ds1wm_write_register(ds1wm_data, DS1WM_CMD, DS1WM_CMD_SRA); 26a6afb9 Jean-François Dagenais 2011-05-26 353 dev_dbg(&ds1wm_data->pdev->dev, 4907cb7b Anatol Pomozov 2012-09-01 354 "pass: %d beginning nibble loop\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 355 26a6afb9 Jean-François Dagenais 2011-05-26 356 r_prime = 0; 26a6afb9 Jean-François Dagenais 2011-05-26 357 d = 0; 26a6afb9 Jean-François Dagenais 2011-05-26 358 /* we work one nibble at a time */ 26a6afb9 Jean-François Dagenais 2011-05-26 359 /* each nibble is interleaved to form a byte */ 26a6afb9 Jean-François Dagenais 2011-05-26 360 for (i = 0; i < 16; i++) { 26a6afb9 Jean-François Dagenais 2011-05-26 361 26a6afb9 Jean-François Dagenais 2011-05-26 362 unsigned char resp, _r, _r_prime, _d; 26a6afb9 Jean-François Dagenais 2011-05-26 363 26a6afb9 Jean-François Dagenais 2011-05-26 364 _r = (r >> (4*i)) & 0xf; 26a6afb9 Jean-François Dagenais 2011-05-26 365 _r = ((_r & 0x1) << 1) | 26a6afb9 Jean-François Dagenais 2011-05-26 366 ((_r & 0x2) << 2) | 26a6afb9 Jean-François Dagenais 2011-05-26 367 ((_r & 0x4) << 3) | 26a6afb9 Jean-François Dagenais 2011-05-26 368 ((_r & 0x8) << 4); 26a6afb9 Jean-François Dagenais 2011-05-26 369 26a6afb9 Jean-François Dagenais 2011-05-26 370 /* writes _r, then reads back: */ 26a6afb9 Jean-François Dagenais 2011-05-26 371 resp = ds1wm_read(ds1wm_data, _r); 26a6afb9 Jean-François Dagenais 2011-05-26 372 26a6afb9 Jean-François Dagenais 2011-05-26 373 if (ds1wm_data->read_error) { 26a6afb9 Jean-François Dagenais 2011-05-26 374 dev_err(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 375 "pass: %d nibble: %d read error\n", pass, i); 26a6afb9 Jean-François Dagenais 2011-05-26 376 break; 26a6afb9 Jean-François Dagenais 2011-05-26 377 } 26a6afb9 Jean-François Dagenais 2011-05-26 378 26a6afb9 Jean-François Dagenais 2011-05-26 379 _r_prime = ((resp & 0x02) >> 1) | 26a6afb9 Jean-François Dagenais 2011-05-26 380 ((resp & 0x08) >> 2) | 26a6afb9 Jean-François Dagenais 2011-05-26 381 ((resp & 0x20) >> 3) | 26a6afb9 Jean-François Dagenais 2011-05-26 382 ((resp & 0x80) >> 4); 26a6afb9 Jean-François Dagenais 2011-05-26 383 26a6afb9 Jean-François Dagenais 2011-05-26 384 _d = ((resp & 0x01) >> 0) | 26a6afb9 Jean-François Dagenais 2011-05-26 385 ((resp & 0x04) >> 1) | 26a6afb9 Jean-François Dagenais 2011-05-26 386 ((resp & 0x10) >> 2) | 26a6afb9 Jean-François Dagenais 2011-05-26 387 ((resp & 0x40) >> 3); 26a6afb9 Jean-François Dagenais 2011-05-26 388 26a6afb9 Jean-François Dagenais 2011-05-26 389 r_prime |= (unsigned long long) _r_prime << (i * 4); 26a6afb9 Jean-François Dagenais 2011-05-26 390 d |= (unsigned long long) _d << (i * 4); 26a6afb9 Jean-François Dagenais 2011-05-26 391 26a6afb9 Jean-François Dagenais 2011-05-26 392 } 26a6afb9 Jean-François Dagenais 2011-05-26 393 if (ds1wm_data->read_error) { b02f8bed NeilBrown 2012-05-18 394 mutex_unlock(&master_dev->bus_mutex); 26a6afb9 Jean-François Dagenais 2011-05-26 395 dev_err(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 396 "pass: %d read error, retrying\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 397 break; 26a6afb9 Jean-François Dagenais 2011-05-26 398 } 26a6afb9 Jean-François Dagenais 2011-05-26 399 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 400 "pass: %d r\': %0#18llx d:%0#18llx\n", 26a6afb9 Jean-François Dagenais 2011-05-26 401 pass, r_prime, d); 26a6afb9 Jean-François Dagenais 2011-05-26 402 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 403 "pass: %d nibble loop complete, exiting ASM\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 404 ds1wm_write_register(ds1wm_data, DS1WM_CMD, ~DS1WM_CMD_SRA); 26a6afb9 Jean-François Dagenais 2011-05-26 405 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 406 "pass: %d resetting bus\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 407 ds1wm_reset(ds1wm_data); b02f8bed NeilBrown 2012-05-18 408 mutex_unlock(&master_dev->bus_mutex); 26a6afb9 Jean-François Dagenais 2011-05-26 409 if ((r_prime & ((u64)1 << 63)) && (d & ((u64)1 << 63))) { 26a6afb9 Jean-François Dagenais 2011-05-26 410 dev_err(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 411 "pass: %d bus error, retrying\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 412 continue; /* start over */ 26a6afb9 Jean-François Dagenais 2011-05-26 413 } 26a6afb9 Jean-François Dagenais 2011-05-26 414 26a6afb9 Jean-François Dagenais 2011-05-26 415 26a6afb9 Jean-François Dagenais 2011-05-26 416 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 417 "pass: %d found %0#18llx\n", pass, r_prime); 26a6afb9 Jean-François Dagenais 2011-05-26 418 slave_found(master_dev, r_prime); 26a6afb9 Jean-François Dagenais 2011-05-26 419 ++slaves_found; 26a6afb9 Jean-François Dagenais 2011-05-26 420 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 421 "pass: %d complete, preparing next pass\n", pass); 26a6afb9 Jean-François Dagenais 2011-05-26 422 26a6afb9 Jean-François Dagenais 2011-05-26 423 /* any discrepency found which we already choose the 26a6afb9 Jean-François Dagenais 2011-05-26 424 '1' branch is now is now irrelevant we reveal the 26a6afb9 Jean-François Dagenais 2011-05-26 425 next branch with this: */ 26a6afb9 Jean-François Dagenais 2011-05-26 426 d &= ~r; 26a6afb9 Jean-François Dagenais 2011-05-26 427 /* find last bit set, i.e. the most signif. bit set */ 26a6afb9 Jean-François Dagenais 2011-05-26 428 ms_discrep_bit = fls64(d) - 1; 26a6afb9 Jean-François Dagenais 2011-05-26 429 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 430 "pass: %d new d:%0#18llx MS discrep bit:%d\n", 26a6afb9 Jean-François Dagenais 2011-05-26 431 pass, d, ms_discrep_bit); 26a6afb9 Jean-François Dagenais 2011-05-26 432 26a6afb9 Jean-François Dagenais 2011-05-26 433 /* prev_ms_discrep_bit = ms_discrep_bit; 26a6afb9 Jean-François Dagenais 2011-05-26 434 prepare for next ROM search: */ 26a6afb9 Jean-François Dagenais 2011-05-26 435 if (ms_discrep_bit == -1) 26a6afb9 Jean-François Dagenais 2011-05-26 436 break; 26a6afb9 Jean-François Dagenais 2011-05-26 437 26a6afb9 Jean-François Dagenais 2011-05-26 438 r = (r & ~(~0ull << (ms_discrep_bit))) | 1 << ms_discrep_bit; 26a6afb9 Jean-François Dagenais 2011-05-26 439 } /* end while true */ 26a6afb9 Jean-François Dagenais 2011-05-26 440 dev_dbg(&ds1wm_data->pdev->dev, 26a6afb9 Jean-François Dagenais 2011-05-26 441 "pass: %d total: %d search done ms d bit pos: %d\n", pass, 26a6afb9 Jean-François Dagenais 2011-05-26 442 slaves_found, ms_discrep_bit); d3a8a9db David Fries 2014-01-15 @443 mutex_unlock(&master_dev->bus_mutex); f19b121e a...@linux-foundation.org 2007-05-08 444 } f19b121e a...@linux-foundation.org 2007-05-08 445 f19b121e a...@linux-foundation.org 2007-05-08 446 /* --------------------------------------------------------------------- */ :::::: The code at line 339 was first introduced by commit :::::: b02f8bede217a4b145ecc16d3940c78d83941147 W1: split master mutex to avoid deadlocks. :::::: TO: NeilBrown <ne...@suse.de> :::::: CC: Greg Kroah-Hartman <gre...@linuxfoundation.org> --- 0-DAY kernel build testing backend Open Source Technology Center http://lists.01.org/mailman/listinfo/kbuild Intel Corporation _______________________________________________ kbuild mailing list kbuild@lists.01.org https://lists.01.org/mailman/listinfo/kbuild