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 ---