Commit 5148bf4e authored by Tom Tucker's avatar Tom Tucker Committed by J. Bruce Fields

svc: Add transport specific xpo_release function

The svc_sock_release function releases pages allocated to a thread. For
UDP this frees the receive skb. For RDMA it will post a receive WR
and bump the client credit count.
Signed-off-by: default avatarTom Tucker <tom@opengridcomputing.com>
Acked-by: default avatarNeil Brown <neilb@suse.de>
Reviewed-by: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarGreg Banks <gnb@sgi.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 5d137990
...@@ -217,7 +217,7 @@ struct svc_rqst { ...@@ -217,7 +217,7 @@ struct svc_rqst {
struct auth_ops * rq_authop; /* authentication flavour */ struct auth_ops * rq_authop; /* authentication flavour */
u32 rq_flavor; /* pseudoflavor */ u32 rq_flavor; /* pseudoflavor */
struct svc_cred rq_cred; /* auth info */ struct svc_cred rq_cred; /* auth info */
struct sk_buff * rq_skbuff; /* fast recv inet buffer */ void * rq_xprt_ctxt; /* transport specific context ptr */
struct svc_deferred_req*rq_deferred; /* deferred request we are replaying */ struct svc_deferred_req*rq_deferred; /* deferred request we are replaying */
struct xdr_buf rq_arg; struct xdr_buf rq_arg;
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
struct svc_xprt_ops { struct svc_xprt_ops {
int (*xpo_recvfrom)(struct svc_rqst *); int (*xpo_recvfrom)(struct svc_rqst *);
int (*xpo_sendto)(struct svc_rqst *); int (*xpo_sendto)(struct svc_rqst *);
void (*xpo_release_rqst)(struct svc_rqst *);
}; };
struct svc_xprt_class { struct svc_xprt_class {
......
...@@ -185,14 +185,13 @@ svc_thread_dequeue(struct svc_pool *pool, struct svc_rqst *rqstp) ...@@ -185,14 +185,13 @@ svc_thread_dequeue(struct svc_pool *pool, struct svc_rqst *rqstp)
/* /*
* Release an skbuff after use * Release an skbuff after use
*/ */
static inline void static void svc_release_skb(struct svc_rqst *rqstp)
svc_release_skb(struct svc_rqst *rqstp)
{ {
struct sk_buff *skb = rqstp->rq_skbuff; struct sk_buff *skb = rqstp->rq_xprt_ctxt;
struct svc_deferred_req *dr = rqstp->rq_deferred; struct svc_deferred_req *dr = rqstp->rq_deferred;
if (skb) { if (skb) {
rqstp->rq_skbuff = NULL; rqstp->rq_xprt_ctxt = NULL;
dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
skb_free_datagram(rqstp->rq_sock->sk_sk, skb); skb_free_datagram(rqstp->rq_sock->sk_sk, skb);
...@@ -395,7 +394,7 @@ svc_sock_release(struct svc_rqst *rqstp) ...@@ -395,7 +394,7 @@ svc_sock_release(struct svc_rqst *rqstp)
{ {
struct svc_sock *svsk = rqstp->rq_sock; struct svc_sock *svsk = rqstp->rq_sock;
svc_release_skb(rqstp); rqstp->rq_xprt->xpt_ops->xpo_release_rqst(rqstp);
svc_free_res_pages(rqstp); svc_free_res_pages(rqstp);
rqstp->rq_res.page_len = 0; rqstp->rq_res.page_len = 0;
...@@ -867,7 +866,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) ...@@ -867,7 +866,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
skb_free_datagram(svsk->sk_sk, skb); skb_free_datagram(svsk->sk_sk, skb);
return 0; return 0;
} }
rqstp->rq_skbuff = skb; rqstp->rq_xprt_ctxt = skb;
} }
rqstp->rq_arg.page_base = 0; rqstp->rq_arg.page_base = 0;
...@@ -903,6 +902,7 @@ svc_udp_sendto(struct svc_rqst *rqstp) ...@@ -903,6 +902,7 @@ svc_udp_sendto(struct svc_rqst *rqstp)
static struct svc_xprt_ops svc_udp_ops = { static struct svc_xprt_ops svc_udp_ops = {
.xpo_recvfrom = svc_udp_recvfrom, .xpo_recvfrom = svc_udp_recvfrom,
.xpo_sendto = svc_udp_sendto, .xpo_sendto = svc_udp_sendto,
.xpo_release_rqst = svc_release_skb,
}; };
static struct svc_xprt_class svc_udp_class = { static struct svc_xprt_class svc_udp_class = {
...@@ -1291,7 +1291,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) ...@@ -1291,7 +1291,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp)
rqstp->rq_arg.page_len = len - rqstp->rq_arg.head[0].iov_len; rqstp->rq_arg.page_len = len - rqstp->rq_arg.head[0].iov_len;
} }
rqstp->rq_skbuff = NULL; rqstp->rq_xprt_ctxt = NULL;
rqstp->rq_prot = IPPROTO_TCP; rqstp->rq_prot = IPPROTO_TCP;
/* Reset TCP read info */ /* Reset TCP read info */
...@@ -1357,6 +1357,7 @@ svc_tcp_sendto(struct svc_rqst *rqstp) ...@@ -1357,6 +1357,7 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
static struct svc_xprt_ops svc_tcp_ops = { static struct svc_xprt_ops svc_tcp_ops = {
.xpo_recvfrom = svc_tcp_recvfrom, .xpo_recvfrom = svc_tcp_recvfrom,
.xpo_sendto = svc_tcp_sendto, .xpo_sendto = svc_tcp_sendto,
.xpo_release_rqst = svc_release_skb,
}; };
static struct svc_xprt_class svc_tcp_class = { static struct svc_xprt_class svc_tcp_class = {
...@@ -1578,7 +1579,7 @@ svc_send(struct svc_rqst *rqstp) ...@@ -1578,7 +1579,7 @@ svc_send(struct svc_rqst *rqstp)
} }
/* release the receive skb before sending the reply */ /* release the receive skb before sending the reply */
svc_release_skb(rqstp); rqstp->rq_xprt->xpt_ops->xpo_release_rqst(rqstp);
/* calculate over-all length */ /* calculate over-all length */
xb = & rqstp->rq_res; xb = & rqstp->rq_res;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment