Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 2
add XDPLua#7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base:master-5.6
Are you sure you want to change the base?
Uh oh!
There was an error while loading. Please reload this page.
add XDPLua #7
Changes from all commits
4d82fa2ff7c9b9f2786877d184d97e405cf13a42eb5eb463ce20f35836ceb19040b06b50e056ab6ca1322eebe24a7684995e89868deac020114485e234a3d6File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| [submodule "lib/lunatik"] | ||
| path = lib/lunatik | ||
| url = https://github.com/luainkernel/lunatik.git | ||
| [submodule "lib/luadata"] | ||
| path = lib/luadata | ||
| url = https://github.com/luainkernel/luadata | ||
| [submodule "lib/luaxdp"] | ||
| path = lib/luaxdp | ||
| url = https://github.com/luainkernel/luaxdp.git | ||
| [submodule "lib/luarcu"] | ||
| path = lib/luarcu | ||
| url = https://github.com/luainkernel/luarcu | ||
| [submodule "lib/luaunpack"] | ||
| path = lib/luaunpack | ||
| url = https://github.com/VictorNogueiraRio/luaunpack.git |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -63,13 +63,30 @@ struct xdp_rxq_info { | ||
| struct xdp_mem_info mem; | ||
| } ____cacheline_aligned; /* perf critical, avoid false-sharing */ | ||
| #ifdef CONFIG_XDP_LUA | ||
| struct xdplua_create_work { | ||
| char lua_script[8192]; | ||
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/8192/MAXSCRIPTLEN/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
| ||
| struct lua_State *L; | ||
| struct work_struct work; | ||
| spinlock_t lock; | ||
| bool init; | ||
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/init/inuse/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was about to add this comment ;-) | ||
| }; | ||
| DECLARE_PER_CPU(struct xdplua_create_work, luaworks); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
| ||
| #endif /* CONFIG_XDP_LUA */ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/\n/// | ||
| struct xdp_buff { | ||
| void *data; | ||
| void *data_end; | ||
| void *data_meta; | ||
| void *data_hard_start; | ||
| unsigned long handle; | ||
| struct xdp_rxq_info *rxq; | ||
| #ifdef CONFIG_XDP_LUA | ||
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. With the creation of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. agreed.. | ||
| struct sk_buff *skb; | ||
| struct lua_State *L; | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| }; | ||
| struct xdp_frame { | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -984,6 +984,9 @@ enum { | ||
| IFLA_XDP_DRV_PROG_ID, | ||
| IFLA_XDP_SKB_PROG_ID, | ||
| IFLA_XDP_HW_PROG_ID, | ||
| #ifdef CONFIG_XDP_LUA | ||
| IFLA_XDP_LUA_PROG, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe we should uniformize our "namespace".. it looks like we should use | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| __IFLA_XDP_MAX, | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1307,6 +1307,12 @@ config HAVE_PCSPKR_PLATFORM | ||
| config BPF | ||
| bool | ||
| config LUNATIK | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. shouldn't we put this config on Lunatik module itself? | ||
| bool "Lunatik" | ||
| default n | ||
| help | ||
| Support for the Lua interpreter | ||
| menuconfig EXPERT | ||
| bool "Configure standard kernel features (expert users)" | ||
| # Unhide debug options, to make the on-by-default options visible | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -8,6 +8,10 @@ obj-y := sock.o request_sock.o skbuff.o datagram.o stream.o scm.o \ | ||
| obj-$(CONFIG_SYSCTL) += sysctl_net_core.o | ||
| CFLAGS_dev.o = -Ilib/lunatik/lua/ -D_KERNEL \ | ||
| -Ilib/luadata/ | ||
| CFLAGS_filter.o = -Ilib/lunatik/lua/ -D_KERNEL \ | ||
| -Ilib/luadata/ -Ilib/luaunpack/ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. question: should luaunpack go on master? | ||
| obj-y += dev.o dev_addr_lists.o dst.o netevent.o \ | ||
| neighbour.o rtnetlink.o utils.o link_watch.o filter.o \ | ||
| sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \ | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -68,6 +68,14 @@ | ||
| * - netif_rx() feedback | ||
| */ | ||
| #ifdef CONFIG_XDP_LUA | ||
| #include <lua.h> | ||
| #include <lauxlib.h> | ||
| #include <lstate.h> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. do we really need | ||
| #include <lualib.h> | ||
| #include <luadata.h> | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| #include <linux/uaccess.h> | ||
| #include <linux/bitops.h> | ||
| #include <linux/capability.h> | ||
| @@ -152,6 +160,9 @@ | ||
| static DEFINE_SPINLOCK(ptype_lock); | ||
| static DEFINE_SPINLOCK(offload_lock); | ||
| #ifdef CONFIG_XDP_LUA | ||
| DEFINE_PER_CPU(struct xdplua_create_work, luaworks); | ||
| #endif | ||
| struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly; | ||
| struct list_head ptype_all __read_mostly; /* Taps */ | ||
| static struct list_head offload_base __read_mostly; | ||
| @@ -4512,6 +4523,9 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, | ||
| bool orig_bcast; | ||
| int hlen, off; | ||
| u32 mac_len; | ||
| #ifdef CONFIG_XDP_LUA | ||
| struct xdplua_create_work *lw; | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| /* Reinjected packets coming from act_mirred or similar should | ||
| * not get XDP generic processing. | ||
| @@ -4556,9 +4570,22 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, | ||
| rxqueue = netif_get_rxqueue(skb); | ||
| xdp->rxq = &rxqueue->xdp_rxq; | ||
| #ifdef CONFIG_XDP_LUA | ||
| lw = this_cpu_ptr(&luaworks); | ||
| xdp->skb = skb; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we will get rid of this, right? so, I would remove the \n above as well.. | ||
| xdp->L = lw->L; | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| act = bpf_prog_run_xdp(xdp_prog, xdp); | ||
| #ifdef CONFIG_XDP_LUA | ||
| if (lw->init) { | ||
| lw->init = false; | ||
| spin_unlock(&lw->lock); | ||
| } | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| /* check if bpf_xdp_adjust_head was used */ | ||
| off = xdp->data - orig_data; | ||
| if (off) { | ||
| @@ -5366,6 +5393,35 @@ static int generic_xdp_install(struct net_device *dev, struct netdev_bpf *xdp) | ||
| return ret; | ||
| } | ||
| #ifdef CONFIG_XDP_LUA | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/\n// | ||
| static void per_cpu_xdp_lua_install(struct work_struct *w) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/per_cpu_xdp_lua_install/xdp_lua_install_per_cpu/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please, | ||
| int this_cpu = smp_processor_id(); | ||
| struct xdplua_create_work *lw = | ||
| container_of(w, struct xdplua_create_work, work); | ||
| spin_lock_bh(&lw->lock); | ||
| if (luaL_dostring(lw->L, lw->lua_script)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/lua_script/script/ | ||
| pr_err(KERN_INFO "error: %s\nOn cpu: %d\n", | ||
| lua_tostring(lw->L, -1), this_cpu); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you need to pop the string out of the stack, right? | ||
| } | ||
| spin_unlock_bh(&lw->lock); | ||
| } | ||
| int generic_xdp_lua_install_prog(char *lua_script) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. s/lua_script/script/ | ||
| { | ||
| int cpu; | ||
| struct xdplua_create_work *lw; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this variable can be moved to the for_each scope, right? | ||
| for_each_possible_cpu(cpu) { | ||
| lw = per_cpu_ptr(&luaworks, cpu); | ||
| strcpy(lw->lua_script, lua_script); | ||
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. strncpy(lw->lua_script, lua_script, MAXSCRIPTLEN); | ||
| schedule_work_on(cpu, &lw->work); | ||
| } | ||
| return 0; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if you can't fail, why not using void? is it some contract? | ||
| } | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| static int netif_receive_skb_internal(struct sk_buff *skb) | ||
| { | ||
| int ret; | ||
| @@ -10487,6 +10543,9 @@ static int __init net_dev_init(void) | ||
| for_each_possible_cpu(i) { | ||
| struct work_struct *flush = per_cpu_ptr(&flush_works, i); | ||
| struct softnet_data *sd = &per_cpu(softnet_data, i); | ||
| #ifdef CONFIG_XDP_LUA | ||
| struct xdplua_create_work *lw = per_cpu_ptr(&luaworks, i); | ||
| #endif | ||
| INIT_WORK(flush, flush_backlog); | ||
| @@ -10506,6 +10565,19 @@ static int __init net_dev_init(void) | ||
| init_gro_hash(&sd->backlog); | ||
| sd->backlog.poll = process_backlog; | ||
| sd->backlog.weight = weight_p; | ||
| #ifdef CONFIG_XDP_LUA | ||
| lw->L = luaL_newstate(); | ||
| WARN_ON(!lw->L); | ||
| if (!lw->L) | ||
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We need to improve this, @lneto any suggestions? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IMHO, we should fail XDPLua initiation completely and destroy all states we have created so far.. and, of course, disable XDPLua execution in runtime putting a guard.. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. btw, another example of what I was arguing on slack is to move all this code to a | ||
| continue; | ||
| luaL_openlibs(lw->L); | ||
| luaL_requiref(lw->L, "data", luaopen_data, 1); | ||
| lua_pop(lw->L, 1); | ||
| INIT_WORK(&lw->work, per_cpu_xdp_lua_install); | ||
| #endif /* CONFIG_XDP_LUA */ | ||
| } | ||
| dev_boot_phase = 0; | ||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we should add a field of luadata's datarefs into this struct to automate the reference control of these objects
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@VictorNogueiraRio it makes sense to me.. also, we should rename this struct.. perhaps,
xdplua_work..create_worksounds like a function..