lkml.org 
[lkml]   [2018]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.16 037/113] cifs: smbd: Dont use RDMA read/write when signing is used
    Date
    4.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Long Li <longli@microsoft.com>

    commit bb4c0419476bd3982ba802f0f49de83cd79532d8 upstream.

    SMB server will not sign data transferred through RDMA read/write. When
    signing is used, it's a good idea to have all the data signed.

    In this case, use RDMA send/recv for all data transfers. This will degrade
    performance as this is not generally configured in RDMA environemnt. So
    warn the user on signing and RDMA send/recv.

    Signed-off-by: Long Li <longli@microsoft.com>
    Acked-by: Ronnie Sahlberg <lsahlber@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Steve French <smfrench@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/cifs/cifssmb.c | 3 +++
    fs/cifs/smb2ops.c | 18 ++++++++++++++----
    fs/cifs/smb2pdu.c | 4 ++--
    3 files changed, 19 insertions(+), 6 deletions(-)

    --- a/fs/cifs/cifssmb.c
    +++ b/fs/cifs/cifssmb.c
    @@ -453,6 +453,9 @@ cifs_enable_signing(struct TCP_Server_In
    server->sign = true;
    }

    + if (cifs_rdma_enabled(server) && server->sign)
    + cifs_dbg(VFS, "Signing is enabled, and RDMA read/write will be disabled");
    +
    return 0;
    }

    --- a/fs/cifs/smb2ops.c
    +++ b/fs/cifs/smb2ops.c
    @@ -252,9 +252,14 @@ smb2_negotiate_wsize(struct cifs_tcon *t
    wsize = volume_info->wsize ? volume_info->wsize : CIFS_DEFAULT_IOSIZE;
    wsize = min_t(unsigned int, wsize, server->max_write);
    #ifdef CONFIG_CIFS_SMB_DIRECT
    - if (server->rdma)
    - wsize = min_t(unsigned int,
    + if (server->rdma) {
    + if (server->sign)
    + wsize = min_t(unsigned int,
    + wsize, server->smbd_conn->max_fragmented_send_size);
    + else
    + wsize = min_t(unsigned int,
    wsize, server->smbd_conn->max_readwrite_size);
    + }
    #endif
    if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
    wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE);
    @@ -272,9 +277,14 @@ smb2_negotiate_rsize(struct cifs_tcon *t
    rsize = volume_info->rsize ? volume_info->rsize : CIFS_DEFAULT_IOSIZE;
    rsize = min_t(unsigned int, rsize, server->max_read);
    #ifdef CONFIG_CIFS_SMB_DIRECT
    - if (server->rdma)
    - rsize = min_t(unsigned int,
    + if (server->rdma) {
    + if (server->sign)
    + rsize = min_t(unsigned int,
    + rsize, server->smbd_conn->max_fragmented_recv_size);
    + else
    + rsize = min_t(unsigned int,
    rsize, server->smbd_conn->max_readwrite_size);
    + }
    #endif

    if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
    --- a/fs/cifs/smb2pdu.c
    +++ b/fs/cifs/smb2pdu.c
    @@ -2479,7 +2479,7 @@ smb2_new_read_req(void **buf, unsigned i
    * If we want to do a RDMA write, fill in and append
    * smbd_buffer_descriptor_v1 to the end of read request
    */
    - if (server->rdma && rdata &&
    + if (server->rdma && rdata && !server->sign &&
    rdata->bytes >= server->smbd_conn->rdma_readwrite_threshold) {

    struct smbd_buffer_descriptor_v1 *v1;
    @@ -2857,7 +2857,7 @@ smb2_async_writev(struct cifs_writedata
    * If we want to do a server RDMA read, fill in and append
    * smbd_buffer_descriptor_v1 to the end of write request
    */
    - if (server->rdma && wdata->bytes >=
    + if (server->rdma && !server->sign && wdata->bytes >=
    server->smbd_conn->rdma_readwrite_threshold) {

    struct smbd_buffer_descriptor_v1 *v1;

    \
     
     \ /
      Last update: 2018-04-30 21:42    [W:4.129 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site