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

Reply via email to