Commit 7dcfbd86 authored by Chuck Lever's avatar Chuck Lever

SUNRPC: Export svc_xprt_received()

Prepare svc_xprt_received() to be called from transport code instead
of from generic RPC server code.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent cc93ce95
...@@ -130,6 +130,7 @@ void svc_xprt_init(struct net *, struct svc_xprt_class *, struct svc_xprt *, ...@@ -130,6 +130,7 @@ void svc_xprt_init(struct net *, struct svc_xprt_class *, struct svc_xprt *,
int svc_create_xprt(struct svc_serv *, const char *, struct net *, int svc_create_xprt(struct svc_serv *, const char *, struct net *,
const int, const unsigned short, int, const int, const unsigned short, int,
const struct cred *); const struct cred *);
void svc_xprt_received(struct svc_xprt *xprt);
void svc_xprt_do_enqueue(struct svc_xprt *xprt); void svc_xprt_do_enqueue(struct svc_xprt *xprt);
void svc_xprt_enqueue(struct svc_xprt *xprt); void svc_xprt_enqueue(struct svc_xprt *xprt);
void svc_xprt_put(struct svc_xprt *xprt); void svc_xprt_put(struct svc_xprt *xprt);
......
...@@ -1781,6 +1781,7 @@ DECLARE_EVENT_CLASS(svc_xprt_event, ...@@ -1781,6 +1781,7 @@ DECLARE_EVENT_CLASS(svc_xprt_event,
), \ ), \
TP_ARGS(xprt)) TP_ARGS(xprt))
DEFINE_SVC_XPRT_EVENT(received);
DEFINE_SVC_XPRT_EVENT(no_write_space); DEFINE_SVC_XPRT_EVENT(no_write_space);
DEFINE_SVC_XPRT_EVENT(close); DEFINE_SVC_XPRT_EVENT(close);
DEFINE_SVC_XPRT_EVENT(detach); DEFINE_SVC_XPRT_EVENT(detach);
......
...@@ -247,21 +247,25 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, ...@@ -247,21 +247,25 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl,
return xprt; return xprt;
} }
/* /**
* svc_xprt_received conditionally queues the transport for processing * svc_xprt_received - start next receiver thread
* by another thread. The caller must hold the XPT_BUSY bit and must * @xprt: controlling transport
*
* The caller must hold the XPT_BUSY bit and must
* not thereafter touch transport data. * not thereafter touch transport data.
* *
* Note: XPT_DATA only gets cleared when a read-attempt finds no (or * Note: XPT_DATA only gets cleared when a read-attempt finds no (or
* insufficient) data. * insufficient) data.
*/ */
static void svc_xprt_received(struct svc_xprt *xprt) void svc_xprt_received(struct svc_xprt *xprt)
{ {
if (!test_bit(XPT_BUSY, &xprt->xpt_flags)) { if (!test_bit(XPT_BUSY, &xprt->xpt_flags)) {
WARN_ONCE(1, "xprt=0x%p already busy!", xprt); WARN_ONCE(1, "xprt=0x%p already busy!", xprt);
return; return;
} }
trace_svc_xprt_received(xprt);
/* As soon as we clear busy, the xprt could be closed and /* As soon as we clear busy, the xprt could be closed and
* 'put', so we need a reference to call svc_enqueue_xprt with: * 'put', so we need a reference to call svc_enqueue_xprt with:
*/ */
...@@ -271,6 +275,7 @@ static void svc_xprt_received(struct svc_xprt *xprt) ...@@ -271,6 +275,7 @@ static void svc_xprt_received(struct svc_xprt *xprt)
xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt); xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt);
svc_xprt_put(xprt); svc_xprt_put(xprt);
} }
EXPORT_SYMBOL_GPL(svc_xprt_received);
void svc_add_new_perm_xprt(struct svc_serv *serv, struct svc_xprt *new) void svc_add_new_perm_xprt(struct svc_serv *serv, struct svc_xprt *new)
{ {
......
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