CC: [email protected]
CC: [email protected]
In-Reply-To: <[email protected]>
References: <[email protected]>
TO: Maarten Lankhorst <[email protected]>
TO: [email protected]
CC: [email protected]
CC: Maarten Lankhorst <[email protected]>
CC: Peter Zijlstra <[email protected]>
CC: Ingo Molnar <[email protected]>
CC: Will Deacon <[email protected]>
CC: Waiman Long <[email protected]>
CC: Boqun Feng <[email protected]>
CC: Liam Girdwood <[email protected]>
CC: Mark Brown <[email protected]>

Hi Maarten,

I love your patch! Perhaps something to improve:

[auto build test WARNING on regulator/for-next]
[also build test WARNING on tegra-drm/drm/tegra/for-next v5.14]
[cannot apply to tip/locking/core linus/master next-20210909]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    
https://github.com/0day-ci/linux/commits/Maarten-Lankhorst/kernel-locking-Add-context-to-ww_mutex_trylock/20210907-212220
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git 
for-next
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: x86_64-randconfig-c007-20210908 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 
9c476172b93367d2cb88d7d3f4b1b5b456fa6020)
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # 
https://github.com/0day-ci/linux/commit/1e66afa09b0aa7d6db3122f0312e10d36f6fa217
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review 
Maarten-Lankhorst/kernel-locking-Add-context-to-ww_mutex_trylock/20210907-212220
        git checkout 1e66afa09b0aa7d6db3122f0312e10d36f6fa217
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 
clang-analyzer 

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


