From: kernel test robot <lkp@intel.com>
To: Paul Chaignon <paul.chaignon@gmail.com>, bpf@vger.kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
Eduard Zingerman <eddyz87@gmail.com>
Subject: Re: [PATCH bpf-next 1/4] bpf: Refactor cleanup of bpf_prog_test_run_skb
Date: Fri, 5 Sep 2025 20:57:29 +0800 [thread overview]
Message-ID: <202509052000.sL96WwEb-lkp@intel.com> (raw)
In-Reply-To: <6fda7c7fd57e6134ff70d12b622c9c7c3cf0b226.1756983952.git.paul.chaignon@gmail.com>
Hi Paul,
kernel test robot noticed the following build warnings:
[auto build test WARNING on bpf-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Paul-Chaignon/bpf-Refactor-cleanup-of-bpf_prog_test_run_skb/20250904-201515
base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link: https://lore.kernel.org/r/6fda7c7fd57e6134ff70d12b622c9c7c3cf0b226.1756983952.git.paul.chaignon%40gmail.com
patch subject: [PATCH bpf-next 1/4] bpf: Refactor cleanup of bpf_prog_test_run_skb
config: i386-buildonly-randconfig-006-20250905 (https://download.01.org/0day-ci/archive/20250905/202509052000.sL96WwEb-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250905/202509052000.sL96WwEb-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509052000.sL96WwEb-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> net/bpf/test_run.c:1011:6: warning: variable 'sk' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
1011 | if (IS_ERR(ctx)) {
| ^~~~~~~~~~~
net/bpf/test_run.c:1142:6: note: uninitialized use occurs here
1142 | if (sk)
| ^~
net/bpf/test_run.c:1011:2: note: remove the 'if' if its condition is always false
1011 | if (IS_ERR(ctx)) {
| ^~~~~~~~~~~~~~~~~~
1012 | ret = PTR_ERR(ctx);
| ~~~~~~~~~~~~~~~~~~~
1013 | goto out;
| ~~~~~~~~~
1014 | }
| ~
net/bpf/test_run.c:996:17: note: initialize the variable 'sk' to silence this warning
996 | struct sock *sk;
| ^
| = NULL
>> net/bpf/test_run.c:1032:6: warning: variable 'skb' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
1032 | if (!sk) {
| ^~~
net/bpf/test_run.c:1140:12: note: uninitialized use occurs here
1140 | kfree_skb(skb);
| ^~~
net/bpf/test_run.c:1032:2: note: remove the 'if' if its condition is always false
1032 | if (!sk) {
| ^~~~~~~~~~
1033 | ret = -ENOMEM;
| ~~~~~~~~~~~~~~
1034 | goto out;
| ~~~~~~~~~
1035 | }
| ~
net/bpf/test_run.c:1011:6: warning: variable 'skb' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
1011 | if (IS_ERR(ctx)) {
| ^~~~~~~~~~~
net/bpf/test_run.c:1140:12: note: uninitialized use occurs here
1140 | kfree_skb(skb);
| ^~~
net/bpf/test_run.c:1011:2: note: remove the 'if' if its condition is always false
1011 | if (IS_ERR(ctx)) {
| ^~~~~~~~~~~~~~~~~~
1012 | ret = PTR_ERR(ctx);
| ~~~~~~~~~~~~~~~~~~~
1013 | goto out;
| ~~~~~~~~~
1014 | }
| ~
net/bpf/test_run.c:995:21: note: initialize the variable 'skb' to silence this warning
995 | struct sk_buff *skb;
| ^
| = NULL
3 warnings generated.
vim +1011 net/bpf/test_run.c
435b08ec0094ac Daniel Borkmann 2021-09-27 983
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 984 int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 985 union bpf_attr __user *uattr)
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 986 {
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 987 bool is_l2 = false, is_direct_pkt_access = false;
21594c44083c37 Dmitry Yakunin 2020-08-03 988 struct net *net = current->nsproxy->net_ns;
21594c44083c37 Dmitry Yakunin 2020-08-03 989 struct net_device *dev = net->loopback_dev;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 990 u32 size = kattr->test.data_size_in;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 991 u32 repeat = kattr->test.repeat;
b0b9395d865e30 Stanislav Fomichev 2019-04-09 992 struct __sk_buff *ctx = NULL;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 993 u32 retval, duration;
6e6fddc7832353 Daniel Borkmann 2018-07-11 994 int hh_len = ETH_HLEN;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 995 struct sk_buff *skb;
2cb494a36c9827 Song Liu 2018-10-19 996 struct sock *sk;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 997 void *data;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 998 int ret;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 999
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1000 if ((kattr->test.flags & ~BPF_F_TEST_SKB_CHECKSUM_COMPLETE) ||
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1001 kattr->test.cpu || kattr->test.batch_size)
1b4d60ec162f82 Song Liu 2020-09-25 1002 return -EINVAL;
1b4d60ec162f82 Song Liu 2020-09-25 1003
be3d72a2896cb2 Lorenzo Bianconi 2022-01-21 1004 data = bpf_test_init(kattr, kattr->test.data_size_in,
be3d72a2896cb2 Lorenzo Bianconi 2022-01-21 1005 size, NET_SKB_PAD + NET_IP_ALIGN,
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1006 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)));
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1007 if (IS_ERR(data))
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1008 return PTR_ERR(data);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1009
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1010 ctx = bpf_ctx_init(kattr, sizeof(struct __sk_buff));
b0b9395d865e30 Stanislav Fomichev 2019-04-09 @1011 if (IS_ERR(ctx)) {
ed22fb43432aaa Paul Chaignon 2025-09-04 1012 ret = PTR_ERR(ctx);
ed22fb43432aaa Paul Chaignon 2025-09-04 1013 goto out;
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1014 }
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1015
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1016 switch (prog->type) {
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1017 case BPF_PROG_TYPE_SCHED_CLS:
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1018 case BPF_PROG_TYPE_SCHED_ACT:
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1019 is_l2 = true;
df561f6688fef7 Gustavo A. R. Silva 2020-08-23 1020 fallthrough;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1021 case BPF_PROG_TYPE_LWT_IN:
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1022 case BPF_PROG_TYPE_LWT_OUT:
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1023 case BPF_PROG_TYPE_LWT_XMIT:
ed3e469d021cba Mahe Tardy 2024-11-25 1024 case BPF_PROG_TYPE_CGROUP_SKB:
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1025 is_direct_pkt_access = true;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1026 break;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1027 default:
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1028 break;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1029 }
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1030
435b08ec0094ac Daniel Borkmann 2021-09-27 1031 sk = sk_alloc(net, AF_UNSPEC, GFP_USER, &bpf_dummy_proto, 1);
2cb494a36c9827 Song Liu 2018-10-19 @1032 if (!sk) {
ed22fb43432aaa Paul Chaignon 2025-09-04 1033 ret = -ENOMEM;
ed22fb43432aaa Paul Chaignon 2025-09-04 1034 goto out;
2cb494a36c9827 Song Liu 2018-10-19 1035 }
2cb494a36c9827 Song Liu 2018-10-19 1036 sock_init_data(NULL, sk);
2cb494a36c9827 Song Liu 2018-10-19 1037
ce098da1497c6d Kees Cook 2022-12-07 1038 skb = slab_build_skb(data);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1039 if (!skb) {
ed22fb43432aaa Paul Chaignon 2025-09-04 1040 ret = -ENOMEM;
ed22fb43432aaa Paul Chaignon 2025-09-04 1041 goto out;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1042 }
2cb494a36c9827 Song Liu 2018-10-19 1043 skb->sk = sk;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1044
586f8525979ad9 David Miller 2017-05-02 1045 skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1046 __skb_put(skb, size);
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1047
ed22fb43432aaa Paul Chaignon 2025-09-04 1048 data = NULL; /* data released via kfree_skb */
ed22fb43432aaa Paul Chaignon 2025-09-04 1049
21594c44083c37 Dmitry Yakunin 2020-08-03 1050 if (ctx && ctx->ifindex > 1) {
21594c44083c37 Dmitry Yakunin 2020-08-03 1051 dev = dev_get_by_index(net, ctx->ifindex);
21594c44083c37 Dmitry Yakunin 2020-08-03 1052 if (!dev) {
21594c44083c37 Dmitry Yakunin 2020-08-03 1053 ret = -ENODEV;
21594c44083c37 Dmitry Yakunin 2020-08-03 1054 goto out;
21594c44083c37 Dmitry Yakunin 2020-08-03 1055 }
21594c44083c37 Dmitry Yakunin 2020-08-03 1056 }
21594c44083c37 Dmitry Yakunin 2020-08-03 1057 skb->protocol = eth_type_trans(skb, dev);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1058 skb_reset_network_header(skb);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1059
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1060 switch (skb->protocol) {
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1061 case htons(ETH_P_IP):
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1062 sk->sk_family = AF_INET;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1063 if (sizeof(struct iphdr) <= skb_headlen(skb)) {
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1064 sk->sk_rcv_saddr = ip_hdr(skb)->saddr;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1065 sk->sk_daddr = ip_hdr(skb)->daddr;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1066 }
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1067 break;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1068 #if IS_ENABLED(CONFIG_IPV6)
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1069 case htons(ETH_P_IPV6):
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1070 sk->sk_family = AF_INET6;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1071 if (sizeof(struct ipv6hdr) <= skb_headlen(skb)) {
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1072 sk->sk_v6_rcv_saddr = ipv6_hdr(skb)->saddr;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1073 sk->sk_v6_daddr = ipv6_hdr(skb)->daddr;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1074 }
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1075 break;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1076 #endif
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1077 default:
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1078 break;
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1079 }
fa5cb548ced61b Dmitry Yakunin 2020-08-03 1080
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1081 if (is_l2)
6e6fddc7832353 Daniel Borkmann 2018-07-11 1082 __skb_push(skb, hh_len);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1083 if (is_direct_pkt_access)
6aaae2b6c4330a Daniel Borkmann 2017-09-25 1084 bpf_compute_data_pointers(skb);
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1085
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1086 ret = convert___skb_to_skb(skb, ctx);
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1087 if (ret)
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1088 goto out;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1089
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1090 if (kattr->test.flags & BPF_F_TEST_SKB_CHECKSUM_COMPLETE) {
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1091 const int off = skb_network_offset(skb);
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1092 int len = skb->len - off;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1093
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1094 skb->csum = skb_checksum(skb, off, len, 0);
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1095 skb->ip_summed = CHECKSUM_COMPLETE;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1096 }
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1097
f23c4b3924d2e9 Björn Töpel 2019-12-13 1098 ret = bpf_test_run(prog, skb, repeat, &retval, &duration, false);
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1099 if (ret)
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1100 goto out;
6e6fddc7832353 Daniel Borkmann 2018-07-11 1101 if (!is_l2) {
6e6fddc7832353 Daniel Borkmann 2018-07-11 1102 if (skb_headroom(skb) < hh_len) {
6e6fddc7832353 Daniel Borkmann 2018-07-11 1103 int nhead = HH_DATA_ALIGN(hh_len - skb_headroom(skb));
6e6fddc7832353 Daniel Borkmann 2018-07-11 1104
6e6fddc7832353 Daniel Borkmann 2018-07-11 1105 if (pskb_expand_head(skb, nhead, 0, GFP_USER)) {
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1106 ret = -ENOMEM;
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1107 goto out;
6e6fddc7832353 Daniel Borkmann 2018-07-11 1108 }
6e6fddc7832353 Daniel Borkmann 2018-07-11 1109 }
6e6fddc7832353 Daniel Borkmann 2018-07-11 1110 memset(__skb_push(skb, hh_len), 0, hh_len);
6e6fddc7832353 Daniel Borkmann 2018-07-11 1111 }
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1112
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1113 if (kattr->test.flags & BPF_F_TEST_SKB_CHECKSUM_COMPLETE) {
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1114 const int off = skb_network_offset(skb);
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1115 int len = skb->len - off;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1116 __wsum csum;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1117
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1118 csum = skb_checksum(skb, off, len, 0);
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1119
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1120 if (csum_fold(skb->csum) != csum_fold(csum)) {
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1121 ret = -EBADMSG;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1122 goto out;
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1123 }
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1124 }
a3cfe84cca28f2 Vadim Fedorenko 2024-06-06 1125
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1126 convert_skb_to___skb(skb, ctx);
6e6fddc7832353 Daniel Borkmann 2018-07-11 1127
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1128 size = skb->len;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1129 /* bpf program can never convert linear skb to non-linear */
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1130 if (WARN_ON_ONCE(skb_is_nonlinear(skb)))
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1131 size = skb_headlen(skb);
7855e0db150ad8 Lorenzo Bianconi 2022-01-21 1132 ret = bpf_test_finish(kattr, uattr, skb->data, NULL, size, retval,
7855e0db150ad8 Lorenzo Bianconi 2022-01-21 1133 duration);
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1134 if (!ret)
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1135 ret = bpf_ctx_finish(kattr, uattr, ctx,
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1136 sizeof(struct __sk_buff));
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1137 out:
21594c44083c37 Dmitry Yakunin 2020-08-03 1138 if (dev && dev != net->loopback_dev)
21594c44083c37 Dmitry Yakunin 2020-08-03 1139 dev_put(dev);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1140 kfree_skb(skb);
ed22fb43432aaa Paul Chaignon 2025-09-04 1141 kfree(data);
ed22fb43432aaa Paul Chaignon 2025-09-04 1142 if (sk)
435b08ec0094ac Daniel Borkmann 2021-09-27 1143 sk_free(sk);
b0b9395d865e30 Stanislav Fomichev 2019-04-09 1144 kfree(ctx);
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1145 return ret;
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1146 }
1cf1cae963c2e6 Alexei Starovoitov 2017-03-30 1147
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2025-09-05 12:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-04 12:07 [PATCH bpf-next 0/4] bpf: Support non-linear skbs for BPF_PROG_TEST_RUN Paul Chaignon
2025-09-04 12:09 ` [PATCH bpf-next 1/4] bpf: Refactor cleanup of bpf_prog_test_run_skb Paul Chaignon
2025-09-05 12:57 ` kernel test robot [this message]
2025-09-04 12:11 ` [PATCH bpf-next 2/4] bpf: Craft non-linear skbs in BPF_PROG_TEST_RUN Paul Chaignon
2025-09-04 15:56 ` Alexei Starovoitov
2025-09-04 16:02 ` Daniel Borkmann
2025-09-04 16:27 ` Amery Hung
2025-09-05 13:23 ` Paul Chaignon
2025-09-05 16:34 ` Amery Hung
2025-09-08 17:41 ` Paul Chaignon
2025-09-08 19:09 ` Martin KaFai Lau
2025-09-08 19:10 ` Amery Hung
2025-09-08 19:16 ` Paul Chaignon
2025-09-04 12:13 ` [PATCH bpf-next 3/4] selftests/bpf: Support non-linear flag in test loader Paul Chaignon
2025-09-04 12:13 ` [PATCH bpf-next 4/4] selftests/bpf: Test direct packet access on non-linear skbs Paul Chaignon
2025-09-04 18:08 ` [syzbot ci] Re: bpf: Support non-linear skbs for BPF_PROG_TEST_RUN syzbot ci
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=202509052000.sL96WwEb-lkp@intel.com \
--to=lkp@intel.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=llvm@lists.linux.dev \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=paul.chaignon@gmail.com \
/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.