Skip to content

Commit 67e16a0

Browse files
author
CKI KWF Bot
committed
Merge: core: stable backport from upstream for 10.2 phase 1
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1557 JIRA: https://issues.redhat.com/browse/RHEL-115597 A bunch of fixes from net, addressing non critical issues in core networking. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Approved-by: Eder Zulian <ezulian@redhat.com> Approved-by: Hangbin Liu <haliu@redhat.com> Approved-by: Florian Westphal <fwestpha@redhat.com> Approved-by: Davide Caratti <dcaratti@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 944bd9b + 622f973 commit 67e16a0

File tree

10 files changed

+62
-43
lines changed

10 files changed

+62
-43
lines changed

include/net/sock.h

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ struct sk_filter;
285285
* @sk_ack_backlog: current listen backlog
286286
* @sk_max_ack_backlog: listen backlog set in listen()
287287
* @sk_uid: user id of owner
288+
* @sk_ino: inode number (zero if orphaned)
288289
* @sk_prefer_busy_poll: prefer busypolling over softirq processing
289290
* @sk_busy_poll_budget: napi processing budget when busypolling
290291
* @sk_priority: %SO_PRIORITY setting
@@ -512,6 +513,7 @@ struct sock {
512513
u32 sk_ack_backlog;
513514
u32 sk_max_ack_backlog;
514515
kuid_t sk_uid;
516+
unsigned long sk_ino;
515517
spinlock_t sk_peer_lock;
516518
int sk_bind_phc;
517519
struct pid *sk_peer_pid;
@@ -2027,6 +2029,13 @@ static inline int sk_rx_queue_get(const struct sock *sk)
20272029
static inline void sk_set_socket(struct sock *sk, struct socket *sock)
20282030
{
20292031
sk->sk_socket = sock;
2032+
if (sock) {
2033+
WRITE_ONCE(sk->sk_uid, SOCK_INODE(sock)->i_uid);
2034+
WRITE_ONCE(sk->sk_ino, SOCK_INODE(sock)->i_ino);
2035+
} else {
2036+
/* Note: sk_uid is unchanged. */
2037+
WRITE_ONCE(sk->sk_ino, 0);
2038+
}
20302039
}
20312040

20322041
static inline wait_queue_head_t *sk_sleep(struct sock *sk)
@@ -2057,14 +2066,17 @@ static inline void sock_graft(struct sock *sk, struct socket *parent)
20572066
rcu_assign_pointer(sk->sk_wq, &parent->wq);
20582067
parent->sk = sk;
20592068
sk_set_socket(sk, parent);
2060-
sk->sk_uid = SOCK_INODE(parent)->i_uid;
20612069
security_sock_graft(sk, parent);
20622070
write_unlock_bh(&sk->sk_callback_lock);
20632071
}
20642072

2073+
static inline unsigned long sock_i_ino(const struct sock *sk)
2074+
{
2075+
/* Paired with WRITE_ONCE() in sock_graft() and sock_orphan() */
2076+
return READ_ONCE(sk->sk_ino);
2077+
}
2078+
20652079
kuid_t sock_i_uid(struct sock *sk);
2066-
unsigned long __sock_i_ino(struct sock *sk);
2067-
unsigned long sock_i_ino(struct sock *sk);
20682080

