xprtrdma: "Support" call-only RPCs
RPC-over-RDMA version 1 credit accounting relies on there being a response message for every RPC Call. This means that RPC procedures that have no reply will disrupt credit accounting, just in the same way as a retransmit would (since it is sent because no reply has arrived). Deal with the "no reply" case the same way. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Родитель
ae741a8551
Коммит
fb14ae8853
|
@ -217,5 +217,12 @@ void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
|
||||||
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
|
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
|
||||||
const struct sockaddr *sap);
|
const struct sockaddr *sap);
|
||||||
void rpc_cleanup_clids(void);
|
void rpc_cleanup_clids(void);
|
||||||
|
|
||||||
|
static inline int rpc_reply_expected(struct rpc_task *task)
|
||||||
|
{
|
||||||
|
return (task->tk_msg.rpc_proc != NULL) &&
|
||||||
|
(task->tk_msg.rpc_proc->p_decode != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _LINUX_SUNRPC_CLNT_H */
|
#endif /* _LINUX_SUNRPC_CLNT_H */
|
||||||
|
|
|
@ -37,12 +37,6 @@ struct rpc_buffer {
|
||||||
char data[];
|
char data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline int rpc_reply_expected(struct rpc_task *task)
|
|
||||||
{
|
|
||||||
return (task->tk_msg.rpc_proc != NULL) &&
|
|
||||||
(task->tk_msg.rpc_proc->p_decode != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int sock_is_loopback(struct sock *sk)
|
static inline int sock_is_loopback(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct dst_entry *dst;
|
struct dst_entry *dst;
|
||||||
|
|
|
@ -728,6 +728,12 @@ xprt_rdma_send_request(struct rpc_task *task)
|
||||||
|
|
||||||
rqst->rq_xmit_bytes_sent += rqst->rq_snd_buf.len;
|
rqst->rq_xmit_bytes_sent += rqst->rq_snd_buf.len;
|
||||||
rqst->rq_bytes_sent = 0;
|
rqst->rq_bytes_sent = 0;
|
||||||
|
|
||||||
|
/* An RPC with no reply will throw off credit accounting,
|
||||||
|
* so drop the connection to reset the credit grant.
|
||||||
|
*/
|
||||||
|
if (!rpc_reply_expected(task))
|
||||||
|
goto drop_connection;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
failed_marshal:
|
failed_marshal:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче