Merge 52c46caf28 ("tcp: Add memory barrier to tcp_push()") into android-mainline

Steps on the way to 4.19.307

Change-Id: I67749a2eebff3778e717a9acce93c1d7ed1f6328
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2024-03-07 15:05:00 +00:00
committed by Treehugger Robot
11 changed files with 50 additions and 37 deletions

View File

@@ -21,8 +21,8 @@ obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o strlen_32.o
# 64-bit linker creates .sfpr on demand for final link (vmlinux), # 64-bit linker creates .sfpr on demand for final link (vmlinux),
# so it is only needed for modules, and only for older linkers which # so it is only needed for modules, and only for older linkers which
# do not support --save-restore-funcs # do not support --save-restore-funcs
ifeq ($(call ld-ifversion, -lt, 225000000, y),y) ifeq ($(call ld-ifversion, -lt, 225000000, y)$(CONFIG_PPC64),yy)
always-$(CONFIG_PPC64) += crtsavres.o always += crtsavres.o
endif endif
obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \ obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \

View File

@@ -271,15 +271,6 @@ static void init_amd_k6(struct cpuinfo_x86 *c)
return; return;
} }
#endif #endif
/*
* Work around Erratum 1386. The XSAVES instruction malfunctions in
* certain circumstances on Zen1/2 uarch, and not all parts have had
* updated microcode at the time of writing (March 2023).
*
* Affected parts all have no supervisor XSAVE states, meaning that
* the XSAVEC instruction (which works fine) is equivalent.
*/
clear_cpu_cap(c, X86_FEATURE_XSAVES);
} }
static void init_amd_k7(struct cpuinfo_x86 *c) static void init_amd_k7(struct cpuinfo_x86 *c)
@@ -979,6 +970,17 @@ static void init_amd_zn(struct cpuinfo_x86 *c)
if (c->x86 == 0x19 && !cpu_has(c, X86_FEATURE_BTC_NO)) if (c->x86 == 0x19 && !cpu_has(c, X86_FEATURE_BTC_NO))
set_cpu_cap(c, X86_FEATURE_BTC_NO); set_cpu_cap(c, X86_FEATURE_BTC_NO);
} }
/*
* Work around Erratum 1386. The XSAVES instruction malfunctions in
* certain circumstances on Zen1/2 uarch, and not all parts have had
* updated microcode at the time of writing (March 2023).
*
* Affected parts all have no supervisor XSAVE states, meaning that
* the XSAVEC instruction (which works fine) is equivalent.
*/
if (c->x86 == 0x17)
clear_cpu_cap(c, X86_FEATURE_XSAVES);
} }
static bool cpu_has_zenbleed_microcode(void) static bool cpu_has_zenbleed_microcode(void)

View File

@@ -3789,13 +3789,15 @@ define_dev_printk_level(_dev_info, KERN_INFO);
* This helper implements common pattern present in probe functions for error * This helper implements common pattern present in probe functions for error
* checking: print debug or error message depending if the error value is * checking: print debug or error message depending if the error value is
* -EPROBE_DEFER and propagate error upwards. * -EPROBE_DEFER and propagate error upwards.
* It replaces code sequence: * It replaces code sequence::
* if (err != -EPROBE_DEFER) * if (err != -EPROBE_DEFER)
* dev_err(dev, ...); * dev_err(dev, ...);
* else * else
* dev_dbg(dev, ...); * dev_dbg(dev, ...);
* return err; * return err;
* with *
* with::
*
* return dev_err_probe(dev, err, ...); * return dev_err_probe(dev, err, ...);
* *
* Returns @err. * Returns @err.
@@ -3811,9 +3813,9 @@ int dev_err_probe(const struct device *dev, int err, const char *fmt, ...)
vaf.va = &args; vaf.va = &args;
if (err != -EPROBE_DEFER) if (err != -EPROBE_DEFER)
dev_err(dev, "error %d: %pV", err, &vaf); dev_err(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
else else
dev_dbg(dev, "error %d: %pV", err, &vaf); dev_dbg(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
va_end(args); va_end(args);

View File

@@ -262,8 +262,7 @@ static inline void llc_pdu_header_init(struct sk_buff *skb, u8 type,
*/ */
static inline void llc_pdu_decode_sa(struct sk_buff *skb, u8 *sa) static inline void llc_pdu_decode_sa(struct sk_buff *skb, u8 *sa)
{ {
if (skb->protocol == htons(ETH_P_802_2)) memcpy(sa, eth_hdr(skb)->h_source, ETH_ALEN);
memcpy(sa, eth_hdr(skb)->h_source, ETH_ALEN);
} }
/** /**
@@ -275,8 +274,7 @@ static inline void llc_pdu_decode_sa(struct sk_buff *skb, u8 *sa)
*/ */
static inline void llc_pdu_decode_da(struct sk_buff *skb, u8 *da) static inline void llc_pdu_decode_da(struct sk_buff *skb, u8 *da)
{ {
if (skb->protocol == htons(ETH_P_802_2)) memcpy(da, eth_hdr(skb)->h_dest, ETH_ALEN);
memcpy(da, eth_hdr(skb)->h_dest, ETH_ALEN);
} }
/** /**

View File

@@ -574,7 +574,12 @@ __tracing_map_insert(struct tracing_map *map, void *key, bool lookup_only)
} }
memcpy(elt->key, key, map->key_size); memcpy(elt->key, key, map->key_size);
entry->val = elt; /*
* Ensure the initialization is visible and
* publish the elt.
*/
smp_wmb();
WRITE_ONCE(entry->val, elt);
atomic64_inc(&map->hits); atomic64_inc(&map->hits);
return entry->val; return entry->val;

View File

@@ -120,12 +120,16 @@ static int vlan_changelink(struct net_device *dev, struct nlattr *tb[],
} }
if (data[IFLA_VLAN_INGRESS_QOS]) { if (data[IFLA_VLAN_INGRESS_QOS]) {
nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) { nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) {
if (nla_type(attr) != IFLA_VLAN_QOS_MAPPING)
continue;
m = nla_data(attr); m = nla_data(attr);
vlan_dev_set_ingress_priority(dev, m->to, m->from); vlan_dev_set_ingress_priority(dev, m->to, m->from);
} }
} }
if (data[IFLA_VLAN_EGRESS_QOS]) { if (data[IFLA_VLAN_EGRESS_QOS]) {
nla_for_each_nested(attr, data[IFLA_VLAN_EGRESS_QOS], rem) { nla_for_each_nested(attr, data[IFLA_VLAN_EGRESS_QOS], rem) {
if (nla_type(attr) != IFLA_VLAN_QOS_MAPPING)
continue;
m = nla_data(attr); m = nla_data(attr);
err = vlan_dev_set_egress_priority(dev, m->from, m->to); err = vlan_dev_set_egress_priority(dev, m->from, m->to);
if (err) if (err)

View File

@@ -731,6 +731,7 @@ static void tcp_push(struct sock *sk, int flags, int mss_now,
if (!test_bit(TSQ_THROTTLED, &sk->sk_tsq_flags)) { if (!test_bit(TSQ_THROTTLED, &sk->sk_tsq_flags)) {
NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPAUTOCORKING); NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPAUTOCORKING);
set_bit(TSQ_THROTTLED, &sk->sk_tsq_flags); set_bit(TSQ_THROTTLED, &sk->sk_tsq_flags);
smp_mb__after_atomic();
} }
/* It is possible TX completion already happened /* It is possible TX completion already happened
* before we set TSQ_THROTTLED. * before we set TSQ_THROTTLED.

View File

@@ -926,14 +926,15 @@ static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
*/ */
static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
{ {
DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name);
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
struct llc_sock *llc = llc_sk(sk); struct llc_sock *llc = llc_sk(sk);
DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name);
int flags = msg->msg_flags; int flags = msg->msg_flags;
int noblock = flags & MSG_DONTWAIT; int noblock = flags & MSG_DONTWAIT;
int rc = -EINVAL, copied = 0, hdrlen, hh_len;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
struct net_device *dev;
size_t size = 0; size_t size = 0;
int rc = -EINVAL, copied = 0, hdrlen;
dprintk("%s: sending from %02X to %02X\n", __func__, dprintk("%s: sending from %02X to %02X\n", __func__,
llc->laddr.lsap, llc->daddr.lsap); llc->laddr.lsap, llc->daddr.lsap);
@@ -953,22 +954,29 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
if (rc) if (rc)
goto out; goto out;
} }
hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); dev = llc->dev;
hh_len = LL_RESERVED_SPACE(dev);
hdrlen = llc_ui_header_len(sk, addr);
size = hdrlen + len; size = hdrlen + len;
if (size > llc->dev->mtu) size = min_t(size_t, size, READ_ONCE(dev->mtu));
size = llc->dev->mtu;
copied = size - hdrlen; copied = size - hdrlen;
rc = -EINVAL; rc = -EINVAL;
if (copied < 0) if (copied < 0)
goto out; goto out;
release_sock(sk); release_sock(sk);
skb = sock_alloc_send_skb(sk, size, noblock, &rc); skb = sock_alloc_send_skb(sk, hh_len + size, noblock, &rc);
lock_sock(sk); lock_sock(sk);
if (!skb) if (!skb)
goto out; goto out;
skb->dev = llc->dev; if (sock_flag(sk, SOCK_ZAPPED) ||
llc->dev != dev ||
hdrlen != llc_ui_header_len(sk, addr) ||
hh_len != LL_RESERVED_SPACE(dev) ||
size > READ_ONCE(dev->mtu))
goto out;
skb->dev = dev;
skb->protocol = llc_proto_type(addr->sllc_arphrd); skb->protocol = llc_proto_type(addr->sllc_arphrd);
skb_reserve(skb, hdrlen); skb_reserve(skb, hh_len + hdrlen);
rc = memcpy_from_msg(skb_put(skb, copied), msg, copied); rc = memcpy_from_msg(skb_put(skb, copied), msg, copied);
if (rc) if (rc)
goto out; goto out;

