Skip to content
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

Fix script loading synchronization issue and add LuaUnpack submodule #1

Open
wants to merge 16 commits into
base: lneto-1
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@
[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
10 changes: 0 additions & 10 deletions include/linux/filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -1229,14 +1229,4 @@ struct bpf_sockopt_kern {
s32 retval;
};

#ifdef CONFIG_XDPLUA
extern struct list_head lua_state_cpu_list;

struct lua_state_cpu {
struct lua_State *L;
int cpu;
struct list_head list;
};
#endif /* CONFIG_XDPLUA */

#endif /* __LINUX_FILTER_H__ */
4 changes: 2 additions & 2 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -3684,9 +3684,9 @@ u32 __dev_xdp_query(struct net_device *dev, bpf_op_t xdp_op,
enum bpf_netdev_command cmd);
int xdp_umem_query(struct net_device *dev, u16 queue_id);

#ifdef CONFIG_XDPLUA
#ifdef CONFIG_XDP_LUA
int generic_xdp_lua_install_prog(char *lua_prog);
#endif /* CONFIG_XDPLUA */
#endif /* CONFIG_XDP_LUA */

int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
int dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
Expand Down
17 changes: 15 additions & 2 deletions include/net/xdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +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];
struct lua_State *L;
struct work_struct work;
spinlock_t lock;
bool init;
};

DECLARE_PER_CPU(struct xdplua_create_work, luaworks);
#endif /* CONFIG_XDP_LUA */


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_XDPLUA
#ifdef CONFIG_XDP_LUA
struct sk_buff *skb;
struct lua_State *L;
#endif /* CONFIG_XDPLUA */
#endif /* CONFIG_XDP_LUA */
};

struct xdp_frame {
Expand Down
10 changes: 6 additions & 4 deletions include/uapi/linux/bpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -2825,21 +2825,23 @@ union bpf_attr {
FN(sk_storage_get), \
FN(sk_storage_delete), \
FN(send_signal), \
/* #ifdef CONFIG_XDPLUA */ \
/* #ifdef CONFIG_XDP_LUA */ \
FN(lua_dataref), \
FN(lua_dataunref), \
FN(lua_pcall), \
FN(lua_tostring), \
FN(lua_pop), \
FN(lua_pushinteger), \
FN(lua_pushlightuserdata), \
FN(lua_pushlstring), \
FN(lua_pushmap), \
FN(lua_pushskb), \
FN(lua_pushstring), \
FN(lua_setstate), \
FN(lua_toboolean), \
FN(lua_tointeger),
/* #endif CONFIG_XDPLUA */
FN(lua_tointeger), \
FN(lua_newpacket), \
FN(lua_type),
/* #endif CONFIG_XDP_LUA */

/* integer value in 'imm' field of BPF_CALL instruction selects which helper
* function eBPF program intends to call
Expand Down
4 changes: 2 additions & 2 deletions include/uapi/linux/if_link.h
Original file line number Diff line number Diff line change
Expand Up @@ -974,9 +974,9 @@ enum {
IFLA_XDP_DRV_PROG_ID,
IFLA_XDP_SKB_PROG_ID,
IFLA_XDP_HW_PROG_ID,
#ifdef CONFIG_XDPLUA
#ifdef CONFIG_XDP_LUA
IFLA_XDP_LUA_PROG,
#endif /* CONFIG_XDPLUA */
#endif /* CONFIG_XDP_LUA */
__IFLA_XDP_MAX,
};

Expand Down
6 changes: 6 additions & 0 deletions init/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -1288,6 +1288,12 @@ config HAVE_PCSPKR_PLATFORM
config BPF
bool

config LUNATIK
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
Expand Down
3 changes: 2 additions & 1 deletion lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -296,9 +296,10 @@ obj-$(CONFIG_GENERIC_LIB_UCMPDI2) += ucmpdi2.o
obj-$(CONFIG_OBJAGG) += objagg.o

subdir-ccflags-y += -I$(srctree)/lib/lunatik/lua \
-I$(srctree)/lib/luadata/ \
-I$(srctree)/lib/luadata/ -I$(srctree)/lib/luaunpack/ \
-D_KERNEL
obj-$(CONFIG_LUNATIK) += lunatik/
obj-$(CONFIG_LUADATA) += luadata/
obj-$(CONFIG_LUAXDP) += luaxdp/
obj-$(CONFIG_LUARCU) += luarcu/
obj-$(CONFIG_LUAUNPACK) += luaunpack/
2 changes: 1 addition & 1 deletion lib/luarcu
Submodule luarcu updated 1 files
+8 −8 luarcu.c
1 change: 1 addition & 0 deletions lib/luaunpack
Submodule luaunpack added at 0589fc
6 changes: 4 additions & 2 deletions net/core/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +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
CFLAGS_filter.o = -Ilib/lunatik/lua/ -D_KERNEL
CFLAGS_dev.o = -Ilib/lunatik/lua/ -D_KERNEL \
-Ilib/luadata/
CFLAGS_filter.o = -Ilib/lunatik/lua/ -D_KERNEL \
-Ilib/luadata/ -Ilib/luaunpack/
obj-y += dev.o ethtool.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 \
Expand Down
105 changes: 61 additions & 44 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@
* - netif_rx() feedback
*/

#ifdef CONFIG_XDP_LUA
#include <lua.h>
#include <lauxlib.h>
#include <lstate.h>
#include <lualib.h>
#include <luadata.h>
#endif /* CONFIG_XDP_LUA */

#include <linux/uaccess.h>
#include <linux/bitops.h>
#include <linux/capability.h>
Expand Down Expand Up @@ -143,12 +151,6 @@
#include <linux/indirect_call_wrapper.h>
#include <net/devlink.h>

#ifdef CONFIG_XDPLUA
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#endif /* CONFIG_XDPLUA */

#include "net-sysfs.h"

#define MAX_GRO_SKBS 8
Expand All @@ -158,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;
Expand All @@ -170,10 +175,6 @@ static int call_netdevice_notifiers_extack(unsigned long val,
struct netlink_ext_ack *extack);
static struct napi_struct *napi_by_id(unsigned int napi_id);

#ifdef CONFIG_XDPLUA
struct list_head lua_state_cpu_list;
#endif /* CONFIG_XDPLUA */

/*
* The @dev_base_head list is protected by @dev_base_lock and the rtnl
* semaphore.
Expand Down Expand Up @@ -4337,6 +4338,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.
Expand Down Expand Up @@ -4381,12 +4385,22 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,

rxqueue = netif_get_rxqueue(skb);
xdp->rxq = &rxqueue->xdp_rxq;
#ifdef CONFIG_XDPLUA
#ifdef CONFIG_XDP_LUA
lw = this_cpu_ptr(&luaworks);

xdp->skb = skb;
#endif /* CONFIG_XDPLUA */
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) {
Expand Down Expand Up @@ -5196,21 +5210,34 @@ static int generic_xdp_install(struct net_device *dev, struct netdev_bpf *xdp)
return ret;
}

