Hi "Toke, I love your patch! Yet something to improve: [auto build test ERROR on bpf-next/master] url: https://github.com/0day-ci/linux/commits/Toke-H-iland-J-rgensen/xdp-Support-multiple-programs-on-a-single-interface-through-chain-calls/20191003-005238 base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master config: ia64-defconfig (attached as .config) compiler: ia64-linux-gcc (GCC) 7.4.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=7.4.0 make.cross ARCH=ia64 If you fix the issue, kindly add following tag Reported-by: kbuild test robot All error/warnings (new ones prefixed by >>): net/core/dev.c: In function 'dev_xdp_uninstall': >> net/core/dev.c:8187:3: error: implicit declaration of function 'bpf_map_put_with_uref' [-Werror=implicit-function-declaration] bpf_map_put_with_uref(chain_map); ^~~~~~~~~~~~~~~~~~~~~ net/core/dev.c: In function 'dev_change_xdp_fd': >> net/core/dev.c:8286:15: error: implicit declaration of function 'bpf_map_get_with_uref'; did you mean 'bpf_obj_get_user'? [-Werror=implicit-function-declaration] chain_map = bpf_map_get_with_uref(chain_map_fd); ^~~~~~~~~~~~~~~~~~~~~ bpf_obj_get_user >> net/core/dev.c:8286:13: warning: assignment makes pointer from integer without a cast [-Wint-conversion] chain_map = bpf_map_get_with_uref(chain_map_fd); ^ cc1: some warnings being treated as errors vim +/bpf_map_put_with_uref +8187 net/core/dev.c 8177 8178 static void dev_xdp_uninstall(struct net_device *dev) 8179 { 8180 struct bpf_map *chain_map = NULL; 8181 struct netdev_bpf xdp; 8182 bpf_op_t ndo_bpf; 8183 8184 /* Remove chain map */ 8185 rcu_swap_protected(dev->xdp_chain_map, chain_map, 1); 8186 if(chain_map) > 8187 bpf_map_put_with_uref(chain_map); 8188 8189 /* Remove generic XDP */ 8190 WARN_ON(dev_xdp_install(dev, generic_xdp_install, NULL, 0, NULL)); 8191 8192 /* Remove from the driver */ 8193 ndo_bpf = dev->netdev_ops->ndo_bpf; 8194 if (!ndo_bpf) 8195 return; 8196 8197 memset(&xdp, 0, sizeof(xdp)); 8198 xdp.command = XDP_QUERY_PROG; 8199 WARN_ON(ndo_bpf(dev, &xdp)); 8200 if (xdp.prog_id) 8201 WARN_ON(dev_xdp_install(dev, ndo_bpf, NULL, xdp.prog_flags, 8202 NULL)); 8203 8204 /* Remove HW offload */ 8205 memset(&xdp, 0, sizeof(xdp)); 8206 xdp.command = XDP_QUERY_PROG_HW; 8207 if (!ndo_bpf(dev, &xdp) && xdp.prog_id) 8208 WARN_ON(dev_xdp_install(dev, ndo_bpf, NULL, xdp.prog_flags, 8209 NULL)); 8210 } 8211 8212 /** 8213 * dev_change_xdp_fd - set or clear a bpf program for a device rx path 8214 * @dev: device 8215 * @extack: netlink extended ack 8216 * @prog_fd: new program fd or negative value to clear 8217 * @chain_map_fd: new chain map fd or negative value to clear 8218 * @flags: xdp-related flags 8219 * 8220 * Set or clear a bpf program for a device 8221 */ 8222 int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, 8223 int prog_fd, int chain_map_fd, u32 flags) 8224 { 8225 const struct net_device_ops *ops = dev->netdev_ops; 8226 struct bpf_map *chain_map = NULL; 8227 enum bpf_netdev_command query; 8228 struct bpf_prog *prog = NULL; 8229 bpf_op_t bpf_op, bpf_chk; 8230 bool offload; 8231 int err; 8232 8233 ASSERT_RTNL(); 8234 8235 offload = flags & XDP_FLAGS_HW_MODE; 8236 query = offload ? XDP_QUERY_PROG_HW : XDP_QUERY_PROG; 8237 8238 bpf_op = bpf_chk = ops->ndo_bpf; 8239 if (!bpf_op && (flags & (XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE))) { 8240 NL_SET_ERR_MSG(extack, "underlying driver does not support XDP in native mode"); 8241 return -EOPNOTSUPP; 8242 } 8243 if (!bpf_op || (flags & XDP_FLAGS_SKB_MODE)) 8244 bpf_op = generic_xdp_install; 8245 if (bpf_op == bpf_chk) 8246 bpf_chk = generic_xdp_install; 8247 8248 if (prog_fd >= 0) { 8249 u32 prog_id; 8250 8251 if (!offload && __dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG)) { 8252 NL_SET_ERR_MSG(extack, "native and generic XDP can't be active at the same time"); 8253 return -EEXIST; 8254 } 8255 8256 prog_id = __dev_xdp_query(dev, bpf_op, query); 8257 if ((flags & XDP_FLAGS_UPDATE_IF_NOEXIST) && prog_id) { 8258 NL_SET_ERR_MSG(extack, "XDP program already attached"); 8259 return -EBUSY; 8260 } 8261 8262 prog = bpf_prog_get_type_dev(prog_fd, BPF_PROG_TYPE_XDP, 8263 bpf_op == ops->ndo_bpf); 8264 if (IS_ERR(prog)) 8265 return PTR_ERR(prog); 8266 8267 if (!offload && bpf_prog_is_dev_bound(prog->aux)) { 8268 NL_SET_ERR_MSG(extack, "using device-bound program without HW_MODE flag is not supported"); 8269 bpf_prog_put(prog); 8270 return -EINVAL; 8271 } 8272 8273 if (prog->aux->id == prog_id) { 8274 bpf_prog_put(prog); 8275 return 0; 8276 } 8277 } else { 8278 if (chain_map_fd >= 0) 8279 return -EINVAL; 8280 8281 if (!__dev_xdp_query(dev, bpf_op, query)) 8282 return 0; 8283 } 8284 8285 if (chain_map_fd >= 0) { > 8286 chain_map = bpf_map_get_with_uref(chain_map_fd); 8287 if (IS_ERR(chain_map)) 8288 return PTR_ERR(chain_map); 8289 8290 if (chain_map->map_type != BPF_MAP_TYPE_XDP_CHAIN) { 8291 NL_SET_ERR_MSG(extack, "invalid chain map type"); 8292 bpf_map_put_with_uref(chain_map); 8293 return -EINVAL; 8294 } 8295 } 8296 8297 err = dev_xdp_install(dev, bpf_op, extack, flags, prog); 8298 if (err < 0) { 8299 if (prog) 8300 bpf_prog_put(prog); 8301 } else { 8302 rcu_swap_protected(dev->xdp_chain_map, chain_map, 1); 8303 } 8304 8305 if(chain_map) 8306 bpf_map_put_with_uref(chain_map); 8307 8308 return err; 8309 } 8310 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation