From: Olaf Hering <ohering@suse.de>
Patch-mainline: never, API changed in v5.5
Subject: hv_netvsc: deal with bpf API differences in 4.12
References: bsc#1177819, bsc#1177820
Due to lack of 85192dbf4de08795afe2b88e52a36fc6abfc3dba from v5.5-rc1,
the result of some bpf APIs must be checked.
--- a/drivers/net/hyperv/netvsc_bpf.c
+++ b/drivers/net/hyperv/netvsc_bpf.c
@@ -120,7 +120,12 @@ int netvsc_xdp_set(struct net_device *de
}
if (prog)
+ {
+ prog =
bpf_prog_add(prog, nvdev->num_chn - 1);
+ if (IS_ERR(prog))
+ return PTR_ERR(prog);
+ }
for (i = 0; i < nvdev->num_chn; i++)
rcu_assign_pointer(nvdev->chan_table[i].bpf_prog, prog);
@@ -150,7 +155,12 @@ int netvsc_vf_setxdp(struct net_device *
memset(&xdp, 0, sizeof(xdp));
if (prog)
+ {
+ prog =
bpf_prog_inc(prog);
+ if (IS_ERR(prog))
+ return PTR_ERR(prog);
+ }
xdp.command = XDP_SETUP_PROG;
xdp.prog = prog;
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -980,7 +980,10 @@ struct netvsc_device_info *netvsc_devinf
prog = netvsc_xdp_get(nvdev);
if (prog) {
+ prog =
bpf_prog_inc(prog);
+ if (IS_ERR(prog))
+ return NULL;
dev_info->bprog = prog;
}
} else {
@@ -1070,7 +1073,12 @@ static int netvsc_attach(struct net_devi
prog = dev_info->bprog;
if (prog) {
+ prog =
bpf_prog_inc(prog);
+ if (IS_ERR(prog)) {
+ ret = PTR_ERR(prog);
+ goto err1;
+ }
ret = netvsc_xdp_set(ndev, prog, NULL, nvdev);
if (ret) {
bpf_prog_put(prog);