clang-analyzer warnings: (new ones prefixed by >>)
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:2060:6: note: Assuming field 'i_alloc_type' is equal to 
ICBTAG_FLAG_AD_SHORT
           if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:2060:2: note: Taking true branch
           if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
           ^
   fs/udf/inode.c:2067:6: note: Assuming the condition is true
           if (epos->offset + (2 * adsize) > sb->s_blocksize) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:2067:2: note: Taking true branch
           if (epos->offset + (2 * adsize) > sb->s_blocksize) {
           ^
   fs/udf/inode.c:2074:7: note: Assuming 'new_block' is not equal to 0
                   if (!new_block)
                       ^~~~~~~~~~
   fs/udf/inode.c:2074:3: note: Taking false branch
                   if (!new_block)
                   ^
   fs/udf/inode.c:2077:9: note: Calling 'udf_setup_indirect_aext'
                   err = udf_setup_indirect_aext(inode, new_block, epos);
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:1937:20: note: Field 'i_alloc_type' is equal to 
ICBTAG_FLAG_AD_SHORT
           if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
                             ^
   fs/udf/inode.c:1937:2: note: Taking true branch
           if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
           ^
   fs/udf/inode.c:1948:6: note: Assuming 'bh' is non-null
           if (!bh)
               ^~~
   fs/udf/inode.c:1948:2: note: Taking false branch
           if (!bh)
           ^
   fs/udf/inode.c:1957:6: note: Assuming the condition is false
           if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:1957:2: note: Taking false branch
           if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) {
           ^
   fs/udf/inode.c:1962:6: note: Assuming field 's_udfrev' is < 512
           if (UDF_SB(sb)->s_udfrev >= 0x0200)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:1962:2: note: Taking false branch
           if (UDF_SB(sb)->s_udfrev >= 0x0200)
           ^
   fs/udf/inode.c:1977:6: note: Assuming the condition is true
           if (epos->offset + adsize > sb->s_blocksize) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:1977:2: note: Taking true branch
           if (epos->offset + adsize > sb->s_blocksize) {
           ^
   fs/udf/inode.c:1979:3: note: 'cp_len' declared without an initial value
                   uint32_t cp_len;
                   ^~~~~~~~~~~~~~~
   fs/udf/inode.c:1983:13: note: Calling 'udf_current_aext'
                   cp_type = udf_current_aext(inode, epos, &cp_loc, &cp_len, 0);
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:2184:6: note: Assuming field 'bh' is non-null
           if (!epos->bh) {
               ^~~~~~~~~
   fs/udf/inode.c:2184:2: note: Taking false branch
           if (!epos->bh) {
           ^
   fs/udf/inode.c:2193:7: note: Assuming field 'offset' is not equal to 0
                   if (!epos->offset)
                       ^~~~~~~~~~~~~
   fs/udf/inode.c:2193:3: note: Taking false branch
                   if (!epos->offset)
                   ^
   fs/udf/inode.c:2201:2: note: Control jumps to the 'default' case at line 2220
           switch (iinfo->i_alloc_type) {
           ^
   fs/udf/inode.c:2221:3: note: Taking false branch
                   udf_debug("alloc_type = %u unsupported\n", 
iinfo->i_alloc_type);
                   ^
   fs/udf/udfdecl.h:35:2: note: expanded from macro 'udf_debug'
           pr_debug("%s:%d:%s: " fmt, __FILE__, __LINE__, __func__, 
##__VA_ARGS__)
           ^
   include/linux/printk.h:477:2: note: expanded from macro 'pr_debug'
           no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
           ^
   include/linux/printk.h:140:2: note: expanded from macro 'no_printk'
           if (0)                                          \
           ^
   fs/udf/inode.c:2222:3: note: Returning without writing to '*'
                   return -1;
                   ^
   fs/udf/inode.c:1983:13: note: Returning from 'udf_current_aext'
                   cp_type = udf_current_aext(inode, epos, &cp_loc, &cp_len, 0);
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/udf/inode.c:1984:10: note: The left expression of the compound assignment 
is an uninitialized value. The computed value will also be garbage
                   cp_len |= ((uint32_t)cp_type) << 30;
                   ~~~~~~ ^
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   5 warnings generated.
>> kernel/locking/test-ww_mutex.c:172:2: warning: Undefined or garbage value 
>> returned to caller [clang-analyzer-core.uninitialized.UndefReturn]
           return ret;
           ^
   kernel/locking/test-ww_mutex.c:628:6: note: Assuming 'wq' is non-null
           if (!wq)
               ^~~
   kernel/locking/test-ww_mutex.c:628:2: note: Taking false branch
           if (!wq)
           ^
   kernel/locking/test-ww_mutex.c:632:6: note: Assuming 'ret' is 0
           if (ret)
               ^~~
   kernel/locking/test-ww_mutex.c:632:2: note: Taking false branch
           if (ret)
           ^
   kernel/locking/test-ww_mutex.c:636:6: note: 'ret' is 0
           if (ret)
               ^~~
   kernel/locking/test-ww_mutex.c:636:2: note: Taking false branch
           if (ret)
           ^
   kernel/locking/test-ww_mutex.c:639:8: note: Calling 'test_aa'
           ret = test_aa(true);
                 ^~~~~~~~~~~~~
   kernel/locking/test-ww_mutex.c:125:2: note: 'ret' declared without an 
initial value
           int ret;
           ^~~~~~~
   kernel/locking/test-ww_mutex.c:126:21: note: 'trylock' is true
           const char *from = trylock ? "trylock" : "lock";
                              ^~~~~~~
   kernel/locking/test-ww_mutex.c:126:21: note: '?' condition is true
   kernel/locking/test-ww_mutex.c:131:7: note: 'trylock' is true
           if (!trylock) {
                ^~~~~~~
   kernel/locking/test-ww_mutex.c:131:2: note: Taking false branch
           if (!trylock) {
           ^
   kernel/locking/test-ww_mutex.c:138:7: note: Assuming the condition is true
                   if (!ww_mutex_trylock(&mutex, &ctx)) {
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   kernel/locking/test-ww_mutex.c:138:3: note: Taking true branch
                   if (!ww_mutex_trylock(&mutex, &ctx)) {
                   ^
   kernel/locking/test-ww_mutex.c:140:4: note: Control jumps to line 171
                           goto out;
                           ^
   kernel/locking/test-ww_mutex.c:172:2: note: Undefined or garbage value 
returned to caller
           return ret;
           ^      ~~~
   Suppressed 4 warnings (3 in non-user code, 1 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (2 in non-user code, 1 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   4 warnings generated.
   fs/configfs/dir.c:1377:9: warning: Access to field 'ci_type' results in a 
dereference of a null pointer (loaded from variable 'item') 
[clang-analyzer-core.NullDereference]
           type = item->ci_type;
                  ^~~~
   fs/configfs/dir.c:1275:2: note: 'item' initialized to a null pointer value
           struct config_item *item = NULL;
           ^~~~~~~~~~~~~~~~~~~~~~~~
   fs/configfs/dir.c:1290:7: note: Calling 'configfs_dirent_is_ready'
           if (!configfs_dirent_is_ready(sd)) {
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/configfs/dir.c:347:8: note: Assuming the condition is true
           ret = !(sd->s_type & CONFIGFS_USET_CREATING);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/configfs/dir.c:350:2: note: Returning the value 1 (loaded from 'ret'), 
which participates in a condition later
           return ret;
           ^~~~~~~~~~
   fs/configfs/dir.c:1290:7: note: Returning from 'configfs_dirent_is_ready'
           if (!configfs_dirent_is_ready(sd)) {
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/configfs/dir.c:1290:2: note: Taking false branch
           if (!configfs_dirent_is_ready(sd)) {
           ^
   fs/configfs/dir.c:1295:6: note: Assuming the condition is false
           if (!(sd->s_type & CONFIGFS_USET_DIR)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/configfs/dir.c:1295:2: note: Taking false branch
           if (!(sd->s_type & CONFIGFS_USET_DIR)) {
           ^
   fs/configfs/dir.c:1300:9: note: Calling 'new_fragment'
           frag = new_fragment();
                  ^~~~~~~~~~~~~~
   fs/configfs/dir.c:155:6: note: Calling 'kmalloc'

vim +172 kernel/locking/test-ww_mutex.c

f2a5fec17395f2 Chris Wilson      2016-12-01  120  
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  121  static int test_aa(bool 
trylock)
c22fb3807fd0a3 Chris Wilson      2016-12-01  122  {
c22fb3807fd0a3 Chris Wilson      2016-12-01  123        struct ww_mutex mutex;
c22fb3807fd0a3 Chris Wilson      2016-12-01  124        struct ww_acquire_ctx 
ctx;
c22fb3807fd0a3 Chris Wilson      2016-12-01  125        int ret;
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  126        const char *from = 
trylock ? "trylock" : "lock";
c22fb3807fd0a3 Chris Wilson      2016-12-01  127  
c22fb3807fd0a3 Chris Wilson      2016-12-01  128        ww_mutex_init(&mutex, 
&ww_class);
c22fb3807fd0a3 Chris Wilson      2016-12-01  129        ww_acquire_init(&ctx, 
&ww_class);
c22fb3807fd0a3 Chris Wilson      2016-12-01  130  
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  131        if (!trylock) {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  132                ret = 
ww_mutex_lock(&mutex, &ctx);
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  133                if (ret) {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  134                        
pr_err("%s: initial lock failed!\n", __func__);
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  135                        goto 
out;
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  136                }
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  137        } else {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  138                if 
(!ww_mutex_trylock(&mutex, &ctx)) {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  139                        
pr_err("%s: initial trylock failed!\n", __func__);
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  140                        goto 
out;
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  141                }
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  142        }
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  143  
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  144        if 
(ww_mutex_trylock(&mutex, NULL))  {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  145                pr_err("%s: 
trylocked itself without context from %s!\n", __func__, from);
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  146                
ww_mutex_unlock(&mutex);
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  147                ret = -EINVAL;
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  148                goto out;
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  149        }
c22fb3807fd0a3 Chris Wilson      2016-12-01  150  
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  151        if 
(ww_mutex_trylock(&mutex, &ctx))  {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  152                pr_err("%s: 
trylocked itself with context from %s!\n", __func__, from);
c22fb3807fd0a3 Chris Wilson      2016-12-01  153                
ww_mutex_unlock(&mutex);
c22fb3807fd0a3 Chris Wilson      2016-12-01  154                ret = -EINVAL;
c22fb3807fd0a3 Chris Wilson      2016-12-01  155                goto out;
c22fb3807fd0a3 Chris Wilson      2016-12-01  156        }
c22fb3807fd0a3 Chris Wilson      2016-12-01  157  
c22fb3807fd0a3 Chris Wilson      2016-12-01  158        ret = 
ww_mutex_lock(&mutex, &ctx);
c22fb3807fd0a3 Chris Wilson      2016-12-01  159        if (ret != -EALREADY) {
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  160                pr_err("%s: 
missed deadlock for recursing, ret=%d from %s\n",
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  161                       
__func__, ret, from);
c22fb3807fd0a3 Chris Wilson      2016-12-01  162                if (!ret)
c22fb3807fd0a3 Chris Wilson      2016-12-01  163                        
ww_mutex_unlock(&mutex);
c22fb3807fd0a3 Chris Wilson      2016-12-01  164                ret = -EINVAL;
c22fb3807fd0a3 Chris Wilson      2016-12-01  165                goto out;
c22fb3807fd0a3 Chris Wilson      2016-12-01  166        }
c22fb3807fd0a3 Chris Wilson      2016-12-01  167  
1e66afa09b0aa7 Maarten Lankhorst 2021-09-07  168        ww_mutex_unlock(&mutex);
c22fb3807fd0a3 Chris Wilson      2016-12-01  169        ret = 0;
c22fb3807fd0a3 Chris Wilson      2016-12-01  170  out:
c22fb3807fd0a3 Chris Wilson      2016-12-01  171        ww_acquire_fini(&ctx);
c22fb3807fd0a3 Chris Wilson      2016-12-01 @172        return ret;
c22fb3807fd0a3 Chris Wilson      2016-12-01  173  }
c22fb3807fd0a3 Chris Wilson      2016-12-01  174  

---
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