From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: Re: [PATCH] compiler_types: mark __compiletime_assert failure as __noreturn
Date: Sun, 07 Nov 2021 16:28:04 +0800 [thread overview]
Message-ID: <202111071646.EJB2R7KC-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 46568 bytes --]
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211014132331.GA4811@kernel.org>
References: <20211014132331.GA4811@kernel.org>
TO: Miguel Ojeda <ojeda@kernel.org>
Hi Miguel,
I love your patch! Perhaps something to improve:
[auto build test WARNING on linus/master]
[also build test WARNING on v5.15]
[cannot apply to next-20211106]
[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/Miguel-Ojeda/compiler_types-mark-__compiletime_assert-failure-as-__noreturn/20211014-212525
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 348949d9a4440abdab3b1dc99a9bb660e8c7da7c
:::::: branch date: 3 weeks ago
:::::: commit date: 3 weeks ago
config: riscv-randconfig-c006-20211014 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project acb3b187c4c88650a6a717a1bcb234d27d0d7f54)
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
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/dbc83335c8484937120e562d531c7f401aa944b2
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Miguel-Ojeda/compiler_types-mark-__compiletime_assert-failure-as-__noreturn/20211014-212525
git checkout dbc83335c8484937120e562d531c7f401aa944b2
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^
kernel/bpf/core.c:962:2: note: Loop condition is false. Exiting loop
BUILD_BUG_ON(BPF_REG_AX + 1 != MAX_BPF_JIT_REG);
^
include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
^
include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:300:2: note: expanded from macro '__compiletime_assert'
do { \
^
kernel/bpf/core.c:963:2: note: Taking false branch
BUILD_BUG_ON(MAX_BPF_REG + 1 != MAX_BPF_JIT_REG);
^
include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
^
include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^
kernel/bpf/core.c:963:2: note: Loop condition is false. Exiting loop
BUILD_BUG_ON(MAX_BPF_REG + 1 != MAX_BPF_JIT_REG);
^
include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
^
include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:300:2: note: expanded from macro '__compiletime_assert'
do { \
^
kernel/bpf/core.c:982:6: note: Assuming field 'dst_reg' is not equal to __MAX_BPF_REG
if (from->dst_reg == BPF_REG_AX || from->src_reg == BPF_REG_AX)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel/bpf/core.c:982:6: note: Left side of '||' is false
kernel/bpf/core.c:982:37: note: Assuming field 'src_reg' is not equal to __MAX_BPF_REG
if (from->dst_reg == BPF_REG_AX || from->src_reg == BPF_REG_AX)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel/bpf/core.c:982:2: note: Taking false branch
if (from->dst_reg == BPF_REG_AX || from->src_reg == BPF_REG_AX)
^
kernel/bpf/core.c:985:6: note: Assuming field 'imm' is not equal to 0
if (from->imm == 0 &&
^~~~~~~~~~~~~~
kernel/bpf/core.c:985:21: note: Left side of '&&' is false
if (from->imm == 0 &&
^
kernel/bpf/core.c:992:2: note: Control jumps to 'case 0:' at line 1068
switch (from->code) {
^
kernel/bpf/core.c:1069:54: note: The right operand of '^' is a garbage value
*to++ = BPF_ALU32_IMM(BPF_MOV, BPF_REG_AX, imm_rnd ^ aux[0].imm);
^
include/linux/filter.h:124:12: note: expanded from macro 'BPF_ALU32_IMM'
.imm = IMM })
^~~
Suppressed 13 warnings (13 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
11 warnings generated.
>> mm/gup.c:708:2: warning: Value stored to 'page' is never read [clang-analyzer-deadcode.DeadStores]
page = follow_trans_huge_pmd(vma, address, pmd, flags);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:708:2: note: Value stored to 'page' is never read
page = follow_trans_huge_pmd(vma, address, pmd, flags);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1294:13: warning: Dereference of null pointer (loaded from variable 'unlocked') [clang-analyzer-core.NullDereference]
*unlocked = true;
~~~~~~~~ ^
mm/gup.c:1268:6: note: Assuming 'unlocked' is null
if (unlocked)
^~~~~~~~
mm/gup.c:1268:2: note: Taking false branch
if (unlocked)
^
mm/gup.c:1273:6: note: Assuming 'vma' is non-null
if (!vma || address < vma->vm_start)
^~~~
mm/gup.c:1273:6: note: Left side of '||' is false
mm/gup.c:1273:14: note: Assuming 'address' is >= field 'vm_start'
if (!vma || address < vma->vm_start)
^~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1273:2: note: Taking false branch
if (!vma || address < vma->vm_start)
^
mm/gup.c:1276:7: note: Calling 'vma_permits_fault'
if (!vma_permits_fault(vma, fault_flags))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1210:18: note: Assuming the condition is false
bool write = !!(fault_flags & FAULT_FLAG_WRITE);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1211:18: note: Assuming the condition is false
bool foreign = !!(fault_flags & FAULT_FLAG_REMOTE);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1212:24: note: 'write' is true
vm_flags_t vm_flags = write ? VM_WRITE : VM_READ;
^~~~~
mm/gup.c:1212:24: note: '?' condition is true
mm/gup.c:1214:6: note: Assuming the condition is false
if (!(vm_flags & vma->vm_flags))
^~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1214:2: note: Taking false branch
if (!(vm_flags & vma->vm_flags))
^
mm/gup.c:1224:7: note: Calling 'arch_vma_access_permitted'
if (!arch_vma_access_permitted(vma, write, false, foreign))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/asm-generic/mm_hooks.h:29:2: note: Returning the value 1, which participates in a condition later
return true;
^~~~~~~~~~~
mm/gup.c:1224:7: note: Returning from 'arch_vma_access_permitted'
if (!arch_vma_access_permitted(vma, write, false, foreign))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1224:2: note: Taking false branch
if (!arch_vma_access_permitted(vma, write, false, foreign))
^
mm/gup.c:1227:2: note: Returning the value 1, which participates in a condition later
return true;
^~~~~~~~~~~
mm/gup.c:1276:7: note: Returning from 'vma_permits_fault'
if (!vma_permits_fault(vma, fault_flags))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1276:2: note: Taking false branch
if (!vma_permits_fault(vma, fault_flags))
^
mm/gup.c:1279:7: note: Assuming the condition is false
if ((fault_flags & FAULT_FLAG_KILLABLE) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mm/gup.c:1279:42: note: Left side of '&&' is false
if ((fault_flags & FAULT_FLAG_KILLABLE) &&
^
mm/gup.c:1284:6: note: Assuming the condition is false
if (ret & VM_FAULT_ERROR) {
^~~~~~~~~~~~~~~~~~~~
mm/gup.c:1284:2: note: Taking false branch
if (ret & VM_FAULT_ERROR) {
^
mm/gup.c:1292:6: note: Assuming the condition is true
if (ret & VM_FAULT_RETRY) {
^~~~~~~~~~~~~~~~~~~~
mm/gup.c:1292:2: note: Taking true branch
if (ret & VM_FAULT_RETRY) {
^
mm/gup.c:1294:13: note: Dereference of null pointer (loaded from variable 'unlocked')
*unlocked = true;
~~~~~~~~ ^
Suppressed 9 warnings (9 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
7 warnings generated.
--
^ ~~~~~~
lib/assoc_array.c:409:3: note: Value stored to 'cursor' is never read
cursor = parent;
^ ~~~~~~
Suppressed 5 warnings (5 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
7 warnings generated.
lib/debugobjects.c:502:9: warning: Value stored to 'hint' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
void *hint = descr->debug_hint ?
^~~~ ~~~~~~~~~~~~~~~~~~~
lib/debugobjects.c:502:9: note: Value stored to 'hint' during its initialization is never read
void *hint = descr->debug_hint ?
^~~~ ~~~~~~~~~~~~~~~~~~~
Suppressed 6 warnings (6 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.
Suppressed 5 warnings (5 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.
Suppressed 5 warnings (5 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.
lib/math/reciprocal_div.c:51:14: warning: The result of the left shift is undefined due to shifting by '64', which is greater or equal to the width of type 'unsigned long long' [clang-analyzer-core.UndefinedBinaryOperatorResult]
mlow = 1ULL << (32 + l);
^ ~~~~~~~~
lib/math/reciprocal_div.c:47:2: note: Taking false branch
WARN(l == 32,
^
include/asm-generic/bug.h:174:2: note: expanded from macro 'WARN'
no_printk(format); \
^
include/linux/printk.h:131:2: note: expanded from macro 'no_printk'
if (0) \
^
lib/math/reciprocal_div.c:51:14: note: The result of the left shift is undefined due to shifting by '64', which is greater or equal to the width of type 'unsigned long long'
mlow = 1ULL << (32 + l);
^ ~~~~~~~~
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.
6 warnings generated.
Suppressed 6 warnings (6 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.
Suppressed 5 warnings (5 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.
Suppressed 5 warnings (5 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.
Suppressed 5 warnings (5 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
8 warnings generated.
Suppressed 8 warnings (8 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
15 warnings generated.
Suppressed 15 warnings (15 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.
12 warnings generated.
mm/shmem.c:1362:2: warning: Value stored to 'index' is never read [clang-analyzer-deadcode.DeadStores]
index = page->index;
^ ~~~~~~~~~~~
mm/shmem.c:1362:2: note: Value stored to 'index' is never read
index = page->index;
^ ~~~~~~~~~~~
>> mm/shmem.c:1554:24: warning: Value stored to 'mapping' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
struct address_space *mapping = info->vfs_inode.i_mapping;
^~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
mm/shmem.c:1554:24: note: Value stored to 'mapping' during its initialization is never read
struct address_space *mapping = info->vfs_inode.i_mapping;
^~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
Suppressed 10 warnings (9 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
11 warnings generated.
mm/percpu.c:276:44: warning: The result of the left shift is undefined because the left operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult]
return pcpu_unit_offsets[cpu] + (page_idx << PAGE_SHIFT);
^
mm/percpu.c:2247:2: note: Calling 'pcpu_reclaim_populated'
pcpu_reclaim_populated();
^~~~~~~~~~~~~~~~~~~~~~~~
mm/percpu.c:2143:2: note: 'debug_locks' is 0
lockdep_assert_held(&pcpu_lock);
^
include/linux/lockdep.h:316:2: note: expanded from macro 'lockdep_assert_held'
lockdep_assert(lockdep_is_held(l) != LOCK_STATE_NOT_HELD)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/lockdep.h:310:15: note: expanded from macro 'lockdep_assert'
do { WARN_ON(debug_locks && !(cond)); } while (0)
^~~~~~~~~~~
include/asm-generic/bug.h:166:25: note: expanded from macro 'WARN_ON'
int __ret_warn_on = !!(condition); \
^~~~~~~~~
mm/percpu.c:2143:2: note: Left side of '&&' is false
lockdep_assert_held(&pcpu_lock);
^
include/linux/lockdep.h:316:2: note: expanded from macro 'lockdep_assert_held'
lockdep_assert(lockdep_is_held(l) != LOCK_STATE_NOT_HELD)
^
include/linux/lockdep.h:310:27: note: expanded from macro 'lockdep_assert'
do { WARN_ON(debug_locks && !(cond)); } while (0)
^
mm/percpu.c:2143:2: note: Loop condition is false. Exiting loop
lockdep_assert_held(&pcpu_lock);
^
include/linux/lockdep.h:316:2: note: expanded from macro 'lockdep_assert_held'
lockdep_assert(lockdep_is_held(l) != LOCK_STATE_NOT_HELD)
^
include/linux/lockdep.h:310:2: note: expanded from macro 'lockdep_assert'
do { WARN_ON(debug_locks && !(cond)); } while (0)
^
mm/percpu.c:2151:2: note: Loop condition is true. Entering loop body
while (!list_empty(&pcpu_chunk_lists[pcpu_to_depopulate_slot])) {
^
mm/percpu.c:2152:11: note: Left side of '&&' is false
chunk = list_first_entry(&pcpu_chunk_lists[pcpu_to_depopulate_slot],
^
include/linux/list.h:522:2: note: expanded from macro 'list_first_entry'
list_entry((ptr)->next, type, member)
^
include/linux/list.h:511:2: note: expanded from macro 'list_entry'
container_of(ptr, type, member)
^
include/linux/kernel.h:495:61: note: expanded from macro 'container_of'
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
^
mm/percpu.c:2152:11: note: Taking false branch
chunk = list_first_entry(&pcpu_chunk_lists[pcpu_to_depopulate_slot],
^
include/linux/list.h:522:2: note: expanded from macro 'list_first_entry'
list_entry((ptr)->next, type, member)
^
include/linux/list.h:511:2: note: expanded from macro 'list_entry'
container_of(ptr, type, member)
^
include/linux/kernel.h:495:2: note: expanded from macro 'container_of'
BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^
mm/percpu.c:2152:11: note: Loop condition is false. Exiting loop
chunk = list_first_entry(&pcpu_chunk_lists[pcpu_to_depopulate_slot],
^
include/linux/list.h:522:2: note: expanded from macro 'list_first_entry'
--
^
include/asm-generic/rwonce.h:36:2: note: expanded from macro 'compiletime_assert_rwonce_type'
compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
^
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^
include/linux/skbuff.h:1942:2: note: Loop condition is false. Exiting loop
WRITE_ONCE(prev->next, newsk);
^
include/asm-generic/rwonce.h:60:2: note: expanded from macro 'WRITE_ONCE'
compiletime_assert_rwonce_type(x); \
^
include/asm-generic/rwonce.h:36:2: note: expanded from macro 'compiletime_assert_rwonce_type'
compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
^
include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:300:2: note: expanded from macro '__compiletime_assert'
do { \
^
include/linux/skbuff.h:1942:2: note: Dereference of null pointer
WRITE_ONCE(prev->next, newsk);
^
include/asm-generic/rwonce.h:61:2: note: expanded from macro 'WRITE_ONCE'
__WRITE_ONCE(x, val); \
^~~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:55:30: note: expanded from macro '__WRITE_ONCE'
*(volatile typeof(x) *)&(x) = (val); \
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
include/linux/skbuff.h:2048:2: warning: 2nd function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage]
__skb_insert(newsk, next->prev, next, list);
^
net/tipc/bcast.c:565:2: note: Calling 'tipc_bcbase_xmit'
tipc_bcbase_xmit(net, &xmitq);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/tipc/bcast.c:184:2: note: Taking false branch
if (skb_queue_empty(xmitq))
^
net/tipc/bcast.c:189:6: note: Assuming 'bearer_id' is < 0
if (bearer_id >= 0) {
^~~~~~~~~~~~~~
net/tipc/bcast.c:189:2: note: Taking false branch
if (bearer_id >= 0) {
^
net/tipc/bcast.c:195:2: note: Calling '__skb_queue_head_init'
__skb_queue_head_init(&_xmitq);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/tipc/bcast.c:195:2: note: Returning from '__skb_queue_head_init'
__skb_queue_head_init(&_xmitq);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/tipc/bcast.c:196:2: note: Loop condition is true. Entering loop body
for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) {
^
net/tipc/bcast.c:197:7: note: Assuming the condition is false
if (!bb->dests[bearer_id])
^~~~~~~~~~~~~~~~~~~~~
net/tipc/bcast.c:197:3: note: Taking false branch
if (!bb->dests[bearer_id])
^
net/tipc/bcast.c:200:3: note: Loop condition is true. Entering loop body
skb_queue_walk(xmitq, skb) {
^
include/linux/skbuff.h:3537:3: note: expanded from macro 'skb_queue_walk'
for (skb = (queue)->next; \
^
net/tipc/bcast.c:202:8: note: Assuming '_skb' is non-null
if (!_skb)
^~~~~
net/tipc/bcast.c:202:4: note: Taking false branch
if (!_skb)
^
net/tipc/bcast.c:204:4: note: Calling '__skb_queue_tail'
__skb_queue_tail(&_xmitq, _skb);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/skbuff.h:2081:2: note: Calling '__skb_queue_before'
__skb_queue_before(list, (struct sk_buff *)list, newsk);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/skbuff.h:2048:2: note: 2nd function call argument is an uninitialized value
__skb_insert(newsk, next->prev, next, list);
^ ~~~~~~~~~~
Suppressed 14 warnings (14 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.
9 warnings generated.
Suppressed 9 warnings (9 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
10 warnings generated.
>> mm/migrate.c:1633:3: warning: Value stored to 'gfp_mask' is never read [clang-analyzer-deadcode.DeadStores]
gfp_mask |= GFP_TRANSHUGE;
^
mm/migrate.c:1633:3: note: Value stored to 'gfp_mask' is never read
Suppressed 9 warnings (9 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
7 warnings generated.
Suppressed 7 warnings (7 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
6 warnings generated.
Suppressed 6 warnings (6 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.
18 warnings generated.
drivers/char/ipmi/ipmi_ssif.c:817:37: warning: Array access (via field 'rsp') results in a null pointer dereference [clang-analyzer-core.NullDereference]
if ((result < 0) || (len < 3) || (msg->rsp[2] != 0)) {
^ ~~~
drivers/char/ipmi/ipmi_ssif.c:618:6: note: Assuming 'result' is >= 0
if (result < 0) {
^~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:618:2: note: Taking false branch
if (result < 0) {
^
drivers/char/ipmi/ipmi_ssif.c:642:7: note: Assuming 'len' is > 1
if ((len > 1) && (ssif_info->multi_pos == 0)
^~~~~~~
drivers/char/ipmi/ipmi_ssif.c:642:6: note: Left side of '&&' is true
if ((len > 1) && (ssif_info->multi_pos == 0)
^
drivers/char/ipmi/ipmi_ssif.c:642:20: note: Assuming field 'multi_pos' is equal to 0
if ((len > 1) && (ssif_info->multi_pos == 0)
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:642:6: note: Left side of '&&' is true
if ((len > 1) && (ssif_info->multi_pos == 0)
^
drivers/char/ipmi/ipmi_ssif.c:643:9: note: Assuming the condition is false
&& (data[0] == 0x00) && (data[1] == 0x01)) {
^~~~~~~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:643:26: note: Left side of '&&' is false
&& (data[0] == 0x00) && (data[1] == 0x01)) {
^
drivers/char/ipmi/ipmi_ssif.c:661:24: note: Field 'multi_pos' is 0
} else if (ssif_info->multi_pos) {
^
drivers/char/ipmi/ipmi_ssif.c:661:9: note: Taking false branch
} else if (ssif_info->multi_pos) {
^
drivers/char/ipmi/ipmi_ssif.c:732:6: note: 'result' is >= 0
if (result < 0) {
^~~~~~
drivers/char/ipmi/ipmi_ssif.c:732:2: note: Taking false branch
if (result < 0) {
^
drivers/char/ipmi/ipmi_ssif.c:739:6: note: Assuming the condition is false
if (ssif_info->ssif_debug & SSIF_DEBUG_STATE)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:739:2: note: Taking false branch
if (ssif_info->ssif_debug & SSIF_DEBUG_STATE)
^
drivers/char/ipmi/ipmi_ssif.c:744:10: note: Calling 'ipmi_ssif_lock_cond'
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:311:2: note: Value assigned to field 'curr_msg'
spin_lock_irqsave(&ssif_info->lock, *flags);
^
include/linux/spinlock.h:393:2: note: expanded from macro 'spin_lock_irqsave'
raw_spin_lock_irqsave(spinlock_check(lock), flags); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/spinlock.h:256:11: note: expanded from macro 'raw_spin_lock_irqsave'
flags = _raw_spin_lock_irqsave(lock); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:311:2: note: Value assigned to field 'ssif_state', which participates in a condition later
spin_lock_irqsave(&ssif_info->lock, *flags);
^
include/linux/spinlock.h:393:2: note: expanded from macro 'spin_lock_irqsave'
raw_spin_lock_irqsave(spinlock_check(lock), flags); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/spinlock.h:256:11: note: expanded from macro 'raw_spin_lock_irqsave'
flags = _raw_spin_lock_irqsave(lock); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/char/ipmi/ipmi_ssif.c:311:2: note: Loop condition is false. Exiting loop
spin_lock_irqsave(&ssif_info->lock, *flags);
^
include/linux/spinlock.h:393:2: note: expanded from macro 'spin_lock_irqsave'
raw_spin_lock_irqsave(spinlock_check(lock), flags); \
^
include/linux/spinlock.h:254:2: note: expanded from macro 'raw_spin_lock_irqsave'
do { \
^
drivers/char/ipmi/ipmi_ssif.c:311:2: note: Loop condition is false. Exiting loop
spin_lock_irqsave(&ssif_info->lock, *flags);
^
include/linux/spinlock.h:391:43: note: expanded from macro 'spin_lock_irqsave'
vim +/page +708 mm/gup.c
69e68b4f03135d Kirill A. Shutemov 2014-06-04 610
080dbb618b4bc2 Aneesh Kumar K.V 2017-07-06 611 static struct page *follow_pmd_mask(struct vm_area_struct *vma,
080dbb618b4bc2 Aneesh Kumar K.V 2017-07-06 612 unsigned long address, pud_t *pudp,
df06b37ffe5a44 Keith Busch 2018-10-26 613 unsigned int flags,
df06b37ffe5a44 Keith Busch 2018-10-26 614 struct follow_page_context *ctx)
69e68b4f03135d Kirill A. Shutemov 2014-06-04 615 {
688272809fcce5 Huang Ying 2018-06-07 616 pmd_t *pmd, pmdval;
69e68b4f03135d Kirill A. Shutemov 2014-06-04 617 spinlock_t *ptl;
69e68b4f03135d Kirill A. Shutemov 2014-06-04 618 struct page *page;
69e68b4f03135d Kirill A. Shutemov 2014-06-04 619 struct mm_struct *mm = vma->vm_mm;
69e68b4f03135d Kirill A. Shutemov 2014-06-04 620
080dbb618b4bc2 Aneesh Kumar K.V 2017-07-06 621 pmd = pmd_offset(pudp, address);
688272809fcce5 Huang Ying 2018-06-07 622 /*
688272809fcce5 Huang Ying 2018-06-07 623 * The READ_ONCE() will stabilize the pmdval in a register or
688272809fcce5 Huang Ying 2018-06-07 624 * on the stack so that it will stop changing under the code.
688272809fcce5 Huang Ying 2018-06-07 625 */
688272809fcce5 Huang Ying 2018-06-07 626 pmdval = READ_ONCE(*pmd);
688272809fcce5 Huang Ying 2018-06-07 627 if (pmd_none(pmdval))
69e68b4f03135d Kirill A. Shutemov 2014-06-04 628 return no_page_table(vma, flags);
be9d30458913f7 Wei Yang 2020-01-30 629 if (pmd_huge(pmdval) && is_vm_hugetlb_page(vma)) {
e66f17ff71772b Naoya Horiguchi 2015-02-11 630 page = follow_huge_pmd(mm, address, pmd, flags);
e66f17ff71772b Naoya Horiguchi 2015-02-11 631 if (page)
4bbd4c776a63a0 Kirill A. Shutemov 2014-06-04 632 return page;
e66f17ff71772b Naoya Horiguchi 2015-02-11 633 return no_page_table(vma, flags);
4bbd4c776a63a0 Kirill A. Shutemov 2014-06-04 634 }
688272809fcce5 Huang Ying 2018-06-07 635 if (is_hugepd(__hugepd(pmd_val(pmdval)))) {
4dc71451a2078e Aneesh Kumar K.V 2017-07-06 636 page = follow_huge_pd(vma, address,
688272809fcce5 Huang Ying 2018-06-07 637 __hugepd(pmd_val(pmdval)), flags,
4dc71451a2078e Aneesh Kumar K.V 2017-07-06 638 PMD_SHIFT);
4dc71451a2078e Aneesh Kumar K.V 2017-07-06 639 if (page)
4dc71451a2078e Aneesh Kumar K.V 2017-07-06 640 return page;
4dc71451a2078e Aneesh Kumar K.V 2017-07-06 641 return no_page_table(vma, flags);
4dc71451a2078e Aneesh Kumar K.V 2017-07-06 642 }
84c3fc4e9c563d Zi Yan 2017-09-08 643 retry:
688272809fcce5 Huang Ying 2018-06-07 644 if (!pmd_present(pmdval)) {
84c3fc4e9c563d Zi Yan 2017-09-08 645 if (likely(!(flags & FOLL_MIGRATION)))
84c3fc4e9c563d Zi Yan 2017-09-08 646 return no_page_table(vma, flags);
84c3fc4e9c563d Zi Yan 2017-09-08 647 VM_BUG_ON(thp_migration_supported() &&
688272809fcce5 Huang Ying 2018-06-07 648 !is_pmd_migration_entry(pmdval));
688272809fcce5 Huang Ying 2018-06-07 649 if (is_pmd_migration_entry(pmdval))
84c3fc4e9c563d Zi Yan 2017-09-08 650 pmd_migration_entry_wait(mm, pmd);
688272809fcce5 Huang Ying 2018-06-07 651 pmdval = READ_ONCE(*pmd);
688272809fcce5 Huang Ying 2018-06-07 652 /*
688272809fcce5 Huang Ying 2018-06-07 653 * MADV_DONTNEED may convert the pmd to null because
c1e8d7c6a7a682 Michel Lespinasse 2020-06-08 654 * mmap_lock is held in read mode
688272809fcce5 Huang Ying 2018-06-07 655 */
688272809fcce5 Huang Ying 2018-06-07 656 if (pmd_none(pmdval))
688272809fcce5 Huang Ying 2018-06-07 657 return no_page_table(vma, flags);
84c3fc4e9c563d Zi Yan 2017-09-08 658 goto retry;
84c3fc4e9c563d Zi Yan 2017-09-08 659 }
688272809fcce5 Huang Ying 2018-06-07 660 if (pmd_devmap(pmdval)) {
3565fce3a6597e Dan Williams 2016-01-15 661 ptl = pmd_lock(mm, pmd);
df06b37ffe5a44 Keith Busch 2018-10-26 662 page = follow_devmap_pmd(vma, address, pmd, flags, &ctx->pgmap);
3565fce3a6597e Dan Williams 2016-01-15 663 spin_unlock(ptl);
3565fce3a6597e Dan Williams 2016-01-15 664 if (page)
3565fce3a6597e Dan Williams 2016-01-15 665 return page;
3565fce3a6597e Dan Williams 2016-01-15 666 }
688272809fcce5 Huang Ying 2018-06-07 667 if (likely(!pmd_trans_huge(pmdval)))
df06b37ffe5a44 Keith Busch 2018-10-26 668 return follow_page_pte(vma, address, pmd, flags, &ctx->pgmap);
6742d293cbe01d Kirill A. Shutemov 2016-01-15 669
688272809fcce5 Huang Ying 2018-06-07 670 if ((flags & FOLL_NUMA) && pmd_protnone(pmdval))
db08f2030a173f Aneesh Kumar K.V 2017-02-24 671 return no_page_table(vma, flags);
db08f2030a173f Aneesh Kumar K.V 2017-02-24 672
84c3fc4e9c563d Zi Yan 2017-09-08 673 retry_locked:
69e68b4f03135d Kirill A. Shutemov 2014-06-04 674 ptl = pmd_lock(mm, pmd);
688272809fcce5 Huang Ying 2018-06-07 675 if (unlikely(pmd_none(*pmd))) {
688272809fcce5 Huang Ying 2018-06-07 676 spin_unlock(ptl);
688272809fcce5 Huang Ying 2018-06-07 677 return no_page_table(vma, flags);
688272809fcce5 Huang Ying 2018-06-07 678 }
84c3fc4e9c563d Zi Yan 2017-09-08 679 if (unlikely(!pmd_present(*pmd))) {
84c3fc4e9c563d Zi Yan 2017-09-08 680 spin_unlock(ptl);
84c3fc4e9c563d Zi Yan 2017-09-08 681 if (likely(!(flags & FOLL_MIGRATION)))
84c3fc4e9c563d Zi Yan 2017-09-08 682 return no_page_table(vma, flags);
84c3fc4e9c563d Zi Yan 2017-09-08 683 pmd_migration_entry_wait(mm, pmd);
84c3fc4e9c563d Zi Yan 2017-09-08 684 goto retry_locked;
84c3fc4e9c563d Zi Yan 2017-09-08 685 }
6742d293cbe01d Kirill A. Shutemov 2016-01-15 686 if (unlikely(!pmd_trans_huge(*pmd))) {
6742d293cbe01d Kirill A. Shutemov 2016-01-15 687 spin_unlock(ptl);
df06b37ffe5a44 Keith Busch 2018-10-26 688 return follow_page_pte(vma, address, pmd, flags, &ctx->pgmap);
6742d293cbe01d Kirill A. Shutemov 2016-01-15 689 }
4066c119483af8 Yang Shi 2021-04-29 690 if (flags & FOLL_SPLIT_PMD) {
6742d293cbe01d Kirill A. Shutemov 2016-01-15 691 int ret;
6742d293cbe01d Kirill A. Shutemov 2016-01-15 692 page = pmd_page(*pmd);
6742d293cbe01d Kirill A. Shutemov 2016-01-15 693 if (is_huge_zero_page(page)) {
6742d293cbe01d Kirill A. Shutemov 2016-01-15 694 spin_unlock(ptl);
6742d293cbe01d Kirill A. Shutemov 2016-01-15 695 ret = 0;
78ddc534734190 Kirill A. Shutemov 2016-01-15 696 split_huge_pmd(vma, pmd, address);
337d9abf1cd1a5 Naoya Horiguchi 2016-07-26 697 if (pmd_trans_unstable(pmd))
337d9abf1cd1a5 Naoya Horiguchi 2016-07-26 698 ret = -EBUSY;
4066c119483af8 Yang Shi 2021-04-29 699 } else {
bfe7b00de6d1e2 Song Liu 2019-09-23 700 spin_unlock(ptl);
bfe7b00de6d1e2 Song Liu 2019-09-23 701 split_huge_pmd(vma, pmd, address);
bfe7b00de6d1e2 Song Liu 2019-09-23 702 ret = pte_alloc(mm, pmd) ? -ENOMEM : 0;
69e68b4f03135d Kirill A. Shutemov 2014-06-04 703 }
6742d293cbe01d Kirill A. Shutemov 2016-01-15 704
6742d293cbe01d Kirill A. Shutemov 2016-01-15 705 return ret ? ERR_PTR(ret) :
df06b37ffe5a44 Keith Busch 2018-10-26 706 follow_page_pte(vma, address, pmd, flags, &ctx->pgmap);
69e68b4f03135d Kirill A. Shutemov 2014-06-04 707 }
6742d293cbe01d Kirill A. Shutemov 2016-01-15 @708 page = follow_trans_huge_pmd(vma, address, pmd, flags);
6742d293cbe01d Kirill A. Shutemov 2016-01-15 709 spin_unlock(ptl);
df06b37ffe5a44 Keith Busch 2018-10-26 710 ctx->page_mask = HPAGE_PMD_NR - 1;
6742d293cbe01d Kirill A. Shutemov 2016-01-15 711 return page;
69e68b4f03135d Kirill A. Shutemov 2014-06-04 712 }
4bbd4c776a63a0 Kirill A. Shutemov 2014-06-04 713
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 31445 bytes --]
next reply other threads:[~2021-11-07 8:28 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-07 8:28 kernel test robot [this message]
-- strict thread matches above, loose matches on Subject: below --
2021-11-06 9:19 [PATCH] compiler_types: mark __compiletime_assert failure as __noreturn kernel test robot
2021-10-14 13:23 Miguel Ojeda
2021-10-14 15:01 ` Peter Zijlstra
2021-10-14 17:48 ` Nick Desaulniers
2021-10-14 18:33 ` Miguel Ojeda
2021-10-14 18:41 ` Miguel Ojeda
2021-10-14 18:55 ` Nick Desaulniers
2021-10-14 19:33 ` Miguel Ojeda
2021-10-15 7:55 ` Rasmus Villemoes
2021-10-15 8:11 ` Rasmus Villemoes
2021-10-15 12:36 ` Miguel Ojeda
2021-10-14 17:26 ` Nathan Chancellor
2021-10-14 17:36 ` Nick Desaulniers
2021-10-21 23:20 ` Miguel Ojeda
2021-12-02 6:12 ` Dan Carpenter
2021-12-02 6:24 ` Dan Carpenter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202111071646.EJB2R7KC-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.