xref: /linux/kernel/bpf/offload.c (revision af929bc938e0d0ecd839e6fed9a2ce5eb5185e5c)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2017-2018 Netronome Systems, Inc.
4  */
5 
6 #include <linux/bpf.h>
7 #include <linux/bpf_verifier.h>
8 #include <linux/bug.h>
9 #include <linux/kdev_t.h>
10 #include <linux/list.h>
11 #include <linux/lockdep.h>
12 #include <linux/netdevice.h>
13 #include <linux/printk.h>
14 #include <linux/proc_ns.h>
15 #include <linux/rhashtable.h>
16 #include <linux/rtnetlink.h>
17 #include <linux/rwsem.h>
18 #include <net/netdev_lock.h>
19 #include <net/xdp.h>
20 
21 /* Protects offdevs, members of bpf_offload_netdev and offload members
22  * of all progs.
23  * RTNL lock cannot be taken when holding this lock.
24  */
25 static DECLARE_RWSEM(bpf_devs_lock);
26 
27 struct bpf_offload_dev {
28 	const struct bpf_prog_offload_ops *ops;
29 	struct list_head netdevs;
30 	void *priv;
31 };
32 
33 struct bpf_offload_netdev {
34 	struct rhash_head l;
35 	struct net_device *netdev;
36 	struct bpf_offload_dev *offdev; /* NULL when bound-only */
37 	struct list_head progs;
38 	struct list_head maps;
39 	struct list_head offdev_netdevs;
40 };
41 
42 static const struct rhashtable_params offdevs_params = {
43 	.nelem_hint		= 4,
44 	.key_len		= sizeof(struct net_device *),
45 	.key_offset		= offsetof(struct bpf_offload_netdev, netdev),
46 	.head_offset		= offsetof(struct bpf_offload_netdev, l),
47 	.automatic_shrinking	= true,
48 };
49 
50 static struct rhashtable offdevs;
51 
52 static int bpf_dev_offload_check(struct net_device *netdev)
53 {
54 	if (!netdev)
55 		return -EINVAL;
56 	if (!netdev->netdev_ops->ndo_bpf)
57 		return -EOPNOTSUPP;
58 	return 0;
59 }
60 
61 static struct bpf_offload_netdev *
62 bpf_offload_find_netdev(struct net_device *netdev)
63 {
64 	lockdep_assert_held(&bpf_devs_lock);
65 
66 	return rhashtable_lookup_fast(&offdevs, &netdev, offdevs_params);
67 }
68 
69 static int __bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev,
70 					     struct net_device *netdev)
71 {
72 	struct bpf_offload_netdev *ondev;
73 	int err;
74 
75 	ondev = kzalloc_obj(*ondev);
76 	if (!ondev)
77 		return -ENOMEM;
78 
79 	ondev->netdev = netdev;
80 	ondev->offdev = offdev;
81 	INIT_LIST_HEAD(&ondev->progs);
82 	INIT_LIST_HEAD(&ondev->maps);
83 
84 	err = rhashtable_insert_fast(&offdevs, &ondev->l, offdevs_params);
85 	if (err) {
86 		netdev_warn(netdev, "failed to register for BPF offload\n");
87 		goto err_free;
88 	}
89 
90 	if (offdev)
91 		list_add(&ondev->offdev_netdevs, &offdev->netdevs);
92 	return 0;
93 
94 err_free:
95 	kfree(ondev);
96 	return err;
97 }
98 
99 /*
100  * @prog takes the place of a copy that the caller is about to free. Nothing
101  * keeps the netdev while a program is loaded: once the lock is dropped, no
102  * unregistration is left that has got the old copy from offload->prog.
103  */
104 void bpf_prog_dev_bound_moved(struct bpf_prog *prog)
105 {
106 	if (!bpf_prog_is_dev_bound(prog->aux))
107 		return;
108 
109 	down_read(&bpf_devs_lock);
110 	if (prog->aux->offload)
111 		prog->aux->offload->prog = prog;
112 	up_read(&bpf_devs_lock);
113 }
114 
115 static void __bpf_prog_offload_destroy(struct bpf_prog *prog)
116 {
117 	struct bpf_prog_offload *offload = prog->aux->offload;
118 
119 	if (offload->dev_state)
120 		offload->offdev->ops->destroy(prog);
121 
122 	list_del_init(&offload->offloads);
123 	kfree(offload);
124 	prog->aux->offload = NULL;
125 }
126 
127 static int bpf_map_offload_ndo(struct bpf_offloaded_map *offmap,
128 			       enum bpf_netdev_command cmd)
129 {
130 	struct netdev_bpf data = {};
131 	struct net_device *netdev;
132 
133 	ASSERT_RTNL();
134 
135 	data.command = cmd;
136 	data.offmap = offmap;
137 	/* Caller must make sure netdev is valid */
138 	netdev = offmap->netdev;
139 
140 	return netdev->netdev_ops->ndo_bpf(netdev, &data);
141 }
142 
143 static void __bpf_map_offload_destroy(struct bpf_offloaded_map *offmap)
144 {
145 	WARN_ON(bpf_map_offload_ndo(offmap, BPF_OFFLOAD_MAP_FREE));
146 	/* Make sure BPF_MAP_GET_NEXT_ID can't find this dead map */
147 	bpf_map_free_id(&offmap->map);
148 	list_del_init(&offmap->offloads);
149 	offmap->netdev = NULL;
150 }
151 
152 static void __bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev,
153 						struct net_device *netdev)
154 {
155 	struct bpf_offload_netdev *ondev, *altdev = NULL;
156 	struct bpf_offloaded_map *offmap, *mtmp;
157 	struct bpf_prog_offload *offload, *ptmp;
158 
159 	ASSERT_RTNL();
160 
161 	ondev = rhashtable_lookup_fast(&offdevs, &netdev, offdevs_params);
162 	if (WARN_ON(!ondev))
163 		return;
164 
165 	WARN_ON(rhashtable_remove_fast(&offdevs, &ondev->l, offdevs_params));
166 
167 	/* Try to move the objects to another netdev of the device */
168 	if (offdev) {
169 		list_del(&ondev->offdev_netdevs);
170 		altdev = list_first_entry_or_null(&offdev->netdevs,
171 						  struct bpf_offload_netdev,
172 						  offdev_netdevs);
173 	}
174 
175 	if (altdev) {
176 		list_for_each_entry(offload, &ondev->progs, offloads)
177 			offload->netdev = altdev->netdev;
178 		list_splice_init(&ondev->progs, &altdev->progs);
179 
180 		list_for_each_entry(offmap, &ondev->maps, offloads)
181 			offmap->netdev = altdev->netdev;
182 		list_splice_init(&ondev->maps, &altdev->maps);
183 	} else {
184 		list_for_each_entry_safe(offload, ptmp, &ondev->progs, offloads)
185 			__bpf_prog_offload_destroy(offload->prog);
186 		list_for_each_entry_safe(offmap, mtmp, &ondev->maps, offloads)
187 			__bpf_map_offload_destroy(offmap);
188 	}
189 
190 	WARN_ON(!list_empty(&ondev->progs));
191 	WARN_ON(!list_empty(&ondev->maps));
192 	kfree(ondev);
193 }
194 
195 static int __bpf_prog_dev_bound_init(struct bpf_prog *prog, struct net_device *netdev)
196 {
197 	struct bpf_offload_netdev *ondev;
198 	struct bpf_prog_offload *offload;
199 	int err;
200 
201 	offload = kzalloc_obj(*offload, GFP_USER);
202 	if (!offload)
203 		return -ENOMEM;
204 
205 	offload->prog = prog;
206 	offload->netdev = netdev;
207 
208 	ondev = bpf_offload_find_netdev(offload->netdev);
209 	/* When program is offloaded require presence of "true"
210 	 * bpf_offload_netdev, avoid the one created for !ondev case below.
211 	 */
212 	if (bpf_prog_is_offloaded(prog->aux) && (!ondev || !ondev->offdev)) {
213 		err = -EINVAL;
214 		goto err_free;
215 	}
216 	if (!ondev) {
217 		/* When only binding to the device, explicitly
218 		 * create an entry in the hashtable.
219 		 */
220 		err = __bpf_offload_dev_netdev_register(NULL, offload->netdev);
221 		if (err)
222 			goto err_free;
223 		ondev = bpf_offload_find_netdev(offload->netdev);
224 	}
225 	offload->offdev = ondev->offdev;
226 	prog->aux->offload = offload;
227 	list_add_tail(&offload->offloads, &ondev->progs);
228 
229 	return 0;
230 err_free:
231 	kfree(offload);
232 	return err;
233 }
234 
235 int bpf_prog_dev_bound_init(struct bpf_prog *prog, union bpf_attr *attr)
236 {
237 	struct net_device *netdev;
238 	int err;
239 
240 	if (attr->prog_type != BPF_PROG_TYPE_SCHED_CLS &&
241 	    attr->prog_type != BPF_PROG_TYPE_XDP)
242 		return -EINVAL;
243 
244 	if (attr->prog_flags & ~(BPF_F_XDP_DEV_BOUND_ONLY | BPF_F_XDP_HAS_FRAGS))
245 		return -EINVAL;
246 
247 	/* Frags are allowed only if program is dev-bound-only, but not
248 	 * if it is requesting bpf offload.
249 	 */
250 	if (attr->prog_flags & BPF_F_XDP_HAS_FRAGS &&
251 	    !(attr->prog_flags & BPF_F_XDP_DEV_BOUND_ONLY))
252 		return -EINVAL;
253 
254 	if (attr->prog_type == BPF_PROG_TYPE_SCHED_CLS &&
255 	    attr->prog_flags & BPF_F_XDP_DEV_BOUND_ONLY)
256 		return -EINVAL;
257 
258 	netdev = dev_get_by_index(current->nsproxy->net_ns, attr->prog_ifindex);
259 	if (!netdev)
260 		return -EINVAL;
261 
262 	err = bpf_dev_offload_check(netdev);
263 	if (err)
264 		goto out;
265 
266 	prog->aux->offload_requested = !(attr->prog_flags & BPF_F_XDP_DEV_BOUND_ONLY);
267 
268 	down_write(&bpf_devs_lock);
269 	/*
270 	 * Behind bpf_dev_bound_netdev_unregister() nobody would take the
271 	 * program off the device, which goes once the reference is dropped.
272 	 */
273 	if (READ_ONCE(netdev->reg_state) == NETREG_REGISTERED)
274 		err = __bpf_prog_dev_bound_init(prog, netdev);
275 	else
276 		err = -EINVAL;
277 	up_write(&bpf_devs_lock);
278 
279 out:
280 	dev_put(netdev);
281 	return err;
282 }
283 
284 int bpf_prog_dev_bound_inherit(struct bpf_prog *new_prog, struct bpf_prog *old_prog)
285 {
286 	int err;
287 
288 	if (!bpf_prog_is_dev_bound(old_prog->aux))
289 		return 0;
290 
291 	if (bpf_prog_is_offloaded(old_prog->aux))
292 		return -EINVAL;
293 
294 	new_prog->aux->dev_bound = old_prog->aux->dev_bound;
295 	new_prog->aux->offload_requested = old_prog->aux->offload_requested;
296 
297 	down_write(&bpf_devs_lock);
298 	if (!old_prog->aux->offload) {
299 		err = -EINVAL;
300 		goto out;
301 	}
302 
303 	err = __bpf_prog_dev_bound_init(new_prog, old_prog->aux->offload->netdev);
304 
305 out:
306 	up_write(&bpf_devs_lock);
307 	return err;
308 }
309 
310 int bpf_prog_offload_verifier_prep(struct bpf_prog *prog)
311 {
312 	struct bpf_prog_offload *offload;
313 	int ret = -ENODEV;
314 
315 	down_read(&bpf_devs_lock);
316 	offload = prog->aux->offload;
317 	if (offload) {
318 		ret = offload->offdev->ops->prepare(prog);
319 		offload->dev_state = !ret;
320 	}
321 	up_read(&bpf_devs_lock);
322 
323 	return ret;
324 }
325 
326 int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env,
327 				 int insn_idx, int prev_insn_idx)
328 {
329 	struct bpf_prog_offload *offload;
330 	int ret = -ENODEV;
331 
332 	down_read(&bpf_devs_lock);
333 	offload = env->prog->aux->offload;
334 	if (offload)
335 		ret = offload->offdev->ops->insn_hook(env, insn_idx,
336 						      prev_insn_idx);
337 	up_read(&bpf_devs_lock);
338 
339 	return ret;
340 }
341 
342 int bpf_prog_offload_finalize(struct bpf_verifier_env *env)
343 {
344 	struct bpf_prog_offload *offload;
345 	int ret = -ENODEV;
346 
347 	down_read(&bpf_devs_lock);
348 	offload = env->prog->aux->offload;
349 	if (offload) {
350 		if (offload->offdev->ops->finalize)
351 			ret = offload->offdev->ops->finalize(env);
352 		else
353 			ret = 0;
354 	}
355 	up_read(&bpf_devs_lock);
356 
357 	return ret;
358 }
359 
360 void
361 bpf_prog_offload_replace_insn(struct bpf_verifier_env *env, u32 off,
362 			      struct bpf_insn *insn)
363 {
364 	const struct bpf_prog_offload_ops *ops;
365 	struct bpf_prog_offload *offload;
366 	int ret = -EOPNOTSUPP;
367 
368 	down_read(&bpf_devs_lock);
369 	offload = env->prog->aux->offload;
370 	if (offload) {
371 		ops = offload->offdev->ops;
372 		if (!offload->opt_failed && ops->replace_insn)
373 			ret = ops->replace_insn(env, off, insn);
374 		offload->opt_failed |= ret;
375 	}
376 	up_read(&bpf_devs_lock);
377 }
378 
379 void
380 bpf_prog_offload_remove_insns(struct bpf_verifier_env *env, u32 off, u32 cnt)
381 {
382 	struct bpf_prog_offload *offload;
383 	int ret = -EOPNOTSUPP;
384 
385 	down_read(&bpf_devs_lock);
386 	offload = env->prog->aux->offload;
387 	if (offload) {
388 		if (!offload->opt_failed && offload->offdev->ops->remove_insns)
389 			ret = offload->offdev->ops->remove_insns(env, off, cnt);
390 		offload->opt_failed |= ret;
391 	}
392 	up_read(&bpf_devs_lock);
393 }
394 
395 void bpf_prog_dev_bound_destroy(struct bpf_prog *prog)
396 {
397 	struct bpf_offload_netdev *ondev;
398 	struct net_device *netdev;
399 
400 	rtnl_lock();
401 	down_write(&bpf_devs_lock);
402 	if (prog->aux->offload) {
403 		list_del_init(&prog->aux->offload->offloads);
404 
405 		netdev = prog->aux->offload->netdev;
406 		__bpf_prog_offload_destroy(prog);
407 
408 		ondev = bpf_offload_find_netdev(netdev);
409 		if (!ondev->offdev && list_empty(&ondev->progs))
410 			__bpf_offload_dev_netdev_unregister(NULL, netdev);
411 	}
412 	up_write(&bpf_devs_lock);
413 	rtnl_unlock();
414 }
415 
416 static int bpf_prog_offload_translate(struct bpf_prog *prog)
417 {
418 	struct bpf_prog_offload *offload;
419 	int ret = -ENODEV;
420 
421 	down_read(&bpf_devs_lock);
422 	offload = prog->aux->offload;
423 	if (offload)
424 		ret = offload->offdev->ops->translate(prog);
425 	up_read(&bpf_devs_lock);
426 
427 	return ret;
428 }
429 
430 static unsigned int bpf_prog_warn_on_exec(const void *ctx,
431 					  const struct bpf_insn *insn)
432 {
433 	WARN(1, "attempt to execute device eBPF program on the host!");
434 	return 0;
435 }
436 
437 int bpf_prog_offload_compile(struct bpf_prog *prog)
438 {
439 	prog->bpf_func = bpf_prog_warn_on_exec;
440 
441 	return bpf_prog_offload_translate(prog);
442 }
443 
444 struct ns_get_path_bpf_prog_args {
445 	struct bpf_prog *prog;
446 	struct bpf_prog_info *info;
447 };
448 
449 static struct ns_common *bpf_prog_offload_info_fill_ns(void *private_data)
450 {
451 	struct ns_get_path_bpf_prog_args *args = private_data;
452 	struct bpf_prog_aux *aux = args->prog->aux;
453 	struct ns_common *ns;
454 	struct net *net;
455 
456 	rtnl_lock();
457 	down_read(&bpf_devs_lock);
458 
459 	if (aux->offload) {
460 		args->info->ifindex = aux->offload->netdev->ifindex;
461 		net = maybe_get_net(dev_net(aux->offload->netdev));
462 		ns = net ? &net->ns : NULL;
463 	} else {
464 		args->info->ifindex = 0;
465 		ns = NULL;
466 	}
467 
468 	up_read(&bpf_devs_lock);
469 	rtnl_unlock();
470 
471 	return ns;
472 }
473 
474 int bpf_prog_offload_info_fill(struct bpf_prog_info *info,
475 			       struct bpf_prog *prog)
476 {
477 	struct ns_get_path_bpf_prog_args args = {
478 		.prog	= prog,
479 		.info	= info,
480 	};
481 	struct bpf_prog_aux *aux = prog->aux;
482 	struct inode *ns_inode;
483 	struct path ns_path;
484 	char __user *uinsns;
485 	int res;
486 	u32 ulen;
487 
488 	res = ns_get_path_cb(&ns_path, bpf_prog_offload_info_fill_ns, &args);
489 	if (res) {
490 		if (!info->ifindex)
491 			return -ENODEV;
492 		return res;
493 	}
494 
495 	down_read(&bpf_devs_lock);
496 
497 	if (!aux->offload) {
498 		up_read(&bpf_devs_lock);
499 		return -ENODEV;
500 	}
501 
502 	ulen = info->jited_prog_len;
503 	info->jited_prog_len = aux->offload->jited_len;
504 	if (info->jited_prog_len && ulen) {
505 		uinsns = u64_to_user_ptr(info->jited_prog_insns);
506 		ulen = min_t(u32, info->jited_prog_len, ulen);
507 		if (copy_to_user(uinsns, aux->offload->jited_image, ulen)) {
508 			up_read(&bpf_devs_lock);
509 			return -EFAULT;
510 		}
511 	}
512 
513 	up_read(&bpf_devs_lock);
514 
515 	ns_inode = ns_path.dentry->d_inode;
516 	info->netns_dev = new_encode_dev(ns_inode->i_sb->s_dev);
517 	info->netns_ino = ns_inode->i_ino;
518 	path_put(&ns_path);
519 
520 	return 0;
521 }
522 
523 const struct bpf_prog_ops bpf_offload_prog_ops = {
524 };
525 
526 struct bpf_map *bpf_map_offload_map_alloc(union bpf_attr *attr)
527 {
528 	struct net *net = current->nsproxy->net_ns;
529 	struct bpf_offload_netdev *ondev;
530 	struct bpf_offloaded_map *offmap;
531 	int err;
532 
533 	if (!capable(CAP_SYS_ADMIN))
534 		return ERR_PTR(-EPERM);
535 	if (attr->map_type != BPF_MAP_TYPE_ARRAY &&
536 	    attr->map_type != BPF_MAP_TYPE_HASH)
537 		return ERR_PTR(-EINVAL);
538 
539 	offmap = bpf_map_area_alloc(sizeof(*offmap), NUMA_NO_NODE);
540 	if (!offmap)
541 		return ERR_PTR(-ENOMEM);
542 
543 	bpf_map_init_from_attr(&offmap->map, attr);
544 	rtnl_lock();
545 	offmap->netdev = __dev_get_by_index(net, attr->map_ifindex);
546 	err = bpf_dev_offload_check(offmap->netdev);
547 	if (err)
548 		goto err_unlock_rtnl;
549 
550 	netdev_lock_ops(offmap->netdev);
551 	down_write(&bpf_devs_lock);
552 
553 	ondev = bpf_offload_find_netdev(offmap->netdev);
554 	if (!ondev) {
555 		err = -EINVAL;
556 		goto err_unlock;
557 	}
558 
559 	err = bpf_map_offload_ndo(offmap, BPF_OFFLOAD_MAP_ALLOC);
560 	if (err)
561 		goto err_unlock;
562 
563 	list_add_tail(&offmap->offloads, &ondev->maps);
564 	up_write(&bpf_devs_lock);
565 	netdev_unlock_ops(offmap->netdev);
566 	rtnl_unlock();
567 
568 	return &offmap->map;
569 
570 err_unlock:
571 	up_write(&bpf_devs_lock);
572 	netdev_unlock_ops(offmap->netdev);
573 err_unlock_rtnl:
574 	rtnl_unlock();
575 	bpf_map_area_free(offmap);
576 	return ERR_PTR(err);
577 }
578 
579 void bpf_map_offload_map_free(struct bpf_map *map)
580 {
581 	struct bpf_offloaded_map *offmap = map_to_offmap(map);
582 
583 	rtnl_lock();
584 	down_write(&bpf_devs_lock);
585 	if (offmap->netdev)
586 		__bpf_map_offload_destroy(offmap);
587 	up_write(&bpf_devs_lock);
588 	rtnl_unlock();
589 
590 	bpf_map_area_free(offmap);
591 }
592 
593 u64 bpf_map_offload_map_mem_usage(const struct bpf_map *map)
594 {
595 	/* The memory dynamically allocated in netdev dev_ops is not counted */
596 	return sizeof(struct bpf_offloaded_map);
597 }
598 
599 int bpf_map_offload_lookup_elem(struct bpf_map *map, void *key, void *value)
600 {
601 	struct bpf_offloaded_map *offmap = map_to_offmap(map);
602 	int ret = -ENODEV;
603 
604 	down_read(&bpf_devs_lock);
605 	if (offmap->netdev)
606 		ret = offmap->dev_ops->map_lookup_elem(offmap, key, value);
607 	up_read(&bpf_devs_lock);
608 
609 	return ret;
610 }
611 
612 int bpf_map_offload_update_elem(struct bpf_map *map,
613 				void *key, void *value, u64 flags)
614 {
615 	struct bpf_offloaded_map *offmap = map_to_offmap(map);
616 	int ret = -ENODEV;
617 
618 	if (unlikely(flags > BPF_EXIST))
619 		return -EINVAL;
620 
621 	down_read(&bpf_devs_lock);
622 	if (offmap->netdev)
623 		ret = offmap->dev_ops->map_update_elem(offmap, key, value,
624 						       flags);
625 	up_read(&bpf_devs_lock);
626 
627 	return ret;
628 }
629 
630 int bpf_map_offload_delete_elem(struct bpf_map *map, void *key)
631 {
632 	struct bpf_offloaded_map *offmap = map_to_offmap(map);
633 	int ret = -ENODEV;
634 
635 	down_read(&bpf_devs_lock);
636 	if (offmap->netdev)
637 		ret = offmap->dev_ops->map_delete_elem(offmap, key);
638 	up_read(&bpf_devs_lock);
639 
640 	return ret;
641 }
642 
643 int bpf_map_offload_get_next_key(struct bpf_map *map, void *key, void *next_key)
644 {
645 	struct bpf_offloaded_map *offmap = map_to_offmap(map);
646 	int ret = -ENODEV;
647 
648 	down_read(&bpf_devs_lock);
649 	if (offmap->netdev)
650 		ret = offmap->dev_ops->map_get_next_key(offmap, key, next_key);
651 	up_read(&bpf_devs_lock);
652 
653 	return ret;
654 }
655 
656 struct ns_get_path_bpf_map_args {
657 	struct bpf_offloaded_map *offmap;
658 	struct bpf_map_info *info;
659 };
660 
661 static struct ns_common *bpf_map_offload_info_fill_ns(void *private_data)
662 {
663 	struct ns_get_path_bpf_map_args *args = private_data;
664 	struct ns_common *ns;
665 	struct net *net;
666 
667 	rtnl_lock();
668 	down_read(&bpf_devs_lock);
669 
670 	if (args->offmap->netdev) {
671 		args->info->ifindex = args->offmap->netdev->ifindex;
672 		net = maybe_get_net(dev_net(args->offmap->netdev));
673 		ns = net ? &net->ns : NULL;
674 	} else {
675 		args->info->ifindex = 0;
676 		ns = NULL;
677 	}
678 
679 	up_read(&bpf_devs_lock);
680 	rtnl_unlock();
681 
682 	return ns;
683 }
684 
685 int bpf_map_offload_info_fill(struct bpf_map_info *info, struct bpf_map *map)
686 {
687 	struct ns_get_path_bpf_map_args args = {
688 		.offmap	= map_to_offmap(map),
689 		.info	= info,
690 	};
691 	struct inode *ns_inode;
692 	struct path ns_path;
693 	int res;
694 
695 	res = ns_get_path_cb(&ns_path, bpf_map_offload_info_fill_ns, &args);
696 	if (res) {
697 		if (!info->ifindex)
698 			return -ENODEV;
699 		return res;
700 	}
701 
702 	ns_inode = ns_path.dentry->d_inode;
703 	info->netns_dev = new_encode_dev(ns_inode->i_sb->s_dev);
704 	info->netns_ino = ns_inode->i_ino;
705 	path_put(&ns_path);
706 
707 	return 0;
708 }
709 
710 static bool __bpf_offload_dev_match(struct bpf_prog *prog,
711 				    struct net_device *netdev)
712 {
713 	struct bpf_offload_netdev *ondev1, *ondev2;
714 	struct bpf_prog_offload *offload;
715 
716 	if (!bpf_prog_is_dev_bound(prog->aux))
717 		return false;
718 
719 	offload = prog->aux->offload;
720 	if (!offload)
721 		return false;
722 	if (offload->netdev == netdev)
723 		return true;
724 	if (!bpf_prog_is_offloaded(prog->aux))
725 		return false;
726 
727 	ondev1 = bpf_offload_find_netdev(offload->netdev);
728 	ondev2 = bpf_offload_find_netdev(netdev);
729 
730 	return ondev1 && ondev2 && ondev1->offdev == ondev2->offdev;
731 }
732 
733 bool bpf_offload_dev_match(struct bpf_prog *prog, struct net_device *netdev)
734 {
735 	bool ret;
736 
737 	down_read(&bpf_devs_lock);
738 	ret = __bpf_offload_dev_match(prog, netdev);
739 	up_read(&bpf_devs_lock);
740 
741 	return ret;
742 }
743 EXPORT_SYMBOL_GPL(bpf_offload_dev_match);
744 
745 bool bpf_prog_dev_bound_match(const struct bpf_prog *lhs, const struct bpf_prog *rhs)
746 {
747 	bool ret;
748 
749 	if (bpf_prog_is_offloaded(lhs->aux) != bpf_prog_is_offloaded(rhs->aux))
750 		return false;
751 
752 	down_read(&bpf_devs_lock);
753 	ret = lhs->aux->offload && rhs->aux->offload &&
754 	      lhs->aux->offload->netdev &&
755 	      lhs->aux->offload->netdev == rhs->aux->offload->netdev;
756 	up_read(&bpf_devs_lock);
757 
758 	return ret;
759 }
760 
761 bool bpf_offload_prog_map_match(struct bpf_prog *prog, struct bpf_map *map)
762 {
763 	struct bpf_offloaded_map *offmap;
764 	bool ret;
765 
766 	if (!bpf_map_is_offloaded(map))
767 		return bpf_map_offload_neutral(map);
768 	offmap = map_to_offmap(map);
769 
770 	down_read(&bpf_devs_lock);
771 	ret = __bpf_offload_dev_match(prog, offmap->netdev);
772 	up_read(&bpf_devs_lock);
773 
774 	return ret;
775 }
776 
777 int bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev,
778 				    struct net_device *netdev)
779 {
780 	int err;
781 
782 	down_write(&bpf_devs_lock);
783 	err = __bpf_offload_dev_netdev_register(offdev, netdev);
784 	up_write(&bpf_devs_lock);
785 	return err;
786 }
787 EXPORT_SYMBOL_GPL(bpf_offload_dev_netdev_register);
788 
789 void bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev,
790 				       struct net_device *netdev)
791 {
792 	down_write(&bpf_devs_lock);
793 	__bpf_offload_dev_netdev_unregister(offdev, netdev);
794 	up_write(&bpf_devs_lock);
795 }
796 EXPORT_SYMBOL_GPL(bpf_offload_dev_netdev_unregister);
797 
798 struct bpf_offload_dev *
799 bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops, void *priv)
800 {
801 	struct bpf_offload_dev *offdev;
802 
803 	offdev = kzalloc_obj(*offdev);
804 	if (!offdev)
805 		return ERR_PTR(-ENOMEM);
806 
807 	offdev->ops = ops;
808 	offdev->priv = priv;
809 	INIT_LIST_HEAD(&offdev->netdevs);
810 
811 	return offdev;
812 }
813 EXPORT_SYMBOL_GPL(bpf_offload_dev_create);
814 
815 void bpf_offload_dev_destroy(struct bpf_offload_dev *offdev)
816 {
817 	WARN_ON(!list_empty(&offdev->netdevs));
818 	kfree(offdev);
819 }
820 EXPORT_SYMBOL_GPL(bpf_offload_dev_destroy);
821 
822 void *bpf_offload_dev_priv(struct bpf_offload_dev *offdev)
823 {
824 	return offdev->priv;
825 }
826 EXPORT_SYMBOL_GPL(bpf_offload_dev_priv);
827 
828 void bpf_dev_bound_netdev_unregister(struct net_device *dev)
829 {
830 	struct bpf_offload_netdev *ondev;
831 
832 	ASSERT_RTNL();
833 
834 	down_write(&bpf_devs_lock);
835 	ondev = bpf_offload_find_netdev(dev);
836 	if (ondev && !ondev->offdev)
837 		__bpf_offload_dev_netdev_unregister(NULL, ondev->netdev);
838 	up_write(&bpf_devs_lock);
839 }
840 
841 int bpf_dev_bound_kfunc_check(struct bpf_verifier_log *log,
842 			      struct bpf_prog_aux *prog_aux)
843 {
844 	if (!bpf_prog_is_dev_bound(prog_aux)) {
845 		bpf_log(log, "metadata kfuncs require device-bound program\n");
846 		return -EINVAL;
847 	}
848 
849 	if (bpf_prog_is_offloaded(prog_aux)) {
850 		bpf_log(log, "metadata kfuncs can't be offloaded\n");
851 		return -EINVAL;
852 	}
853 
854 	return 0;
855 }
856 
857 void *bpf_dev_bound_resolve_kfunc(struct bpf_prog *prog, u32 func_id)
858 {
859 	const struct xdp_metadata_ops *ops;
860 	void *p = NULL;
861 
862 	/* We don't hold bpf_devs_lock while resolving several
863 	 * kfuncs and can race with the unregister_netdevice().
864 	 * We rely on bpf_dev_bound_match() check at attach
865 	 * to render this program unusable.
866 	 */
867 	down_read(&bpf_devs_lock);
868 	if (!prog->aux->offload)
869 		goto out;
870 
871 	ops = prog->aux->offload->netdev->xdp_metadata_ops;
872 	if (!ops)
873 		goto out;
874 
875 #define XDP_METADATA_KFUNC(name, _, __, xmo) \
876 	if (func_id == bpf_xdp_metadata_kfunc_id(name)) p = ops->xmo;
877 	XDP_METADATA_KFUNC_xxx
878 #undef XDP_METADATA_KFUNC
879 
880 out:
881 	up_read(&bpf_devs_lock);
882 
883 	return p;
884 }
885 
886 static int __init bpf_offload_init(void)
887 {
888 	return rhashtable_init(&offdevs, &offdevs_params);
889 }
890 
891 core_initcall(bpf_offload_init);
892