Hi Dmitry, Thank you for the patch! Yet something to improve: [auto build test ERROR on ipsec/master] [also build test ERROR on kselftest/next linus/master v5.9-rc2 next-20200825] [cannot apply to ipsec-next/master] [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/Dmitry-Safonov/xfrm-Add-compat-layer/20200826-095240 base: https://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git master config: x86_64-allmodconfig (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 reproduce (this is a W=1 build): # save the attached .config to linux build tree make W=1 ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): net/xfrm/xfrm_compat.c: In function 'xfrm_nlmsg_put_compat': >> net/xfrm/xfrm_compat.c:103:16: error: 'xfrm_msg_min' undeclared (first use in this function); did you mean 'xfrm_alg_len'? 103 | int src_len = xfrm_msg_min[type]; | ^~~~~~~~~~~~ | xfrm_alg_len net/xfrm/xfrm_compat.c:103:16: note: each undeclared identifier is reported only once for each function it appears in net/xfrm/xfrm_compat.c: In function 'xfrm_xlate64': net/xfrm/xfrm_compat.c:260:34: error: 'xfrm_msg_min' undeclared (first use in this function); did you mean 'xfrm_alg_len'? 260 | attrs = nlmsg_attrdata(nlh_src, xfrm_msg_min[type]); | ^~~~~~~~~~~~ | xfrm_alg_len net/xfrm/xfrm_compat.c: At top level: >> net/xfrm/xfrm_compat.c:275:5: error: redefinition of 'xfrm_alloc_compat' 275 | int xfrm_alloc_compat(struct sk_buff *skb) | ^~~~~~~~~~~~~~~~~ In file included from net/xfrm/xfrm_compat.c:9: include/net/xfrm.h:2007:19: note: previous definition of 'xfrm_alloc_compat' was here 2007 | static inline int xfrm_alloc_compat(struct sk_buff *skb) | ^~~~~~~~~~~~~~~~~ In file included from arch/x86/include/asm/bug.h:93, from include/linux/bug.h:5, from include/linux/thread_info.h:12, from arch/x86/include/asm/preempt.h:7, from include/linux/preempt.h:78, from include/linux/spinlock.h:51, from include/linux/seqlock.h:15, from include/linux/time.h:6, from include/linux/compat.h:10, from net/xfrm/xfrm_compat.c:7: net/xfrm/xfrm_compat.c: In function 'xfrm_alloc_compat': net/xfrm/xfrm_compat.c:282:38: error: 'xfrm_msg_min' undeclared (first use in this function); did you mean 'xfrm_alg_len'? 282 | if (WARN_ON_ONCE(type >= ARRAY_SIZE(xfrm_msg_min))) | ^~~~~~~~~~~~ include/asm-generic/bug.h:102:25: note: in definition of macro 'WARN_ON_ONCE' 102 | int __ret_warn_on = !!(condition); \ | ^~~~~~~~~ net/xfrm/xfrm_compat.c:282:27: note: in expansion of macro 'ARRAY_SIZE' 282 | if (WARN_ON_ONCE(type >= ARRAY_SIZE(xfrm_msg_min))) | ^~~~~~~~~~ >> include/linux/build_bug.h:16:51: error: bit-field '' width not an integer constant 16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); }))) | ^ include/asm-generic/bug.h:102:25: note: in definition of macro 'WARN_ON_ONCE' 102 | int __ret_warn_on = !!(condition); \ | ^~~~~~~~~ include/linux/compiler.h:224:28: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 224 | #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) | ^~~~~~~~~~~~~~~~~ include/linux/kernel.h:47:59: note: in expansion of macro '__must_be_array' 47 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) | ^~~~~~~~~~~~~~~ net/xfrm/xfrm_compat.c:282:27: note: in expansion of macro 'ARRAY_SIZE' 282 | if (WARN_ON_ONCE(type >= ARRAY_SIZE(xfrm_msg_min))) | ^~~~~~~~~~ # https://github.com/0day-ci/linux/commit/fa198f6763bf103396e06e12549e1dc00941a3d0 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Dmitry-Safonov/xfrm-Add-compat-layer/20200826-095240 git checkout fa198f6763bf103396e06e12549e1dc00941a3d0 vim +103 net/xfrm/xfrm_compat.c 98 99 static struct nlmsghdr *xfrm_nlmsg_put_compat(struct sk_buff *skb, 100 const struct nlmsghdr *nlh_src, u16 type) 101 { 102 int payload = compat_msg_min[type]; > 103 int src_len = xfrm_msg_min[type]; 104 struct nlmsghdr *nlh_dst; 105 106 /* Compat messages are shorter or equal to native (+padding) */ 107 if (WARN_ON_ONCE(src_len < payload)) 108 return ERR_PTR(-EMSGSIZE); 109 110 nlh_dst = nlmsg_put(skb, nlh_src->nlmsg_pid, nlh_src->nlmsg_seq, 111 nlh_src->nlmsg_type, payload, nlh_src->nlmsg_flags); 112 if (!nlh_dst) 113 return ERR_PTR(-EMSGSIZE); 114 115 memset(nlmsg_data(nlh_dst), 0, payload); 116 117 switch (nlh_src->nlmsg_type) { 118 /* Compat message has the same layout as native */ 119 case XFRM_MSG_DELSA: 120 case XFRM_MSG_DELPOLICY: 121 case XFRM_MSG_FLUSHSA: 122 case XFRM_MSG_FLUSHPOLICY: 123 case XFRM_MSG_NEWAE: 124 case XFRM_MSG_REPORT: 125 case XFRM_MSG_MIGRATE: 126 case XFRM_MSG_NEWSADINFO: 127 case XFRM_MSG_NEWSPDINFO: 128 case XFRM_MSG_MAPPING: 129 WARN_ON_ONCE(src_len != payload); 130 memcpy(nlmsg_data(nlh_dst), nlmsg_data(nlh_src), src_len); 131 break; 132 /* 4 byte alignment for trailing u64 on native, but not on compat */ 133 case XFRM_MSG_NEWSA: 134 case XFRM_MSG_NEWPOLICY: 135 case XFRM_MSG_UPDSA: 136 case XFRM_MSG_UPDPOLICY: 137 WARN_ON_ONCE(src_len != payload + 4); 138 memcpy(nlmsg_data(nlh_dst), nlmsg_data(nlh_src), payload); 139 break; 140 case XFRM_MSG_EXPIRE: { 141 const struct xfrm_user_expire *src_ue = nlmsg_data(nlh_src); 142 struct compat_xfrm_user_expire *dst_ue = nlmsg_data(nlh_dst); 143 144 /* compat_xfrm_user_expire has 4-byte smaller state */ 145 memcpy(dst_ue, src_ue, sizeof(dst_ue->state)); 146 dst_ue->hard = src_ue->hard; 147 break; 148 } 149 case XFRM_MSG_ACQUIRE: { 150 const struct xfrm_user_acquire *src_ua = nlmsg_data(nlh_src); 151 struct compat_xfrm_user_acquire *dst_ua = nlmsg_data(nlh_dst); 152 153 memcpy(dst_ua, src_ua, offsetof(struct compat_xfrm_user_acquire, aalgos)); 154 dst_ua->aalgos = src_ua->aalgos; 155 dst_ua->ealgos = src_ua->ealgos; 156 dst_ua->calgos = src_ua->calgos; 157 dst_ua->seq = src_ua->seq; 158 break; 159 } 160 case XFRM_MSG_POLEXPIRE: { 161 const struct xfrm_user_polexpire *src_upe = nlmsg_data(nlh_src); 162 struct compat_xfrm_user_polexpire *dst_upe = nlmsg_data(nlh_dst); 163 164 /* compat_xfrm_user_polexpire has 4-byte smaller state */ 165 memcpy(dst_upe, src_upe, sizeof(dst_upe->pol)); 166 dst_upe->hard = src_upe->hard; 167 break; 168 } 169 case XFRM_MSG_ALLOCSPI: { 170 const struct xfrm_userspi_info *src_usi = nlmsg_data(nlh_src); 171 struct compat_xfrm_userspi_info *dst_usi = nlmsg_data(nlh_dst); 172 173 /* compat_xfrm_user_polexpire has 4-byte smaller state */ 174 memcpy(dst_usi, src_usi, sizeof(src_usi->info)); 175 dst_usi->min = src_usi->min; 176 dst_usi->max = src_usi->max; 177 break; 178 } 179 /* Not being sent by kernel */ 180 case XFRM_MSG_GETSA: 181 case XFRM_MSG_GETPOLICY: 182 case XFRM_MSG_GETAE: 183 case XFRM_MSG_GETSADINFO: 184 case XFRM_MSG_GETSPDINFO: 185 default: 186 WARN_ONCE(1, "unsupported nlmsg_type %d", nlh_src->nlmsg_type); 187 return ERR_PTR(-EOPNOTSUPP); 188 } 189 190 return nlh_dst; 191 } 192 193 static int xfrm_nla_cpy(struct sk_buff *dst, const struct nlattr *src, int len) 194 { 195 return nla_put(dst, src->nla_type, len, nla_data(src)); 196 } 197 198 static int xfrm_xlate64_attr(struct sk_buff *dst, const struct nlattr *src) 199 { 200 switch (src->nla_type) { 201 case XFRMA_ALG_AUTH: 202 case XFRMA_ALG_CRYPT: 203 case XFRMA_ALG_COMP: 204 case XFRMA_ENCAP: 205 case XFRMA_TMPL: 206 return xfrm_nla_cpy(dst, src, nla_len(src)); 207 case XFRMA_SA: 208 return xfrm_nla_cpy(dst, src, XMSGSIZE(compat_xfrm_usersa_info)); 209 case XFRMA_POLICY: 210 return xfrm_nla_cpy(dst, src, XMSGSIZE(compat_xfrm_userpolicy_info)); 211 case XFRMA_SEC_CTX: 212 return xfrm_nla_cpy(dst, src, nla_len(src)); 213 case XFRMA_LTIME_VAL: 214 return nla_put_64bit(dst, src->nla_type, nla_len(src), 215 nla_data(src), XFRMA_PAD); 216 case XFRMA_REPLAY_VAL: 217 case XFRMA_REPLAY_THRESH: 218 case XFRMA_ETIMER_THRESH: 219 case XFRMA_SRCADDR: 220 case XFRMA_COADDR: 221 return xfrm_nla_cpy(dst, src, nla_len(src)); 222 case XFRMA_LASTUSED: 223 return nla_put_64bit(dst, src->nla_type, nla_len(src), 224 nla_data(src), XFRMA_PAD); 225 case XFRMA_POLICY_TYPE: 226 case XFRMA_MIGRATE: 227 case XFRMA_ALG_AEAD: 228 case XFRMA_KMADDRESS: 229 case XFRMA_ALG_AUTH_TRUNC: 230 case XFRMA_MARK: 231 case XFRMA_TFCPAD: 232 case XFRMA_REPLAY_ESN_VAL: 233 case XFRMA_SA_EXTRA_FLAGS: 234 case XFRMA_PROTO: 235 case XFRMA_ADDRESS_FILTER: 236 case XFRMA_OFFLOAD_DEV: 237 case XFRMA_SET_MARK: 238 case XFRMA_SET_MARK_MASK: 239 case XFRMA_IF_ID: 240 return xfrm_nla_cpy(dst, src, nla_len(src)); 241 default: 242 BUILD_BUG_ON(XFRMA_MAX != XFRMA_IF_ID); 243 WARN_ONCE(1, "unsupported nla_type %d", src->nla_type); 244 return -EOPNOTSUPP; 245 } 246 } 247 248 /* Take kernel-built (64bit layout) and create 32bit layout for userspace */ 249 static int xfrm_xlate64(struct sk_buff *dst, const struct nlmsghdr *nlh_src) 250 { 251 u16 type = nlh_src->nlmsg_type - XFRM_MSG_BASE; 252 const struct nlattr *nla, *attrs; 253 struct nlmsghdr *nlh_dst; 254 int len, remaining; 255 256 nlh_dst = xfrm_nlmsg_put_compat(dst, nlh_src, type); 257 if (IS_ERR(nlh_dst)) 258 return PTR_ERR(nlh_dst); 259 260 attrs = nlmsg_attrdata(nlh_src, xfrm_msg_min[type]); 261 len = nlmsg_attrlen(nlh_src, xfrm_msg_min[type]); 262 263 nla_for_each_attr(nla, attrs, len, remaining) { 264 int err = xfrm_xlate64_attr(dst, nla); 265 266 if (err) 267 return err; 268 } 269 270 nlmsg_end(dst, nlh_dst); 271 272 return 0; 273 } 274 > 275 int xfrm_alloc_compat(struct sk_buff *skb) --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org