• Chuck Lever's avatar
    sunrpc: Allocate up to RPCSVC_MAXPAGES per svc_rqst · 8c6ae498
    Chuck Lever authored
    svcrdma needs 259 pages allocated to receive 1MB NFSv4.0 WRITE requests:
    
     - 1 page for the transport header and head iovec
     - 256 pages for the data payload
     - 1 page for the trailing GETATTR request (since NFSD XDR decoding
       does not look for a tail iovec, the GETATTR is stuck at the end
       of the rqstp->rq_arg.pages list)
     - 1 page for building the reply xdr_buf
    
    But RPCSVC_MAXPAGES is already 259 (on x86_64). The problem is that
    svc_alloc_arg never allocates that many pages. To address this:
    
    1. The final element of rq_pages always points to NULL. To
       accommodate up to 259 pages in rq_pages, add an extra element
       to rq_pages for the array termination sentinel.
    
    2. Adjust the calculation of "pages" to match how RPCSVC_MAXPAGES
       is calculated, so it can go up to 259. Bruce noted that the
       calculation assumes sv_max_mesg is a multiple of PAGE_SIZE,
       which might not always be true. I didn't change this assumption.
    
    3. Change the loop boundaries to allow 259 pages to be allocated.
    
    Additional clean-up: WARN_ON_ONCE adds an extra conditional branch,
    which is basically never taken. And there's no need to dump the
    stack here because svc_alloc_arg has only one caller.
    
    Keeping that NULL "array termination sentinel"; there doesn't appear to
    be any code that depends on it, only code in nfsd_splice_actor() which
    needs the 259th element to be initialized to *something*.  So it's
    possible we could just keep the array at 259 elements and drop that
    final NULL, but we're being conservative for now.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    8c6ae498
svc_xprt.c 38.7 KB