Mercurial > illumos > illumos-gate
changeset 12978:19d842faf8e4
6964889 Reduce the number of calls to kmem_alloc and kmem_free from rdsv3_cmsg_rdma_map
author | Eiji Ota <Eiji.Ota@Sun.COM> |
---|---|
date | Thu, 29 Jul 2010 22:45:58 -0700 |
parents | b65a8427f8fe |
children | ab9ae749152f |
files | usr/src/uts/common/io/ib/clients/rdsv3/rdma.c |
diffstat | 1 files changed, 21 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/ib/clients/rdsv3/rdma.c Thu Jul 29 22:10:26 2010 -0700 +++ b/usr/src/uts/common/io/ib/clients/rdsv3/rdma.c Thu Jul 29 22:45:58 2010 -0700 @@ -47,6 +47,7 @@ #include <sys/ib/clients/rdsv3/ib.h> #include <sys/ib/clients/rdsv3/rdma.h> +#include <sys/ib/clients/rdsv3/rdsv3.h> #include <sys/ib/clients/rdsv3/rdsv3_debug.h> #define DMA_TO_DEVICE 0 @@ -582,17 +583,19 @@ struct cmsghdr *cmsg) { struct rdsv3_rdma_op *op; - struct rds_rdma_args *ap; + /* uint64_t alignment on the buffer */ + uint64_t buf[ceil(CMSG_LEN(sizeof (struct rds_rdma_args)), + sizeof (uint64_t))]; - if (cmsg->cmsg_len < CMSG_LEN(sizeof (struct rds_rdma_args)) || + if (cmsg->cmsg_len != CMSG_LEN(sizeof (struct rds_rdma_args)) || rm->m_rdma_op != NULL) return (-EINVAL); - /* uint64_t alignment on struct rds_get_mr_args */ - ap = (struct rds_rdma_args *)kmem_alloc(cmsg->cmsg_len, KM_SLEEP); - bcopy(CMSG_DATA(cmsg), ap, cmsg->cmsg_len); - op = rdsv3_rdma_prepare(rs, ap); - kmem_free(ap, cmsg->cmsg_len); + ASSERT(sizeof (buf) >= cmsg->cmsg_len && ((uintptr_t)buf & 0x7) == 0); + + bcopy(CMSG_DATA(cmsg), (char *)buf, cmsg->cmsg_len); + op = rdsv3_rdma_prepare(rs, (struct rds_rdma_args *)buf); + if (IS_ERR(op)) return (PTR_ERR(op)); rdsv3_stats_inc(s_send_rdma); @@ -612,7 +615,7 @@ uint32_t r_key; int err = 0; - if (cmsg->cmsg_len < CMSG_LEN(sizeof (rds_rdma_cookie_t)) || + if (cmsg->cmsg_len != CMSG_LEN(sizeof (rds_rdma_cookie_t)) || rm->m_rdma_cookie != 0) return (-EINVAL); @@ -652,17 +655,20 @@ rdsv3_cmsg_rdma_map(struct rdsv3_sock *rs, struct rdsv3_message *rm, struct cmsghdr *cmsg) { - struct rds_get_mr_args *mrp; + /* uint64_t alignment on the buffer */ + uint64_t buf[ceil(CMSG_LEN(sizeof (struct rds_get_mr_args)), + sizeof (uint64_t))]; int status; - if (cmsg->cmsg_len < CMSG_LEN(sizeof (struct rds_get_mr_args)) || + if (cmsg->cmsg_len != CMSG_LEN(sizeof (struct rds_get_mr_args)) || rm->m_rdma_cookie != 0) return (-EINVAL); - /* uint64_t alignment on struct rds_get_mr_args */ - mrp = (struct rds_get_mr_args *)kmem_alloc(cmsg->cmsg_len, KM_SLEEP); - bcopy(CMSG_DATA(cmsg), mrp, cmsg->cmsg_len); - status = __rdsv3_rdma_map(rs, mrp, &rm->m_rdma_cookie, &rm->m_rdma_mr); - kmem_free(mrp, cmsg->cmsg_len); + ASSERT(sizeof (buf) >= cmsg->cmsg_len && ((uintptr_t)buf & 0x7) == 0); + + bcopy(CMSG_DATA(cmsg), (char *)buf, cmsg->cmsg_len); + status = __rdsv3_rdma_map(rs, (struct rds_get_mr_args *)buf, + &rm->m_rdma_cookie, &rm->m_rdma_mr); + return (status); }