Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
2 changes: 1 addition & 1 deletion Makefile.rhelver
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ RHEL_MINOR = 6
#
# Use this spot to avoid future merge conflicts.
# Do not trim this comment.
RHEL_RELEASE = 570.52.1
RHEL_RELEASE = 570.55.1

#
# ZSTREAM
Expand Down
118 changes: 118 additions & 0 deletions ciq/ciq_backports/kernel-5.14.0-570.55.1.el9_6/2ee73c54.failed
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
ibmvnic: Add stat for tx direct vs tx batched

jira LE-4539
Rebuild_History Non-Buildable kernel-5.14.0-570.55.1.el9_6
commit-author Nick Child <nnac123@linux.ibm.com>
commit 2ee73c54a615b74d2e7ee6f20844fd3ba63fc485
Empty-Commit: Cherry-Pick Conflicts during history rebuild.
Will be included in final tarball splat. Ref for failed cherry-pick at:
ciq/ciq_backports/kernel-5.14.0-570.55.1.el9_6/2ee73c54.failed

Allow tracking of packets sent with send_subcrq direct vs
indirect. `ethtool -S <dev>` will now provide a counter
of the number of uses of each xmit method. This metric will
be useful in performance debugging.

Signed-off-by: Nick Child <nnac123@linux.ibm.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20241001163531.1803152-1-nnac123@linux.ibm.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
(cherry picked from commit 2ee73c54a615b74d2e7ee6f20844fd3ba63fc485)
Signed-off-by: Jonathan Maple <jmaple@ciq.com>

# Conflicts:
# drivers/net/ethernet/ibm/ibmvnic.c
diff --cc drivers/net/ethernet/ibm/ibmvnic.c
index 1479d16cd0fb,53b309ddc63b..000000000000
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@@ -3649,43 -3803,35 +3653,73 @@@ static void ibmvnic_get_strings(struct
struct ibmvnic_adapter *adapter = netdev_priv(dev);
int i;

- if (stringset != ETH_SS_STATS)
+ switch (stringset) {
+ case ETH_SS_STATS:
+ for (i = 0; i < ARRAY_SIZE(ibmvnic_stats);
+ i++, data += ETH_GSTRING_LEN)
+ memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
+
+ for (i = 0; i < adapter->req_tx_queues; i++) {
+ snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN,
+ "tx%d_dropped_packets", i);
+ data += ETH_GSTRING_LEN;
+ }
+
+ for (i = 0; i < adapter->req_rx_queues; i++) {
+ snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i);
+ data += ETH_GSTRING_LEN;
+ }
+ break;
+
+ case ETH_SS_PRIV_FLAGS:
+ for (i = 0; i < ARRAY_SIZE(ibmvnic_priv_flags); i++)
+ strcpy(data + i * ETH_GSTRING_LEN,
+ ibmvnic_priv_flags[i]);
+ break;
+ default:
return;
++<<<<<<< HEAD
++=======
+
+ for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++, data += ETH_GSTRING_LEN)
+ memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
+
+ for (i = 0; i < adapter->req_tx_queues; i++) {
+ snprintf(data, ETH_GSTRING_LEN, "tx%d_batched_packets", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "tx%d_direct_packets", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "tx%d_dropped_packets", i);
+ data += ETH_GSTRING_LEN;
+ }
+
+ for (i = 0; i < adapter->req_rx_queues; i++) {
+ snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i);
+ data += ETH_GSTRING_LEN;
+
+ snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i);
+ data += ETH_GSTRING_LEN;
++>>>>>>> 2ee73c54a615 (ibmvnic: Add stat for tx direct vs tx batched)
}
}