20692081
static inline kuid_t sock_net_uid(const struct net *net, const struct sock *sk)
20702082
{
@@ -2970,8 +2982,11 @@ int sock_ioctl_inout(struct sock *sk, unsigned int cmd,
29702982
int sk_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
29712983
static inline bool sk_is_readable(struct sock *sk)
29722984
{
2973-
if (sk->sk_prot->sock_is_readable)
2974-
return sk->sk_prot->sock_is_readable(sk);
2985+
const struct proto *prot = READ_ONCE(sk->sk_prot);
2986+
2987+
if (prot->sock_is_readable)
2988+
return prot->sock_is_readable(sk);
2989+
29752990
return false;
29762991
}
29772992
#endif /* _SOCK_H */

net/core/gen_estimator.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ static void est_timer(struct timer_list *t)
9090
rate = (b_packets - est->last_packets) << (10 - est->intvl_log);
9191
rate = (rate >> est->ewma_log) - (est->avpps >> est->ewma_log);
9292

93+
preempt_disable_nested();
9394
write_seqcount_begin(&est->seq);
9495
est->avbps += brate;
9596
est->avpps += rate;
9697
write_seqcount_end(&est->seq);
98+
preempt_enable_nested();
9799

98100
est->last_bytes = b_bytes;
99101
est->last_packets = b_packets;

net/core/netdev-genl-gen.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,16 @@ static const struct genl_multicast_group netdev_nl_mcgrps[] = {
196196
[NETDEV_NLGRP_PAGE_POOL] = { "page-pool", },
197197
};
198198

199+
static void __netdev_nl_sock_priv_init(void *priv)
200+
{
201+
netdev_nl_sock_priv_init(priv);
202+
}
203+
204+
static void __netdev_nl_sock_priv_destroy(void *priv)
205+
{
206+
netdev_nl_sock_priv_destroy(priv);
207+
}
208+
199209
struct genl_family netdev_nl_family __ro_after_init = {
200210
.name = NETDEV_FAMILY_NAME,
201211
.version = NETDEV_FAMILY_VERSION,
@@ -207,6 +217,6 @@ struct genl_family netdev_nl_family __ro_after_init = {
207217
.mcgrps = netdev_nl_mcgrps,
208218
.n_mcgrps = ARRAY_SIZE(netdev_nl_mcgrps),
209219
.sock_priv_size = sizeof(struct list_head),
210-
.sock_priv_init = (void *)netdev_nl_sock_priv_init,
211-
.sock_priv_destroy = (void *)netdev_nl_sock_priv_destroy,
220+
.sock_priv_init = __netdev_nl_sock_priv_init,
221+
.sock_priv_destroy = __netdev_nl_sock_priv_destroy,
212222
};

net/core/netdev-genl.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,7 @@ netdev_nl_napi_fill_one(struct sk_buff *rsp, struct napi_struct *napi,
175175
if (!hdr)
176176
return -EMSGSIZE;
177177

178-
if (napi->napi_id >= MIN_NAPI_ID &&
179-
nla_put_u32(rsp, NETDEV_A_NAPI_ID, napi->napi_id))
178+
if (nla_put_u32(rsp, NETDEV_A_NAPI_ID, napi->napi_id))
180179
goto nla_put_failure;
181180

182181
if (nla_put_u32(rsp, NETDEV_A_NAPI_IFINDEX, napi->dev->ifindex))
@@ -262,6 +261,8 @@ netdev_nl_napi_dump_one(struct net_device *netdev, struct sk_buff *rsp,
262261
return err;
263262

264263
list_for_each_entry(napi, &netdev->napi_list, dev_list) {
264+
if (napi->napi_id < MIN_NAPI_ID)
265+
continue;
265266
if (ctx->napi_id && napi->napi_id >= ctx->napi_id)
266267
continue;
267268

net/core/netpoll.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,13 @@ int netpoll_setup(struct netpoll *np)
784784
if (err)
785785
goto put;
786786
rtnl_unlock();
787+
788+
/* Make sure all NAPI polls which started before dev->npinfo
789+
* was visible have exited before we start calling NAPI poll.
790+
* NAPI skips locking if dev->npinfo is NULL.
791+
*/
792+
synchronize_rcu();
793+
787794
return 0;
788795

789796
put:

net/core/skbuff.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6158,9 +6158,6 @@ int skb_ensure_writable(struct sk_buff *skb, unsigned int write_len)
61586158
if (!pskb_may_pull(skb, write_len))
61596159
return -ENOMEM;
61606160

6161-
if (!skb_frags_readable(skb))
6162-
return -EFAULT;
6163-
61646161
if (!skb_cloned(skb) || skb_clone_writable(skb, write_len))
61656162
return 0;
61666163

net/core/sock.c

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,28 +2725,6 @@ kuid_t sock_i_uid(struct sock *sk)
27252725
}
27262726
EXPORT_SYMBOL(sock_i_uid);
27272727

2728-
unsigned long __sock_i_ino(struct sock *sk)
2729-
{
2730-
unsigned long ino;
2731-
2732-
read_lock(&sk->sk_callback_lock);
2733-
ino = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_ino : 0;
2734-
read_unlock(&sk->sk_callback_lock);
2735-
return ino;
2736-
}
2737-
EXPORT_SYMBOL(__sock_i_ino);
2738-
2739-
unsigned long sock_i_ino(struct sock *sk)
2740-
{
2741-
unsigned long ino;
2742-
2743-
local_bh_disable();
2744-
ino = __sock_i_ino(sk);
2745-
local_bh_enable();
2746-
return ino;
2747-
}
2748-
EXPORT_SYMBOL(sock_i_ino);
2749-
27502728
/*
27512729
* Allocate a skb from the socket's send buffer.
27522730
*/
@@ -3182,16 +3160,16 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind)
31823160
{
31833161
struct mem_cgroup *memcg = mem_cgroup_sockets_enabled ? sk->sk_memcg : NULL;
31843162
struct proto *prot = sk->sk_prot;
3185-
bool charged = false;
3163+
bool charged = true;
31863164
long allocated;
31873165

31883166
sk_memory_allocated_add(sk, amt);
31893167
allocated = sk_memory_allocated(sk);
31903168

31913169
if (memcg) {
3192-
if (!mem_cgroup_charge_skmem(memcg, amt, gfp_memcg_charge()))
3170+
charged = mem_cgroup_charge_skmem(memcg, amt, gfp_memcg_charge());
3171+
if (!charged)
31933172
goto suppress_allocation;
3194-
charged = true;
31953173
}
31963174

31973175
/* Under limit. */
@@ -3276,7 +3254,7 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind)
32763254

32773255
sk_memory_allocated_sub(sk, amt);
32783256

3279-
if (charged)
3257+
if (memcg && charged)
32803258
mem_cgroup_uncharge_skmem(memcg, amt);
32813259

32823260
return 0;

net/mptcp/protocol.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3505,7 +3505,6 @@ void mptcp_sock_graft(struct sock *sk, struct socket *parent)
35053505
write_lock_bh(&sk->sk_callback_lock);
35063506
rcu_assign_pointer(sk->sk_wq, &parent->wq);
35073507
sk_set_socket(sk, parent);
3508-
sk->sk_uid = SOCK_INODE(parent)->i_uid;
35093508
write_unlock_bh(&sk->sk_callback_lock);
35103509
}
35113510

net/netlink/diag.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
168168
NETLINK_CB(cb->skb).portid,
169169
cb->nlh->nlmsg_seq,
170170
NLM_F_MULTI,
171-
__sock_i_ino(sk)) < 0) {
171+
sock_i_ino(sk)) < 0) {
172172
ret = 1;
173173
break;
174174
}

