mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
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: Tom Tucker <[email protected]> Acked-by: Neil Brown <[email protected]> Reviewed-by: Chuck Lever <[email protected]> Reviewed-by: Greg Banks <[email protected]> Signed-off-by: J. Bruce Fields <[email protected]>
This commit is contained in:
parent
5d137990f5
commit
5148bf4ebc
3 changed files with 11 additions and 9 deletions
|
|
@ -185,14 +185,13 @@ svc_thread_dequeue(struct svc_pool *pool, struct svc_rqst *rqstp)
|
|||
/*
|
||||
* Release an skbuff after use
|
||||
*/
|
||||
static inline void
|
||||
svc_release_skb(struct svc_rqst *rqstp)
|
||||
static void 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;
|
||||
|
||||
if (skb) {
|
||||
rqstp->rq_skbuff = NULL;
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
|
||||
dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
|
||||
skb_free_datagram(rqstp->rq_sock->sk_sk, skb);
|
||||
|
|
@ -395,7 +394,7 @@ svc_sock_release(struct svc_rqst *rqstp)
|
|||
{
|
||||
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);
|
||||
rqstp->rq_res.page_len = 0;
|
||||
|
|
@ -867,7 +866,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
|
|||
skb_free_datagram(svsk->sk_sk, skb);
|
||||
return 0;
|
||||
}
|
||||
rqstp->rq_skbuff = skb;
|
||||
rqstp->rq_xprt_ctxt = skb;
|
||||
}
|
||||
|
||||
rqstp->rq_arg.page_base = 0;
|
||||
|
|
@ -903,6 +902,7 @@ svc_udp_sendto(struct svc_rqst *rqstp)
|
|||
static struct svc_xprt_ops svc_udp_ops = {
|
||||
.xpo_recvfrom = svc_udp_recvfrom,
|
||||
.xpo_sendto = svc_udp_sendto,
|
||||
.xpo_release_rqst = svc_release_skb,
|
||||
};
|
||||
|
||||
static struct svc_xprt_class svc_udp_class = {
|
||||
|
|
@ -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_skbuff = NULL;
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
rqstp->rq_prot = IPPROTO_TCP;
|
||||
|
||||
/* Reset TCP read info */
|
||||
|
|
@ -1357,6 +1357,7 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
|
|||
static struct svc_xprt_ops svc_tcp_ops = {
|
||||
.xpo_recvfrom = svc_tcp_recvfrom,
|
||||
.xpo_sendto = svc_tcp_sendto,
|
||||
.xpo_release_rqst = svc_release_skb,
|
||||
};
|
||||
|
||||
static struct svc_xprt_class svc_tcp_class = {
|
||||
|
|
@ -1578,7 +1579,7 @@ svc_send(struct svc_rqst *rqstp)
|
|||
}
|
||||
|
||||
/* 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 */
|
||||
xb = & rqstp->rq_res;
|
||||
|
|
|
|||
Loading…
Reference in a new issue