diff options
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/bpf/jit.c | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/bpf/offload.c | 5 |
2 files changed, 19 insertions, 2 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 3a5c747fd12b..5deebbc18cfd 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c | |||
@@ -2676,6 +2676,20 @@ static int nfp_bpf_ustore_calc(u64 *prog, unsigned int len) | |||
2676 | return 0; | 2676 | return 0; |
2677 | } | 2677 | } |
2678 | 2678 | ||
2679 | static void nfp_bpf_prog_trim(struct nfp_prog *nfp_prog) | ||
2680 | { | ||
2681 | void *prog; | ||
2682 | |||
2683 | prog = kvmalloc_array(nfp_prog->prog_len, sizeof(u64), GFP_KERNEL); | ||
2684 | if (!prog) | ||
2685 | return; | ||
2686 | |||
2687 | nfp_prog->__prog_alloc_len = nfp_prog->prog_len * sizeof(u64); | ||
2688 | memcpy(prog, nfp_prog->prog, nfp_prog->__prog_alloc_len); | ||
2689 | kvfree(nfp_prog->prog); | ||
2690 | nfp_prog->prog = prog; | ||
2691 | } | ||
2692 | |||
2679 | int nfp_bpf_jit(struct nfp_prog *nfp_prog) | 2693 | int nfp_bpf_jit(struct nfp_prog *nfp_prog) |
2680 | { | 2694 | { |
2681 | int ret; | 2695 | int ret; |
@@ -2691,6 +2705,8 @@ int nfp_bpf_jit(struct nfp_prog *nfp_prog) | |||
2691 | return -EINVAL; | 2705 | return -EINVAL; |
2692 | } | 2706 | } |
2693 | 2707 | ||
2708 | nfp_bpf_prog_trim(nfp_prog); | ||
2709 | |||
2694 | return ret; | 2710 | return ret; |
2695 | } | 2711 | } |
2696 | 2712 | ||
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index 5f165e1d7648..f63560550753 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/jiffies.h> | 42 | #include <linux/jiffies.h> |
43 | #include <linux/timer.h> | 43 | #include <linux/timer.h> |
44 | #include <linux/list.h> | 44 | #include <linux/list.h> |
45 | #include <linux/mm.h> | ||
45 | 46 | ||
46 | #include <net/pkt_cls.h> | 47 | #include <net/pkt_cls.h> |
47 | #include <net/tc_act/tc_gact.h> | 48 | #include <net/tc_act/tc_gact.h> |
@@ -135,7 +136,7 @@ int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, | |||
135 | max_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN); | 136 | max_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN); |
136 | nfp_prog->__prog_alloc_len = max_instr * sizeof(u64); | 137 | nfp_prog->__prog_alloc_len = max_instr * sizeof(u64); |
137 | 138 | ||
138 | nfp_prog->prog = kmalloc(nfp_prog->__prog_alloc_len, GFP_KERNEL); | 139 | nfp_prog->prog = kvmalloc(nfp_prog->__prog_alloc_len, GFP_KERNEL); |
139 | if (!nfp_prog->prog) | 140 | if (!nfp_prog->prog) |
140 | return -ENOMEM; | 141 | return -ENOMEM; |
141 | 142 | ||
@@ -147,7 +148,7 @@ int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, | |||
147 | { | 148 | { |
148 | struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; | 149 | struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; |
149 | 150 | ||
150 | kfree(nfp_prog->prog); | 151 | kvfree(nfp_prog->prog); |
151 | nfp_prog_free(nfp_prog); | 152 | nfp_prog_free(nfp_prog); |
152 | 153 | ||
153 | return 0; | 154 | return 0; |