#ifdef CONFIG_XDPLUA
int generic_xdp_lua_install_prog(char *lua_prog)
#ifdef CONFIG_XDP_LUA

static void per_cpu_xdp_lua_install(struct work_struct *w) {
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)) {
pr_err(KERN_INFO "error: %s\nOn cpu: %d\n",
lua_tostring(lw->L, -1), this_cpu);
}
spin_unlock_bh(&lw->lock);
}

int generic_xdp_lua_install_prog(char *lua_script)
{
struct lua_state_cpu *sc;
int cpu;
struct xdplua_create_work *lw;

list_for_each_entry(sc, &lua_state_cpu_list, list) {
if (luaL_dostring(sc->L, lua_prog)) {
pr_err(KERN_INFO "error: %s\nOn cpu: %d\n",
lua_tostring(sc->L, -1), sc->cpu);
return -EINVAL;
}
for_each_possible_cpu(cpu) {
lw = per_cpu_ptr(&luaworks, cpu);
strcpy(lw->lua_script, lua_script);
schedule_work_on(cpu, &lw->work);
}
return 0;
}
#endif /* CONFIG_XDPLUA */
#endif /* CONFIG_XDP_LUA */

static int netif_receive_skb_internal(struct sk_buff *skb)
{
Expand Down Expand Up @@ -9829,9 +9856,6 @@ static struct pernet_operations __net_initdata default_device_ops = {
static int __init net_dev_init(void)
{
int i, rc = -ENOMEM;
#ifdef CONFIG_XDPLUA
struct lua_state_cpu *new_state_cpu;
#endif /* CONFIG_XDPLUA */

BUG_ON(!dev_boot_phase);

Expand All @@ -9846,9 +9870,6 @@ static int __init net_dev_init(void)
INIT_LIST_HEAD(&ptype_base[i]);

INIT_LIST_HEAD(&offload_base);
#ifdef CONFIG_XDPLUA
INIT_LIST_HEAD(&lua_state_cpu_list);
#endif /* CONFIG_XDPLUA */

if (register_pernet_subsys(&netdev_net_ops))
goto out;
Expand All @@ -9860,6 +9881,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);

Expand All @@ -9879,26 +9903,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);

#ifdef CONFIG_XDPLUA
new_state_cpu = (struct lua_state_cpu *)
kmalloc(sizeof(lua_state_cpu), GFP_ATOMIC);
if (!new_state_cpu)
if (!lw->L)
continue;

new_state_cpu->L = luaL_newstate();
if (!new_state_cpu->L) {
kfree(new_state_cpu);
continue;
}

luaL_openlibs(new_state_cpu->L);
luaL_requiref(new_state_cpu->L, "data", luaopen_data, 1);
lua_pop(new_state_cpu->L, 1);
new_state_cpu->cpu = i;
luaL_openlibs(lw->L);
luaL_requiref(lw->L, "data", luaopen_data, 1);
lua_pop(lw->L, 1);

list_add(&new_state_cpu->list, &lua_state_cpu_list);
#endif /* CONFIG_XDPLUA */
INIT_WORK(&lw->work, per_cpu_xdp_lua_install);
#endif /* CONFIG_XDP_LUA */
}

dev_boot_phase = 0;
Expand Down
Loading