On Wed, Jan 17, 2018 at 7:20 AM, Sowmini Varadhan
<sowmini.varad...@oracle.com> wrote:
> If the MSG_ZEROCOPY flag is specified with rds_sendmsg(), and,
> if the SO_ZEROCOPY socket option has been set on the PF_RDS socket,
> application pages sent down with rds_sendmsg() are pinned.
>
> The pinning uses the accounting infrastructure added by
> Commit a91dbff551a6 ("sock: ulimit on MSG_ZEROCOPY pages")
>
> The payload bytes in the message may not be modified for the
> duration that the message has been pinned. A multi-threaded
> application using this infrastructure may thus need to be notified
> about send-completion so that it can free/reuse the buffers
> passed to rds_sendmsg(). Notification of send-completion will
> identify each message-buffer by a cookie that the application
> must specify as ancillary data to rds_sendmsg().
> The ancillary data in this case has cmsg_level == SOL_RDS
> and cmsg_type == RDS_CMSG_ZCOPY_COOKIE.
>
> Signed-off-by: Sowmini Varadhan <sowmini.varad...@oracle.com>
> ---
>  include/uapi/linux/rds.h |    1 +
>  net/rds/message.c        |   44 +++++++++++++++++++++++++++++++++++++++++++-
>  net/rds/rds.h            |    3 ++-
>  net/rds/send.c           |   27 ++++++++++++++++++++++++---
>  4 files changed, 70 insertions(+), 5 deletions(-)

> +static int rds_cmsg_zcopy(struct rds_sock *rs, struct rds_message *rm,
> +                         struct cmsghdr *cmsg)
> +{
> +       unsigned int *cookie;

Use fixed-width types across the ABI.

> +
> +       if (cmsg->cmsg_len < CMSG_LEN(sizeof(*cookie)))
> +               return -EINVAL;
> +       cookie = CMSG_DATA(cmsg);
> +       rm->data.op_mmp_znotifier->z_cookie = *cookie;
> +       return 0;
> +}
> +

> @@ -1107,12 +1126,14 @@ int rds_sendmsg(struct socket *sock, struct msghdr 
> *msg, size_t payload_len)
>
>         /* Attach data to the rm */
>         if (payload_len) {
> -               rm->data.op_sg = rds_message_alloc_sgs(rm, ceil(payload_len, 
> PAGE_SIZE));
> +               int num_sgs = ceil(payload_len, PAGE_SIZE);
> +
> +               rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs);

Unrelated change. Leftover from revising the patch?

Also, with user pages, data is no longer guaranteed to be page
aligned, so this may
need more sgs.

Reply via email to