mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
The one new feature is support for a new NFSv4.2 mode_umask attribute
that makes ACL inheritance a little more useful in environments that default to restrictive umasks. Requires client-side support, also on its way for 4.10. Other than that, miscellaneous smaller fixes and cleanup, especially to the server rdma code. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJYVAEqAAoJECebzXlCjuG+VM0QAKaR+ibSM31Ahpnrgit5/wrb n630KDFztO7iqEeuHfPQ4/n05T2QR0JWsLpjLMFvx88Gy4gyXYk9cuDPIrNKX1IS 3/nnhBo0+EVnjODjufommCrtbPZlqOSsS3N03vWkB7rTi8QYsWBOThh+XLRJYOXo LZzJE1WmXNeCXV1kXPBsauryywql1fmwTXBzmIf1HbzoGAVROMEA2qqh4Z3nb7BP sJuGchWx0STBOuAa278ighXQPUW2lUft9uzw2bssOtMwfNyOs/Pd6nx4F1Lg6WwD 1UQXoiR8K3PqelZfoeFJ05v0css/sbNKep+huWRdOXZj3Kjpa20lKBX8xHfat7sN 1OQ4FHx8ToigX3c+wwtlCqRMCcIxqUYkRjqzPHyeBiSSSp0rLrId44rI5x/K0yay 3bkGw7hFDSzc0Nq2uZgmtlbyTC71hLNhkWe7ThofcVG/pS0JtAqBiKIVwXJPh/e0 PLmVHYGU6Xowjag5edJlXY1tlIlxtWfqsWUarCXS5bfKUa3UjMVSjyuljsDqqJsn 96fEWu7DiUo4HeGYmf8MJoeZYV2y0DKSQGeguVkUKWp2DoTzinQHTfdKvrZVwNuu hVE9/QeWzUvPY13HOUaKD2skozhbUChqv0NHESKUv8gxE3svTEpYZkXrE74WNqMk l/WXAhw+RdKZof4+qdjU =JANY -----END PGP SIGNATURE----- Merge tag 'nfsd-4.10' of git://linux-nfs.org/~bfields/linux Pull nfsd updates from Bruce Fields: "The one new feature is support for a new NFSv4.2 mode_umask attribute that makes ACL inheritance a little more useful in environments that default to restrictive umasks. Requires client-side support, also on its way for 4.10. Other than that, miscellaneous smaller fixes and cleanup, especially to the server rdma code" [ The client side of the umask attribute was merged yesterday ] * tag 'nfsd-4.10' of git://linux-nfs.org/~bfields/linux: nfsd: add support for the umask attribute sunrpc: use DEFINE_SPINLOCK() svcrdma: Further clean-up of svc_rdma_get_inv_rkey() svcrdma: Break up dprintk format in svc_rdma_accept() svcrdma: Remove unused variable in rdma_copy_tail() svcrdma: Remove unused variables in xprt_rdma_bc_allocate() svcrdma: Remove svc_rdma_op_ctxt::wc_status svcrdma: Remove DMA map accounting svcrdma: Remove BH-disabled spin locking in svc_rdma_send() svcrdma: Renovate sendto chunk list parsing svcauth_gss: Close connection when dropping an incoming message svcrdma: Clear xpt_bc_xps in xprt_setup_rdma_bc() error exit arm nfsd: constify reply_cache_stats_operations structure nfsd: update workqueue creation sunrpc: GFP_KERNEL should be GFP_NOFS in crypto code nfsd: catch errors in decode_fattr earlier nfsd: clean up supported attribute handling nfsd: fix error handling for clients that fail to return the layout nfsd: more robust allocation failure handling in nfsd_reply_cache_init
This commit is contained in:
commit
759b2656b2
18 changed files with 205 additions and 260 deletions
|
|
@ -200,7 +200,7 @@ make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|||
if (IS_ERR(hmac_md5))
|
||||
goto out_free_md5;
|
||||
|
||||
req = ahash_request_alloc(md5, GFP_KERNEL);
|
||||
req = ahash_request_alloc(md5, GFP_NOFS);
|
||||
if (!req)
|
||||
goto out_free_hmac_md5;
|
||||
|
||||
|
|
@ -230,7 +230,7 @@ make_checksum_hmac_md5(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|||
goto out;
|
||||
|
||||
ahash_request_free(req);
|
||||
req = ahash_request_alloc(hmac_md5, GFP_KERNEL);
|
||||
req = ahash_request_alloc(hmac_md5, GFP_NOFS);
|
||||
if (!req)
|
||||
goto out_free_hmac_md5;
|
||||
|
||||
|
|
@ -299,7 +299,7 @@ make_checksum(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|||
if (IS_ERR(tfm))
|
||||
goto out_free_cksum;
|
||||
|
||||
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
||||
req = ahash_request_alloc(tfm, GFP_NOFS);
|
||||
if (!req)
|
||||
goto out_free_ahash;
|
||||
|
||||
|
|
@ -397,7 +397,7 @@ make_checksum_v2(struct krb5_ctx *kctx, char *header, int hdrlen,
|
|||
goto out_free_cksum;
|
||||
checksumlen = crypto_ahash_digestsize(tfm);
|
||||
|
||||
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
||||
req = ahash_request_alloc(tfm, GFP_NOFS);
|
||||
if (!req)
|
||||
goto out_free_ahash;
|
||||
|
||||
|
|
@ -963,7 +963,7 @@ krb5_rc4_setup_seq_key(struct krb5_ctx *kctx, struct crypto_skcipher *cipher,
|
|||
}
|
||||
|
||||
desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac),
|
||||
GFP_KERNEL);
|
||||
GFP_NOFS);
|
||||
if (!desc) {
|
||||
dprintk("%s: failed to allocate shash descriptor for '%s'\n",
|
||||
__func__, kctx->gk5e->cksum_name);
|
||||
|
|
@ -1030,7 +1030,7 @@ krb5_rc4_setup_enc_key(struct krb5_ctx *kctx, struct crypto_skcipher *cipher,
|
|||
}
|
||||
|
||||
desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac),
|
||||
GFP_KERNEL);
|
||||
GFP_NOFS);
|
||||
if (!desc) {
|
||||
dprintk("%s: failed to allocate shash descriptor for '%s'\n",
|
||||
__func__, kctx->gk5e->cksum_name);
|
||||
|
|
|
|||
|
|
@ -451,8 +451,7 @@ context_derive_keys_rc4(struct krb5_ctx *ctx)
|
|||
goto out_err_free_hmac;
|
||||
|
||||
|
||||
desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac),
|
||||
GFP_KERNEL);
|
||||
desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac), GFP_NOFS);
|
||||
if (!desc) {
|
||||
dprintk("%s: failed to allocate hash descriptor for '%s'\n",
|
||||
__func__, ctx->gk5e->cksum_name);
|
||||
|
|
|
|||
|
|
@ -1548,7 +1548,7 @@ complete:
|
|||
ret = SVC_COMPLETE;
|
||||
goto out;
|
||||
drop:
|
||||
ret = SVC_DROP;
|
||||
ret = SVC_CLOSE;
|
||||
out:
|
||||
if (rsci)
|
||||
cache_put(&rsci->h, sn->rsc_cache);
|
||||
|
|
|
|||
|
|
@ -1155,8 +1155,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
|||
case SVC_DENIED:
|
||||
goto err_bad_auth;
|
||||
case SVC_CLOSE:
|
||||
if (test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
|
||||
svc_close_xprt(rqstp->rq_xprt);
|
||||
goto close;
|
||||
case SVC_DROP:
|
||||
goto dropit;
|
||||
case SVC_COMPLETE:
|
||||
|
|
@ -1246,7 +1245,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
|||
|
||||
sendit:
|
||||
if (svc_authorise(rqstp))
|
||||
goto dropit;
|
||||
goto close;
|
||||
return 1; /* Caller can now send it */
|
||||
|
||||
dropit:
|
||||
|
|
@ -1254,11 +1253,16 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
|||
dprintk("svc: svc_process dropit\n");
|
||||
return 0;
|
||||
|
||||
close:
|
||||
if (test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
|
||||
svc_close_xprt(rqstp->rq_xprt);
|
||||
dprintk("svc: svc_process close\n");
|
||||
return 0;
|
||||
|
||||
err_short_len:
|
||||
svc_printk(rqstp, "short len %Zd, dropping request\n",
|
||||
argv->iov_len);
|
||||
|
||||
goto dropit; /* drop request */
|
||||
goto close;
|
||||
|
||||
err_bad_rpc:
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
|
|
|
|||
|
|
@ -124,8 +124,7 @@ EXPORT_SYMBOL_GPL(svc_auth_unregister);
|
|||
#define DN_HASHMAX (1<<DN_HASHBITS)
|
||||
|
||||
static struct hlist_head auth_domain_table[DN_HASHMAX];
|
||||
static spinlock_t auth_domain_lock =
|
||||
__SPIN_LOCK_UNLOCKED(auth_domain_lock);
|
||||
static DEFINE_SPINLOCK(auth_domain_lock);
|
||||
|
||||
void auth_domain_put(struct auth_domain *dom)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -164,13 +164,9 @@ static int
|
|||
xprt_rdma_bc_allocate(struct rpc_task *task)
|
||||
{
|
||||
struct rpc_rqst *rqst = task->tk_rqstp;
|
||||
struct svc_xprt *sxprt = rqst->rq_xprt->bc_xprt;
|
||||
size_t size = rqst->rq_callsize;
|
||||
struct svcxprt_rdma *rdma;
|
||||
struct page *page;
|
||||
|
||||
rdma = container_of(sxprt, struct svcxprt_rdma, sc_xprt);
|
||||
|
||||
if (size > PAGE_SIZE) {
|
||||
WARN_ONCE(1, "svcrdma: large bc buffer request (size %zu)\n",
|
||||
size);
|
||||
|
|
@ -359,6 +355,7 @@ xprt_setup_rdma_bc(struct xprt_create *args)
|
|||
out_fail:
|
||||
xprt_rdma_free_addresses(xprt);
|
||||
args->bc_xprt->xpt_bc_xprt = NULL;
|
||||
args->bc_xprt->xpt_bc_xps = NULL;
|
||||
xprt_put(xprt);
|
||||
xprt_free(xprt);
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
|
|
|||
|
|
@ -279,7 +279,6 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt,
|
|||
frmr->sg);
|
||||
return -ENOMEM;
|
||||
}
|
||||
atomic_inc(&xprt->sc_dma_used);
|
||||
|
||||
n = ib_map_mr_sg(frmr->mr, frmr->sg, frmr->sg_nents, NULL, PAGE_SIZE);
|
||||
if (unlikely(n != frmr->sg_nents)) {
|
||||
|
|
@ -374,9 +373,7 @@ rdma_copy_tail(struct svc_rqst *rqstp, struct svc_rdma_op_ctxt *head,
|
|||
u32 position, u32 byte_count, u32 page_offset, int page_no)
|
||||
{
|
||||
char *srcp, *destp;
|
||||
int ret;
|
||||
|
||||
ret = 0;
|
||||
srcp = head->arg.head[0].iov_base + position;
|
||||
byte_count = head->arg.head[0].iov_len - position;
|
||||
if (byte_count > PAGE_SIZE) {
|
||||
|
|
@ -415,6 +412,20 @@ done:
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Returns the address of the first read chunk or <nul> if no read chunk
|
||||
* is present
|
||||
*/
|
||||
static struct rpcrdma_read_chunk *
|
||||
svc_rdma_get_read_chunk(struct rpcrdma_msg *rmsgp)
|
||||
{
|
||||
struct rpcrdma_read_chunk *ch =
|
||||
(struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0];
|
||||
|
||||
if (ch->rc_discrim == xdr_zero)
|
||||
return NULL;
|
||||
return ch;
|
||||
}
|
||||
|
||||
static int rdma_read_chunks(struct svcxprt_rdma *xprt,
|
||||
struct rpcrdma_msg *rmsgp,
|
||||
struct svc_rqst *rqstp,
|
||||
|
|
@ -627,8 +638,8 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
|
|||
goto defer;
|
||||
goto out;
|
||||
}
|
||||
dprintk("svcrdma: processing ctxt=%p on xprt=%p, rqstp=%p, status=%d\n",
|
||||
ctxt, rdma_xprt, rqstp, ctxt->wc_status);
|
||||
dprintk("svcrdma: processing ctxt=%p on xprt=%p, rqstp=%p\n",
|
||||
ctxt, rdma_xprt, rqstp);
|
||||
atomic_inc(&rdma_stat_recv);
|
||||
|
||||
/* Build up the XDR from the receive buffers. */
|
||||
|
|
|
|||
|
|
@ -153,76 +153,35 @@ static dma_addr_t dma_map_xdr(struct svcxprt_rdma *xprt,
|
|||
return dma_addr;
|
||||
}
|
||||
|
||||
/* Returns the address of the first read chunk or <nul> if no read chunk
|
||||
* is present
|
||||
/* Parse the RPC Call's transport header.
|
||||
*/
|
||||
struct rpcrdma_read_chunk *
|
||||
svc_rdma_get_read_chunk(struct rpcrdma_msg *rmsgp)
|
||||
static void svc_rdma_get_write_arrays(struct rpcrdma_msg *rmsgp,
|
||||
struct rpcrdma_write_array **write,
|
||||
struct rpcrdma_write_array **reply)
|
||||
{
|
||||
struct rpcrdma_read_chunk *ch =
|
||||
(struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0];
|
||||
__be32 *p;
|
||||
|
||||
if (ch->rc_discrim == xdr_zero)
|
||||
return NULL;
|
||||
return ch;
|
||||
}
|
||||
p = (__be32 *)&rmsgp->rm_body.rm_chunks[0];
|
||||
|
||||
/* Returns the address of the first read write array element or <nul>
|
||||
* if no write array list is present
|
||||
*/
|
||||
static struct rpcrdma_write_array *
|
||||
svc_rdma_get_write_array(struct rpcrdma_msg *rmsgp)
|
||||
{
|
||||
if (rmsgp->rm_body.rm_chunks[0] != xdr_zero ||
|
||||
rmsgp->rm_body.rm_chunks[1] == xdr_zero)
|
||||
return NULL;
|
||||
return (struct rpcrdma_write_array *)&rmsgp->rm_body.rm_chunks[1];
|
||||
}
|
||||
/* Read list */
|
||||
while (*p++ != xdr_zero)
|
||||
p += 5;
|
||||
|
||||
/* Returns the address of the first reply array element or <nul> if no
|
||||
* reply array is present
|
||||
*/
|
||||
static struct rpcrdma_write_array *
|
||||
svc_rdma_get_reply_array(struct rpcrdma_msg *rmsgp,
|
||||
struct rpcrdma_write_array *wr_ary)
|
||||
{
|
||||
struct rpcrdma_read_chunk *rch;
|
||||
struct rpcrdma_write_array *rp_ary;
|
||||
|
||||
/* XXX: Need to fix when reply chunk may occur with read list
|
||||
* and/or write list.
|
||||
*/
|
||||
if (rmsgp->rm_body.rm_chunks[0] != xdr_zero ||
|
||||
rmsgp->rm_body.rm_chunks[1] != xdr_zero)
|
||||
return NULL;
|
||||
|
||||
rch = svc_rdma_get_read_chunk(rmsgp);
|
||||
if (rch) {
|
||||
while (rch->rc_discrim != xdr_zero)
|
||||
rch++;
|
||||
|
||||
/* The reply chunk follows an empty write array located
|
||||
* at 'rc_position' here. The reply array is at rc_target.
|
||||
*/
|
||||
rp_ary = (struct rpcrdma_write_array *)&rch->rc_target;
|
||||
goto found_it;
|
||||
/* Write list */
|
||||
if (*p != xdr_zero) {
|
||||
*write = (struct rpcrdma_write_array *)p;
|
||||
while (*p++ != xdr_zero)
|
||||
p += 1 + be32_to_cpu(*p) * 4;
|
||||
} else {
|
||||
*write = NULL;
|
||||
p++;
|
||||
}
|
||||
|
||||
if (wr_ary) {
|
||||
int chunk = be32_to_cpu(wr_ary->wc_nchunks);
|
||||
|
||||
rp_ary = (struct rpcrdma_write_array *)
|
||||
&wr_ary->wc_array[chunk].wc_target.rs_length;
|
||||
goto found_it;
|
||||
}
|
||||
|
||||
/* No read list, no write list */
|
||||
rp_ary = (struct rpcrdma_write_array *)&rmsgp->rm_body.rm_chunks[2];
|
||||
|
||||
found_it:
|
||||
if (rp_ary->wc_discrim == xdr_zero)
|
||||
return NULL;
|
||||
return rp_ary;
|
||||
/* Reply chunk */
|
||||
if (*p != xdr_zero)
|
||||
*reply = (struct rpcrdma_write_array *)p;
|
||||
else
|
||||
*reply = NULL;
|
||||
}
|
||||
|
||||
/* RPC-over-RDMA Version One private extension: Remote Invalidation.
|
||||
|
|
@ -240,31 +199,22 @@ static u32 svc_rdma_get_inv_rkey(struct rpcrdma_msg *rdma_argp,
|
|||
{
|
||||
struct rpcrdma_read_chunk *rd_ary;
|
||||
struct rpcrdma_segment *arg_ch;
|
||||
u32 inv_rkey;
|
||||
|
||||
inv_rkey = 0;
|
||||
|
||||
rd_ary = svc_rdma_get_read_chunk(rdma_argp);
|
||||
if (rd_ary) {
|
||||
inv_rkey = be32_to_cpu(rd_ary->rc_target.rs_handle);
|
||||
goto out;
|
||||
}
|
||||
rd_ary = (struct rpcrdma_read_chunk *)&rdma_argp->rm_body.rm_chunks[0];
|
||||
if (rd_ary->rc_discrim != xdr_zero)
|
||||
return be32_to_cpu(rd_ary->rc_target.rs_handle);
|
||||
|
||||
if (wr_ary && be32_to_cpu(wr_ary->wc_nchunks)) {
|
||||
arg_ch = &wr_ary->wc_array[0].wc_target;
|
||||
inv_rkey = be32_to_cpu(arg_ch->rs_handle);
|
||||
goto out;
|
||||
return be32_to_cpu(arg_ch->rs_handle);
|
||||
}
|
||||
|
||||
if (rp_ary && be32_to_cpu(rp_ary->wc_nchunks)) {
|
||||
arg_ch = &rp_ary->wc_array[0].wc_target;
|
||||
inv_rkey = be32_to_cpu(arg_ch->rs_handle);
|
||||
goto out;
|
||||
return be32_to_cpu(arg_ch->rs_handle);
|
||||
}
|
||||
|
||||
out:
|
||||
dprintk("svcrdma: Send With Invalidate rkey=%08x\n", inv_rkey);
|
||||
return inv_rkey;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Assumptions:
|
||||
|
|
@ -622,8 +572,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
|
|||
* places this at the start of page 0.
|
||||
*/
|
||||
rdma_argp = page_address(rqstp->rq_pages[0]);
|
||||
wr_ary = svc_rdma_get_write_array(rdma_argp);
|
||||
rp_ary = svc_rdma_get_reply_array(rdma_argp, wr_ary);
|
||||
svc_rdma_get_write_arrays(rdma_argp, &wr_ary, &rp_ary);
|
||||
|
||||
inv_rkey = 0;
|
||||
if (rdma->sc_snd_w_inv)
|
||||
|
|
@ -636,7 +585,12 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
|
|||
goto err0;
|
||||
inline_bytes = rqstp->rq_res.len;
|
||||
|
||||
/* Create the RDMA response header */
|
||||
/* Create the RDMA response header. xprt->xpt_mutex,
|
||||
* acquired in svc_send(), serializes RPC replies. The
|
||||
* code path below that inserts the credit grant value
|
||||
* into each transport header runs only inside this
|
||||
* critical section.
|
||||
*/
|
||||
ret = -ENOMEM;
|
||||
res_page = alloc_page(GFP_KERNEL);
|
||||
if (!res_page)
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/sunrpc/svc_xprt.h>
|
||||
#include <linux/sunrpc/addr.h>
|
||||
#include <linux/sunrpc/debug.h>
|
||||
#include <linux/sunrpc/rpc_rdma.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
@ -226,25 +227,22 @@ void svc_rdma_unmap_dma(struct svc_rdma_op_ctxt *ctxt)
|
|||
struct svcxprt_rdma *xprt = ctxt->xprt;
|
||||
struct ib_device *device = xprt->sc_cm_id->device;
|
||||
u32 lkey = xprt->sc_pd->local_dma_lkey;
|
||||
unsigned int i, count;
|
||||
unsigned int i;
|
||||
|
||||
for (count = 0, i = 0; i < ctxt->mapped_sges; i++) {
|
||||
for (i = 0; i < ctxt->mapped_sges; i++) {
|
||||
/*
|
||||
* Unmap the DMA addr in the SGE if the lkey matches
|
||||
* the local_dma_lkey, otherwise, ignore it since it is
|
||||
* an FRMR lkey and will be unmapped later when the
|
||||
* last WR that uses it completes.
|
||||
*/
|
||||
if (ctxt->sge[i].lkey == lkey) {
|
||||
count++;
|
||||
if (ctxt->sge[i].lkey == lkey)
|
||||
ib_dma_unmap_page(device,
|
||||
ctxt->sge[i].addr,
|
||||
ctxt->sge[i].length,
|
||||
ctxt->direction);
|
||||
}
|
||||
}
|
||||
ctxt->mapped_sges = 0;
|
||||
atomic_sub(count, &xprt->sc_dma_used);
|
||||
}
|
||||
|
||||
void svc_rdma_put_context(struct svc_rdma_op_ctxt *ctxt, int free_pages)
|
||||
|
|
@ -398,7 +396,6 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)
|
|||
|
||||
/* WARNING: Only wc->wr_cqe and wc->status are reliable */
|
||||
ctxt = container_of(cqe, struct svc_rdma_op_ctxt, cqe);
|
||||
ctxt->wc_status = wc->status;
|
||||
svc_rdma_unmap_dma(ctxt);
|
||||
|
||||
if (wc->status != IB_WC_SUCCESS)
|
||||
|
|
@ -436,7 +433,7 @@ static void svc_rdma_send_wc_common(struct svcxprt_rdma *xprt,
|
|||
goto err;
|
||||
|
||||
out:
|
||||
atomic_dec(&xprt->sc_sq_count);
|
||||
atomic_inc(&xprt->sc_sq_avail);
|
||||
wake_up(&xprt->sc_send_wait);
|
||||
return;
|
||||
|
||||
|
|
@ -946,7 +943,6 @@ void svc_rdma_put_frmr(struct svcxprt_rdma *rdma,
|
|||
if (frmr) {
|
||||
ib_dma_unmap_sg(rdma->sc_cm_id->device,
|
||||
frmr->sg, frmr->sg_nents, frmr->direction);
|
||||
atomic_dec(&rdma->sc_dma_used);
|
||||
spin_lock_bh(&rdma->sc_frmr_q_lock);
|
||||
WARN_ON_ONCE(!list_empty(&frmr->frmr_list));
|
||||
list_add(&frmr->frmr_list, &rdma->sc_frmr_q);
|
||||
|
|
@ -973,6 +969,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
|||
struct rpcrdma_connect_private pmsg;
|
||||
struct ib_qp_init_attr qp_attr;
|
||||
struct ib_device *dev;
|
||||
struct sockaddr *sap;
|
||||
unsigned int i;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -1010,6 +1007,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
|||
newxprt->sc_rq_depth = newxprt->sc_max_requests +
|
||||
newxprt->sc_max_bc_requests;
|
||||
newxprt->sc_sq_depth = RPCRDMA_SQ_DEPTH_MULT * newxprt->sc_rq_depth;
|
||||
atomic_set(&newxprt->sc_sq_avail, newxprt->sc_sq_depth);
|
||||
|
||||
if (!svc_rdma_prealloc_ctxts(newxprt))
|
||||
goto errout;
|
||||
|
|
@ -1052,18 +1050,12 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
|||
qp_attr.qp_type = IB_QPT_RC;
|
||||
qp_attr.send_cq = newxprt->sc_sq_cq;
|
||||
qp_attr.recv_cq = newxprt->sc_rq_cq;
|
||||
dprintk("svcrdma: newxprt->sc_cm_id=%p, newxprt->sc_pd=%p\n"
|
||||
" cm_id->device=%p, sc_pd->device=%p\n"
|
||||
" cap.max_send_wr = %d\n"
|
||||
" cap.max_recv_wr = %d\n"
|
||||
" cap.max_send_sge = %d\n"
|
||||
" cap.max_recv_sge = %d\n",
|
||||
newxprt->sc_cm_id, newxprt->sc_pd,
|
||||
dev, newxprt->sc_pd->device,
|
||||
qp_attr.cap.max_send_wr,
|
||||
qp_attr.cap.max_recv_wr,
|
||||
qp_attr.cap.max_send_sge,
|
||||
qp_attr.cap.max_recv_sge);
|
||||
dprintk("svcrdma: newxprt->sc_cm_id=%p, newxprt->sc_pd=%p\n",
|
||||
newxprt->sc_cm_id, newxprt->sc_pd);
|
||||
dprintk(" cap.max_send_wr = %d, cap.max_recv_wr = %d\n",
|
||||
qp_attr.cap.max_send_wr, qp_attr.cap.max_recv_wr);
|
||||
dprintk(" cap.max_send_sge = %d, cap.max_recv_sge = %d\n",
|
||||
qp_attr.cap.max_send_sge, qp_attr.cap.max_recv_sge);
|
||||
|
||||
ret = rdma_create_qp(newxprt->sc_cm_id, newxprt->sc_pd, &qp_attr);
|
||||
if (ret) {
|
||||
|
|
@ -1146,31 +1138,16 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
|||
goto errout;
|
||||
}
|
||||
|
||||
dprintk("svcrdma: new connection %p accepted with the following "
|
||||
"attributes:\n"
|
||||
" local_ip : %pI4\n"
|
||||
" local_port : %d\n"
|
||||
" remote_ip : %pI4\n"
|
||||
" remote_port : %d\n"
|
||||
" max_sge : %d\n"
|
||||
" max_sge_rd : %d\n"
|
||||
" sq_depth : %d\n"
|
||||
" max_requests : %d\n"
|
||||
" ord : %d\n",
|
||||
newxprt,
|
||||
&((struct sockaddr_in *)&newxprt->sc_cm_id->
|
||||
route.addr.src_addr)->sin_addr.s_addr,
|
||||
ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
|
||||
route.addr.src_addr)->sin_port),
|
||||
&((struct sockaddr_in *)&newxprt->sc_cm_id->
|
||||
route.addr.dst_addr)->sin_addr.s_addr,
|
||||
ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
|
||||
route.addr.dst_addr)->sin_port),
|
||||
newxprt->sc_max_sge,
|
||||
newxprt->sc_max_sge_rd,
|
||||
newxprt->sc_sq_depth,
|
||||
newxprt->sc_max_requests,
|
||||
newxprt->sc_ord);
|
||||
dprintk("svcrdma: new connection %p accepted:\n", newxprt);
|
||||
sap = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr;
|
||||
dprintk(" local address : %pIS:%u\n", sap, rpc_get_port(sap));
|
||||
sap = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr;
|
||||
dprintk(" remote address : %pIS:%u\n", sap, rpc_get_port(sap));
|
||||
dprintk(" max_sge : %d\n", newxprt->sc_max_sge);
|
||||
dprintk(" max_sge_rd : %d\n", newxprt->sc_max_sge_rd);
|
||||
dprintk(" sq_depth : %d\n", newxprt->sc_sq_depth);
|
||||
dprintk(" max_requests : %d\n", newxprt->sc_max_requests);
|
||||
dprintk(" ord : %d\n", newxprt->sc_ord);
|
||||
|
||||
return &newxprt->sc_xprt;
|
||||
|
||||
|
|
@ -1257,9 +1234,6 @@ static void __svc_rdma_free(struct work_struct *work)
|
|||
if (rdma->sc_ctxt_used != 0)
|
||||
pr_err("svcrdma: ctxt still in use? (%d)\n",
|
||||
rdma->sc_ctxt_used);
|
||||
if (atomic_read(&rdma->sc_dma_used) != 0)
|
||||
pr_err("svcrdma: dma still in use? (%d)\n",
|
||||
atomic_read(&rdma->sc_dma_used));
|
||||
|
||||
/* Final put of backchannel client transport */
|
||||
if (xprt->xpt_bc_xprt) {
|
||||
|
|
@ -1339,15 +1313,13 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
|
|||
|
||||
/* If the SQ is full, wait until an SQ entry is available */
|
||||
while (1) {
|
||||
spin_lock_bh(&xprt->sc_lock);
|
||||
if (xprt->sc_sq_depth < atomic_read(&xprt->sc_sq_count) + wr_count) {
|
||||
spin_unlock_bh(&xprt->sc_lock);
|
||||
if ((atomic_sub_return(wr_count, &xprt->sc_sq_avail) < 0)) {
|
||||
atomic_inc(&rdma_stat_sq_starve);
|
||||
|
||||
/* Wait until SQ WR available if SQ still full */
|
||||
atomic_add(wr_count, &xprt->sc_sq_avail);
|
||||
wait_event(xprt->sc_send_wait,
|
||||
atomic_read(&xprt->sc_sq_count) <
|
||||
xprt->sc_sq_depth);
|
||||
atomic_read(&xprt->sc_sq_avail) > wr_count);
|
||||
if (test_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags))
|
||||
return -ENOTCONN;
|
||||
continue;
|
||||
|
|
@ -1357,21 +1329,17 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
|
|||
svc_xprt_get(&xprt->sc_xprt);
|
||||
|
||||
/* Bump used SQ WR count and post */
|
||||
atomic_add(wr_count, &xprt->sc_sq_count);
|
||||
ret = ib_post_send(xprt->sc_qp, wr, &bad_wr);
|
||||
if (ret) {
|
||||
set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
|
||||
atomic_sub(wr_count, &xprt->sc_sq_count);
|
||||
for (i = 0; i < wr_count; i ++)
|
||||
svc_xprt_put(&xprt->sc_xprt);
|
||||
dprintk("svcrdma: failed to post SQ WR rc=%d, "
|
||||
"sc_sq_count=%d, sc_sq_depth=%d\n",
|
||||
ret, atomic_read(&xprt->sc_sq_count),
|
||||
xprt->sc_sq_depth);
|
||||
}
|
||||
spin_unlock_bh(&xprt->sc_lock);
|
||||
if (ret)
|
||||
dprintk("svcrdma: failed to post SQ WR rc=%d\n", ret);
|
||||
dprintk(" sc_sq_avail=%d, sc_sq_depth=%d\n",
|
||||
atomic_read(&xprt->sc_sq_avail),
|
||||
xprt->sc_sq_depth);
|
||||
wake_up(&xprt->sc_send_wait);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in a new issue