Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0003 #include <linux/init.h>
0004 #include <linux/module.h>
0005 #include "bpf_preload.h"
0006 #include "iterators/iterators.lskel.h"
0007 
0008 static struct bpf_link *maps_link, *progs_link;
0009 static struct iterators_bpf *skel;
0010 
0011 static void free_links_and_skel(void)
0012 {
0013     if (!IS_ERR_OR_NULL(maps_link))
0014         bpf_link_put(maps_link);
0015     if (!IS_ERR_OR_NULL(progs_link))
0016         bpf_link_put(progs_link);
0017     iterators_bpf__destroy(skel);
0018 }
0019 
0020 static int preload(struct bpf_preload_info *obj)
0021 {
0022     strlcpy(obj[0].link_name, "maps.debug", sizeof(obj[0].link_name));
0023     obj[0].link = maps_link;
0024     strlcpy(obj[1].link_name, "progs.debug", sizeof(obj[1].link_name));
0025     obj[1].link = progs_link;
0026     return 0;
0027 }
0028 
0029 static struct bpf_preload_ops ops = {
0030     .preload = preload,
0031     .owner = THIS_MODULE,
0032 };
0033 
0034 static int load_skel(void)
0035 {
0036     int err;
0037 
0038     skel = iterators_bpf__open();
0039     if (!skel)
0040         return -ENOMEM;
0041     err = iterators_bpf__load(skel);
0042     if (err)
0043         goto out;
0044     err = iterators_bpf__attach(skel);
0045     if (err)
0046         goto out;
0047     maps_link = bpf_link_get_from_fd(skel->links.dump_bpf_map_fd);
0048     if (IS_ERR(maps_link)) {
0049         err = PTR_ERR(maps_link);
0050         goto out;
0051     }
0052     progs_link = bpf_link_get_from_fd(skel->links.dump_bpf_prog_fd);
0053     if (IS_ERR(progs_link)) {
0054         err = PTR_ERR(progs_link);
0055         goto out;
0056     }
0057     /* Avoid taking over stdin/stdout/stderr of init process. Zeroing out
0058      * makes skel_closenz() a no-op later in iterators_bpf__destroy().
0059      */
0060     close_fd(skel->links.dump_bpf_map_fd);
0061     skel->links.dump_bpf_map_fd = 0;
0062     close_fd(skel->links.dump_bpf_prog_fd);
0063     skel->links.dump_bpf_prog_fd = 0;
0064     return 0;
0065 out:
0066     free_links_and_skel();
0067     return err;
0068 }
0069 
0070 static int __init load(void)
0071 {
0072     int err;
0073 
0074     err = load_skel();
0075     if (err)
0076         return err;
0077     bpf_preload_ops = &ops;
0078     return err;
0079 }
0080 
0081 static void __exit fini(void)
0082 {
0083     bpf_preload_ops = NULL;
0084     free_links_and_skel();
0085 }
0086 late_initcall(load);
0087 module_exit(fini);
0088 MODULE_LICENSE("GPL");