offload.c (cae1927c0b4a93ae15de824faca1f6f611a44fcd) | offload.c (ce3b9db4db0e0e2b9761c56d08615ea0159e4a1b) |
---|---|
1/* 2 * Copyright (C) 2017 Netronome Systems, Inc. 3 * 4 * This software is licensed under the GNU General License Version 2, 5 * June 1991 as shown in the file COPYING in the top-level directory of this 6 * source tree. 7 * 8 * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" --- 56 unchanged lines hidden (view full) --- 65err_free: 66 kfree(offload); 67 return -EINVAL; 68} 69 70static int __bpf_offload_ndo(struct bpf_prog *prog, enum bpf_netdev_command cmd, 71 struct netdev_bpf *data) 72{ | 1/* 2 * Copyright (C) 2017 Netronome Systems, Inc. 3 * 4 * This software is licensed under the GNU General License Version 2, 5 * June 1991 as shown in the file COPYING in the top-level directory of this 6 * source tree. 7 * 8 * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" --- 56 unchanged lines hidden (view full) --- 65err_free: 66 kfree(offload); 67 return -EINVAL; 68} 69 70static int __bpf_offload_ndo(struct bpf_prog *prog, enum bpf_netdev_command cmd, 71 struct netdev_bpf *data) 72{ |
73 struct net_device *netdev = prog->aux->offload->netdev; | 73 struct bpf_dev_offload *offload = prog->aux->offload; 74 struct net_device *netdev; |
74 75 ASSERT_RTNL(); 76 | 75 76 ASSERT_RTNL(); 77 |
77 if (!netdev) | 78 if (!offload) |
78 return -ENODEV; | 79 return -ENODEV; |
80 netdev = offload->netdev; |
|
79 if (!netdev->netdev_ops->ndo_bpf) 80 return -EOPNOTSUPP; 81 82 data->command = cmd; 83 84 return netdev->netdev_ops->ndo_bpf(netdev, data); 85} 86 --- 19 unchanged lines hidden (view full) --- 106int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env, 107 int insn_idx, int prev_insn_idx) 108{ 109 struct bpf_dev_offload *offload; 110 int ret = -ENODEV; 111 112 down_read(&bpf_devs_lock); 113 offload = env->prog->aux->offload; | 81 if (!netdev->netdev_ops->ndo_bpf) 82 return -EOPNOTSUPP; 83 84 data->command = cmd; 85 86 return netdev->netdev_ops->ndo_bpf(netdev, data); 87} 88 --- 19 unchanged lines hidden (view full) --- 108int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env, 109 int insn_idx, int prev_insn_idx) 110{ 111 struct bpf_dev_offload *offload; 112 int ret = -ENODEV; 113 114 down_read(&bpf_devs_lock); 115 offload = env->prog->aux->offload; |
114 if (offload->netdev) | 116 if (offload) |
115 ret = offload->dev_ops->insn_hook(env, insn_idx, prev_insn_idx); 116 up_read(&bpf_devs_lock); 117 118 return ret; 119} 120 121static void __bpf_prog_offload_destroy(struct bpf_prog *prog) 122{ 123 struct bpf_dev_offload *offload = prog->aux->offload; 124 struct netdev_bpf data = {}; 125 | 117 ret = offload->dev_ops->insn_hook(env, insn_idx, prev_insn_idx); 118 up_read(&bpf_devs_lock); 119 120 return ret; 121} 122 123static void __bpf_prog_offload_destroy(struct bpf_prog *prog) 124{ 125 struct bpf_dev_offload *offload = prog->aux->offload; 126 struct netdev_bpf data = {}; 127 |
126 /* Caution - if netdev is destroyed before the program, this function 127 * will be called twice. 128 */ 129 | |
130 data.offload.prog = prog; 131 132 if (offload->dev_state) 133 WARN_ON(__bpf_offload_ndo(prog, BPF_OFFLOAD_DESTROY, &data)); 134 | 128 data.offload.prog = prog; 129 130 if (offload->dev_state) 131 WARN_ON(__bpf_offload_ndo(prog, BPF_OFFLOAD_DESTROY, &data)); 132 |
135 offload->dev_state = false; | |
136 list_del_init(&offload->offloads); | 133 list_del_init(&offload->offloads); |
137 offload->netdev = NULL; | 134 kfree(offload); 135 prog->aux->offload = NULL; |
138} 139 140void bpf_prog_offload_destroy(struct bpf_prog *prog) 141{ | 136} 137 138void bpf_prog_offload_destroy(struct bpf_prog *prog) 139{ |
142 struct bpf_dev_offload *offload = prog->aux->offload; 143 | |
144 rtnl_lock(); 145 down_write(&bpf_devs_lock); | 140 rtnl_lock(); 141 down_write(&bpf_devs_lock); |
146 __bpf_prog_offload_destroy(prog); | 142 if (prog->aux->offload) 143 __bpf_prog_offload_destroy(prog); |
147 up_write(&bpf_devs_lock); 148 rtnl_unlock(); | 144 up_write(&bpf_devs_lock); 145 rtnl_unlock(); |
149 150 kfree(offload); | |
151} 152 153static int bpf_prog_offload_translate(struct bpf_prog *prog) 154{ 155 struct netdev_bpf data = {}; 156 int ret; 157 158 data.offload.prog = prog; --- 64 unchanged lines hidden --- | 146} 147 148static int bpf_prog_offload_translate(struct bpf_prog *prog) 149{ 150 struct netdev_bpf data = {}; 151 int ret; 152 153 data.offload.prog = prog; --- 64 unchanged lines hidden --- |