Patch "RDS: make message size limit compliant with spec" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
RDS: make message size limit compliant with spec
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rds-make-message-size-limit-compliant-with-spec.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Nov 28 10:49:28 CET 2017
From: Avinash Repaka <[email protected]>
Date: Mon, 29 Feb 2016 15:30:57 -0800
Subject: RDS: make message size limit compliant with spec
From: Avinash Repaka <[email protected]>
[ Upstream commit f9fb69adb6c7acca60977a4db5a5f95b8e66c041 ]
RDS support max message size as 1M but the code doesn't check this in all cases. Patch fixes it for RDMA & non-RDMA and RDS MR size and its enforced irrespective of underlying transport.
--- net/rds/rdma.c | 9 ++++++++- net/rds/rds.h | 3 +++ net/rds/send.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-)
net/rds/rdma.c +8 -1
@@ -40,7 +40,6 @@/* * XXX * - build with sparse -* - should we limit the size of a mr region? let transport return failure? * - should we detect duplicate keys on a socket? hmm. * - an rdma is an mlock, apply rlimit? */
@@ -200,6 +199,14 @@ static int __rds_rdma_map(struct rds_soc goto out; } +/* Restrict the size of mr irrespective of underlying transport +* To account for unaligned mr regions, subtract one from nr_pages +*/ +if ((nr_pages -1 ) > (RDS_MAX_MSG_SIZE >>PAGE_SHIFT )) { + ret = -EMSGSIZE ; + goto out; + } +rdsdebug ("RDS: get_mr addr %llx len %llu nr_pages %u\n" , args->vec.addr, args->vec.bytes, nr_pages);
net/rds/rds.h +3 -0
@@ -50,6 +50,9 @@ void rdsdebug(char *fmt, ...)#define RDS_FRAG_SHIFT 12#define RDS_FRAG_SIZE ((unsigned int)(1 << RDS_FRAG_SHIFT)) +/* Used to limit both RDMA and non-RDMA RDS message to 1MB */ +#define RDS_MAX_MSG_SIZE ((unsigned int)(1 << 20)) +#define RDS_CONG_MAP_BYTES (65536 / 8)#define RDS_CONG_MAP_PAGES (PAGE_ALIGN(RDS_CONG_MAP_BYTES) / PAGE_SIZE)#define RDS_CONG_MAP_PAGE_BITS (PAGE_SIZE * 8)
net/rds/send.c +31 -0
@@ -988,6 +988,26 @@ static int rds_send_mprds_hash(struct rdreturn hash; } +static int rds_rdma_bytes (struct msghdr *msg,size_t *rdma_bytes) +{ +struct rds_rdma_args *args; +struct cmsghdr *cmsg; + +for_each_cmsghdr (cmsg, msg) { +if (!CMSG_OK (msg, cmsg)) +return -EINVAL ; + +if (cmsg->cmsg_level !=SOL_RDS ) +continue ; + +if (cmsg->cmsg_type ==RDS_CMSG_RDMA_ARGS ) { + args =CMSG_DATA (cmsg); + *rdma_bytes += args->remote_vec.bytes; + } + } +return 0 ; +} +int rds_sendmsg (struct socket *sock,struct msghdr *msg,size_t payload_len) {struct sock *sk = sock->sk;
@@ -1002,6 +1022,7 @@ int rds_sendmsg(struct socket *sock, strint nonblock = msg->msg_flags &MSG_DONTWAIT ;long timeo =sock_sndtimeo (sk, nonblock);struct rds_conn_path *cpath; +size_t total_payload_len = payload_len, rdma_payload_len =0 ;/* Mirror Linux UDP mirror of BSD error message compatibility */ /* XXX: Perhaps MSG_MORE someday */
@@ -1034,6 +1055,16 @@ int rds_sendmsg(struct socket *sock, str }release_sock (sk); + ret =rds_rdma_bytes (msg, &rdma_payload_len); +if (ret) + goto out; + + total_payload_len += rdma_payload_len; +if (max_t (size_t, payload_len, rdma_payload_len) >RDS_MAX_MSG_SIZE ) { + ret = -EMSGSIZE ; + goto out; + } +if (payload_len >rds_sk_sndbuf (rs)) { ret = -EMSGSIZE ; goto out;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/rds-make-message-size-limit-compliant-with-spec.patch