View File

@@ -135,22 +135,15 @@ static struct packet_type llc_packet_type __read_mostly = {
.func = llc_rcv, .func = llc_rcv,
}; };
static struct packet_type llc_tr_packet_type __read_mostly = {
.type = cpu_to_be16(ETH_P_TR_802_2),
.func = llc_rcv,
};
static int __init llc_init(void) static int __init llc_init(void)
{ {
dev_add_pack(&llc_packet_type); dev_add_pack(&llc_packet_type);
dev_add_pack(&llc_tr_packet_type);
return 0; return 0;
} }
static void __exit llc_exit(void) static void __exit llc_exit(void)
{ {
dev_remove_pack(&llc_packet_type); dev_remove_pack(&llc_packet_type);
dev_remove_pack(&llc_tr_packet_type);
} }
module_init(llc_init); module_init(llc_init);

View File

@@ -385,7 +385,7 @@ static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
rs->rs_rx_traces = trace.rx_traces; rs->rs_rx_traces = trace.rx_traces;
for (i = 0; i < rs->rs_rx_traces; i++) { for (i = 0; i < rs->rs_rx_traces; i++) {
if (trace.rx_trace_pos[i] > RDS_MSG_RX_DGRAM_TRACE_MAX) { if (trace.rx_trace_pos[i] >= RDS_MSG_RX_DGRAM_TRACE_MAX) {
rs->rs_rx_traces = 0; rs->rs_rx_traces = 0;
return -EFAULT; return -EFAULT;
} }

View File

@@ -167,7 +167,7 @@ static int __smc_diag_dump(struct sock *sk, struct sk_buff *skb,
} }
if (smc->conn.lgr && smc->conn.lgr->is_smcd && if (smc->conn.lgr && smc->conn.lgr->is_smcd &&
(req->diag_ext & (1 << (SMC_DIAG_DMBINFO - 1))) && (req->diag_ext & (1 << (SMC_DIAG_DMBINFO - 1))) &&
!list_empty(&smc->conn.lgr->list)) { !list_empty(&smc->conn.lgr->list) && smc->conn.rmb_desc) {
struct smc_connection *conn = &smc->conn; struct smc_connection *conn = &smc->conn;
struct smcd_diag_dmbinfo dinfo; struct smcd_diag_dmbinfo dinfo;