* Unmerged path drivers/net/ethernet/ibm/ibmvnic.c
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 3f7902b3dbcb..0bb5271f6622 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -178,7 +178,8 @@ struct ibmvnic_statistics {

#define NUM_TX_STATS 3
struct ibmvnic_tx_queue_stats {
- u64 packets;
+ u64 batched_packets;
+ u64 direct_packets;
u64 bytes;
u64 dropped_packets;
};
169 changes: 169 additions & 0 deletions ciq/ciq_backports/kernel-5.14.0-570.55.1.el9_6/930b64ca.failed
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
nfsd: don't ignore the return code of svc_proc_register()

jira LE-4539
cve CVE-2025-22026
Rebuild_History Non-Buildable kernel-5.14.0-570.55.1.el9_6
commit-author Jeff Layton <jlayton@kernel.org>
commit 930b64ca0c511521f0abdd1d57ce52b2a6e3476b
Empty-Commit: Cherry-Pick Conflicts during history rebuild.
Will be included in final tarball splat. Ref for failed cherry-pick at:
ciq/ciq_backports/kernel-5.14.0-570.55.1.el9_6/930b64ca.failed

Currently, nfsd_proc_stat_init() ignores the return value of
svc_proc_register(). If the procfile creation fails, then the kernel
will WARN when it tries to remove the entry later.

Fix nfsd_proc_stat_init() to return the same type of pointer as
svc_proc_register(), and fix up nfsd_net_init() to check that and fail
the nfsd_net construction if it occurs.

svc_proc_register() can fail if the dentry can't be allocated, or if an
identical dentry already exists. The second case is pretty unlikely in
the nfsd_net construction codepath, so if this happens, return -ENOMEM.

Reported-by: syzbot+e34ad04f27991521104c@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/linux-nfs/67a47501.050a0220.19061f.05f9.GAE@google.com/
Cc: stable@vger.kernel.org # v6.9
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
(cherry picked from commit 930b64ca0c511521f0abdd1d57ce52b2a6e3476b)
Signed-off-by: Jonathan Maple <jmaple@ciq.com>

# Conflicts:
# fs/nfsd/nfsctl.c
# fs/nfsd/stats.c
# fs/nfsd/stats.h
diff --cc fs/nfsd/nfsctl.c
index 93a72068776a,ac265d6fde35..000000000000
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@@ -2233,22 -2198,35 +2233,45 @@@ static __net_init int nfsd_net_init(str
retval = nfsd_idmap_init(net);
if (retval)
goto out_idmap_error;
- retval = percpu_counter_init_many(nn->counter, 0, GFP_KERNEL,
- NFSD_STATS_COUNTERS_NUM);
+ retval = nfsd_stat_counters_init(nn);
if (retval)
goto out_repcache_error;
+
memset(&nn->nfsd_svcstats, 0, sizeof(nn->nfsd_svcstats));
++<<<<<<< HEAD
+ nn->nfsd_svcstats.program = &nfsd_program;
+ nn->nfsd_versions = NULL;
+ nn->nfsd4_minorversions = NULL;
++=======
+ nn->nfsd_svcstats.program = &nfsd_programs[0];
+ if (!nfsd_proc_stat_init(net)) {
+ retval = -ENOMEM;
+ goto out_proc_error;
+ }
+
+ for (i = 0; i < sizeof(nn->nfsd_versions); i++)
+ nn->nfsd_versions[i] = nfsd_support_version(i);
+ for (i = 0; i < sizeof(nn->nfsd4_minorversions); i++)
+ nn->nfsd4_minorversions[i] = nfsd_support_version(4);
++>>>>>>> 930b64ca0c51 (nfsd: don't ignore the return code of svc_proc_register())
nn->nfsd_info.mutex = &nfsd_mutex;
nn->nfsd_serv = NULL;
nfsd4_init_leases_net(nn);
get_random_bytes(&nn->siphash_key, sizeof(nn->siphash_key));
seqlock_init(&nn->writeverf_lock);
++<<<<<<< HEAD
+ nfsd_proc_stat_init(net);
+
++=======
+ #if IS_ENABLED(CONFIG_NFS_LOCALIO)
+ spin_lock_init(&nn->local_clients_lock);
+ INIT_LIST_HEAD(&nn->local_clients);
+ #endif
++>>>>>>> 930b64ca0c51 (nfsd: don't ignore the return code of svc_proc_register())
return 0;

+ out_proc_error:
+ percpu_counter_destroy_many(nn->counter, NFSD_STATS_COUNTERS_NUM);
out_repcache_error:
nfsd_idmap_shutdown(net);
out_idmap_error:
diff --cc fs/nfsd/stats.c
index be52fb1e928e,f7eaf95e20fc..000000000000
--- a/fs/nfsd/stats.c
+++ b/fs/nfsd/stats.c
@@@ -73,49 -73,7 +73,53 @@@ static int nfsd_show(struct seq_file *s

DEFINE_PROC_SHOW_ATTRIBUTE(nfsd);

++<<<<<<< HEAD
+int nfsd_percpu_counters_init(struct percpu_counter *counters, int num)
+{
+ int i, err = 0;
+
+ for (i = 0; !err && i < num; i++)
+ err = percpu_counter_init(&counters[i], 0, GFP_KERNEL);
+
+ if (!err)
+ return 0;
+
+ for (; i > 0; i--)
+ percpu_counter_destroy(&counters[i-1]);
+
+ return err;
+}
+
+void nfsd_percpu_counters_reset(struct percpu_counter counters[], int num)
+{
+ int i;
+
+ for (i = 0; i < num; i++)
+ percpu_counter_set(&counters[i], 0);
+}
+
+void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num)
+{
+ int i;
+
+ for (i = 0; i < num; i++)
+ percpu_counter_destroy(&counters[i]);
+}
+
+int nfsd_stat_counters_init(struct nfsd_net *nn)
+{
+ return nfsd_percpu_counters_init(nn->counter, NFSD_STATS_COUNTERS_NUM);
+}
+
+void nfsd_stat_counters_destroy(struct nfsd_net *nn)
+{
+ nfsd_percpu_counters_destroy(nn->counter, NFSD_STATS_COUNTERS_NUM);
+}
+
+void nfsd_proc_stat_init(struct net *net)
++=======
+ struct proc_dir_entry *nfsd_proc_stat_init(struct net *net)
++>>>>>>> 930b64ca0c51 (nfsd: don't ignore the return code of svc_proc_register())
{
struct nfsd_net *nn = net_generic(net, nfsd_net_id);

diff --cc fs/nfsd/stats.h
index d2753e975dfd,e4efb0e4e56d..000000000000
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@@ -10,12 -10,7 +10,16 @@@
#include <uapi/linux/nfsd/stats.h>
#include <linux/percpu_counter.h>

++<<<<<<< HEAD
+int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
+void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);
+void nfsd_percpu_counters_destroy(struct percpu_counter *counters, int num);
+int nfsd_stat_counters_init(struct nfsd_net *nn);
+void nfsd_stat_counters_destroy(struct nfsd_net *nn);
+void nfsd_proc_stat_init(struct net *net);
++=======
+ struct proc_dir_entry *nfsd_proc_stat_init(struct net *net);
++>>>>>>> 930b64ca0c51 (nfsd: don't ignore the return code of svc_proc_register())
void nfsd_proc_stat_shutdown(struct net *net);

static inline void nfsd_stats_rc_hits_inc(struct nfsd_net *nn)
* Unmerged path fs/nfsd/nfsctl.c
* Unmerged path fs/nfsd/stats.c
* Unmerged path fs/nfsd/stats.h
70 changes: 70 additions & 0 deletions ciq/ciq_backports/kernel-5.14.0-570.55.1.el9_6/9559d2ff.failed
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
SUNRPC: call xs_sock_process_cmsg for all cmsg

jira LE-4539
Rebuild_History Non-Buildable kernel-5.14.0-570.55.1.el9_6
commit-author Justin Worrell <jworrell@gmail.com>
commit 9559d2fffd4f9b892165eed48198a0e5cb8504e6
Empty-Commit: Cherry-Pick Conflicts during history rebuild.
Will be included in final tarball splat. Ref for failed cherry-pick at:
ciq/ciq_backports/kernel-5.14.0-570.55.1.el9_6/9559d2ff.failed

xs_sock_recv_cmsg was failing to call xs_sock_process_cmsg for any cmsg
type other than TLS_RECORD_TYPE_ALERT (TLS_RECORD_TYPE_DATA, and other
values not handled.) Based on my reading of the previous commit
(cc5d5908: sunrpc: fix client side handling of tls alerts), it looks
like only iov_iter_revert should be conditional on TLS_RECORD_TYPE_ALERT
(but that other cmsg types should still call xs_sock_process_cmsg). On
my machine, I was unable to connect (over mtls) to an NFS share hosted
on FreeBSD. With this patch applied, I am able to mount the share again.

Fixes: cc5d59081fa2 ("sunrpc: fix client side handling of tls alerts")
Signed-off-by: Justin Worrell <jworrell@gmail.com>
Reviewed-and-tested-by: Scott Mayhew <smayhew@redhat.com>
Link: https://lore.kernel.org/r/20250904211038.12874-3-jworrell@gmail.com
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
(cherry picked from commit 9559d2fffd4f9b892165eed48198a0e5cb8504e6)
Signed-off-by: Jonathan Maple <jmaple@ciq.com>

# Conflicts:
# net/sunrpc/xprtsock.c
diff --cc net/sunrpc/xprtsock.c
index d014a7012536,3aa987e7f072..000000000000
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@@ -393,13 -392,27 +393,25 @@@ xs_sock_recv_cmsg(struct socket *sock,
struct cmsghdr cmsg;
u8 buf[CMSG_SPACE(sizeof(u8))];
} u;
- u8 alert[2];
- struct kvec alert_kvec = {
- .iov_base = alert,
- .iov_len = sizeof(alert),
- };
- struct msghdr msg = {
- .msg_flags = *msg_flags,
- .msg_control = &u,
- .msg_controllen = sizeof(u),
- };
int ret;

++<<<<<<< HEAD
+ msg->msg_control = &u;
+ msg->msg_controllen = sizeof(u);
+ ret = sock_recvmsg(sock, msg, flags);
+ if (msg->msg_controllen != sizeof(u))
+ ret = xs_sock_process_cmsg(sock, msg, &u.cmsg, ret);
++=======
+ iov_iter_kvec(&msg.msg_iter, ITER_DEST, &alert_kvec, 1,
+ alert_kvec.iov_len);
+ ret = sock_recvmsg(sock, &msg, flags);
+ if (ret > 0) {
+ if (tls_get_record_type(sock->sk, &u.cmsg) == TLS_RECORD_TYPE_ALERT)
+ iov_iter_revert(&msg.msg_iter, ret);
+ ret = xs_sock_process_cmsg(sock, &msg, msg_flags, &u.cmsg,
+ -EAGAIN);
+ }
++>>>>>>> 9559d2fffd4f (SUNRPC: call xs_sock_process_cmsg for all cmsg)
return ret;
}

* Unmerged path net/sunrpc/xprtsock.c
Loading