tools/net/ynl/pyynl/ynl_gen_c.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,6 +2426,17 @@ def print_kernel_family_struct_src(family, cw):
24262426
if not kernel_can_gen_family_struct(family):
24272427
return
24282428

2429+
if 'sock-priv' in family.kernel_family:
2430+
# Generate "trampolines" to make CFI happy
2431+
cw.write_func("static void", f"__{family.c_name}_nl_sock_priv_init",
2432+
[f"{family.c_name}_nl_sock_priv_init(priv);"],
2433+
["void *priv"])
2434+
cw.nl()
2435+
cw.write_func("static void", f"__{family.c_name}_nl_sock_priv_destroy",
2436+
[f"{family.c_name}_nl_sock_priv_destroy(priv);"],
2437+
["void *priv"])
2438+
cw.nl()
2439+
24292440
cw.block_start(f"struct genl_family {family.ident_name}_nl_family __ro_after_init =")
24302441
cw.p('.name\t\t= ' + family.fam_key + ',')
24312442
cw.p('.version\t= ' + family.ver_key + ',')
@@ -2443,9 +2454,8 @@ def print_kernel_family_struct_src(family, cw):
24432454
cw.p(f'.n_mcgrps\t= ARRAY_SIZE({family.c_name}_nl_mcgrps),')
24442455
if 'sock-priv' in family.kernel_family:
24452456
cw.p(f'.sock_priv_size\t= sizeof({family.kernel_family["sock-priv"]}),')
2446-
# Force cast here, actual helpers take pointer to the real type.
2447-
cw.p(f'.sock_priv_init\t= (void *){family.c_name}_nl_sock_priv_init,')
2448-
cw.p(f'.sock_priv_destroy = (void *){family.c_name}_nl_sock_priv_destroy,')
2457+
cw.p(f'.sock_priv_init\t= __{family.c_name}_nl_sock_priv_init,')
2458+
cw.p(f'.sock_priv_destroy = __{family.c_name}_nl_sock_priv_destroy,')
24492459
cw.block_end(';')
24502460

24512461

0 commit comments

Comments
 (0)