hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
kernel/net/ipv4/tcp_cong.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Pluggable TCP congestion control support and newReno
34 * congestion control.
....@@ -20,7 +21,7 @@
2021 static LIST_HEAD(tcp_cong_list);
2122
2223 /* Simple linear search, don't expect many entries! */
23
-static struct tcp_congestion_ops *tcp_ca_find(const char *name)
24
+struct tcp_congestion_ops *tcp_ca_find(const char *name)
2425 {
2526 struct tcp_congestion_ops *e;
2627
....@@ -161,7 +162,7 @@
161162
162163 rcu_read_lock();
163164 ca = rcu_dereference(net->ipv4.tcp_congestion_control);
164
- if (unlikely(!try_module_get(ca->owner)))
165
+ if (unlikely(!bpf_try_module_get(ca, ca->owner)))
165166 ca = &tcp_reno;
166167 icsk->icsk_ca_ops = ca;
167168 rcu_read_unlock();
....@@ -175,7 +176,7 @@
175176
176177 void tcp_init_congestion_control(struct sock *sk)
177178 {
178
- const struct inet_connection_sock *icsk = inet_csk(sk);
179
+ struct inet_connection_sock *icsk = inet_csk(sk);
179180
180181 tcp_sk(sk)->prior_ssthresh = 0;
181182 if (icsk->icsk_ca_ops->init)
....@@ -184,6 +185,7 @@
184185 INET_ECN_xmit(sk);
185186 else
186187 INET_ECN_dontxmit(sk);
188
+ icsk->icsk_ca_initialized = 1;
187189 }
188190
189191 static void tcp_reinit_congestion_control(struct sock *sk,
....@@ -212,7 +214,7 @@
212214
213215 if (icsk->icsk_ca_ops->release)
214216 icsk->icsk_ca_ops->release(sk);
215
- module_put(icsk->icsk_ca_ops->owner);
217
+ bpf_module_put(icsk->icsk_ca_ops, icsk->icsk_ca_ops->owner);
216218 }
217219
218220 /* Used by sysctl to change default congestion control */
....@@ -226,7 +228,7 @@
226228 ca = tcp_ca_find_autoload(net, name);
227229 if (!ca) {
228230 ret = -ENOENT;
229
- } else if (!try_module_get(ca->owner)) {
231
+ } else if (!bpf_try_module_get(ca, ca->owner)) {
230232 ret = -EBUSY;
231233 } else if (!net_eq(net, &init_net) &&
232234 !(ca->flags & TCP_CONG_NON_RESTRICTED)) {
....@@ -235,7 +237,7 @@
235237 } else {
236238 prev = xchg(&net->ipv4.tcp_congestion_control, ca);
237239 if (prev)
238
- module_put(prev->owner);
240
+ bpf_module_put(prev, prev->owner);
239241
240242 ca->flags |= TCP_CONG_NON_RESTRICTED;
241243 ret = 0;
....@@ -264,6 +266,9 @@
264266 offs += snprintf(buf + offs, maxlen - offs,
265267 "%s%s",
266268 offs == 0 ? "" : " ", ca->name);
269
+
270
+ if (WARN_ON_ONCE(offs >= maxlen))
271
+ break;
267272 }
268273 rcu_read_unlock();
269274 }
....@@ -293,6 +298,9 @@
293298 offs += snprintf(buf + offs, maxlen - offs,
294299 "%s%s",
295300 offs == 0 ? "" : " ", ca->name);
301
+
302
+ if (WARN_ON_ONCE(offs >= maxlen))
303
+ break;
296304 }
297305 rcu_read_unlock();
298306 }
....@@ -342,7 +350,7 @@
342350 * already initialized.
343351 */
344352 int tcp_set_congestion_control(struct sock *sk, const char *name, bool load,
345
- bool reinit, bool cap_net_admin)
353
+ bool cap_net_admin)
346354 {
347355 struct inet_connection_sock *icsk = inet_csk(sk);
348356 const struct tcp_congestion_ops *ca;
....@@ -363,28 +371,14 @@
363371 goto out;
364372 }
365373
366
- if (!ca) {
374
+ if (!ca)
367375 err = -ENOENT;
368
- } else if (!load) {
369
- const struct tcp_congestion_ops *old_ca = icsk->icsk_ca_ops;
370
-
371
- if (try_module_get(ca->owner)) {
372
- if (reinit) {
373
- tcp_reinit_congestion_control(sk, ca);
374
- } else {
375
- icsk->icsk_ca_ops = ca;
376
- module_put(old_ca->owner);
377
- }
378
- } else {
379
- err = -EBUSY;
380
- }
381
- } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || cap_net_admin)) {
376
+ else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || cap_net_admin))
382377 err = -EPERM;
383
- } else if (!try_module_get(ca->owner)) {
378
+ else if (!bpf_try_module_get(ca, ca->owner))
384379 err = -EBUSY;
385
- } else {
380
+ else
386381 tcp_reinit_congestion_control(sk, ca);
387
- }
388382 out:
389383 rcu_read_unlock();
390384 return err;