コード例 #1
0
ファイル: xprt.c プロジェクト: wanggx/Linux2.6
static void
__xprt_lock_write_next(struct rpc_xprt *xprt)
{
	struct rpc_task *task;

	if (test_and_set_bit(XPRT_LOCKED, &xprt->sockstate))
		return;
	if (!xprt->nocong && RPCXPRT_CONGESTED(xprt))
		goto out_unlock;
	task = rpc_wake_up_next(&xprt->resend);
	if (!task) {
		task = rpc_wake_up_next(&xprt->sending);
		if (!task)
			goto out_unlock;
	}
	if (xprt->nocong || __xprt_get_cong(xprt, task)) {
		struct rpc_rqst *req = task->tk_rqstp;
		xprt->snd_task = task;
		if (req) {
			req->rq_bytes_sent = 0;
			req->rq_ntrans++;
		}
		return;
	}
out_unlock:
	smp_mb__before_clear_bit();
	clear_bit(XPRT_LOCKED, &xprt->sockstate);
	smp_mb__after_clear_bit();
}
コード例 #2
0
ファイル: xprt.c プロジェクト: wanggx/Linux2.6
/*
 * Serialize write access to sockets, in order to prevent different
 * requests from interfering with each other.
 * Also prevents TCP socket connects from colliding with writes.
 */
static int
__xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
{
	struct rpc_rqst *req = task->tk_rqstp;

	if (test_and_set_bit(XPRT_LOCKED, &xprt->sockstate)) {
		if (task == xprt->snd_task)
			return 1;
		if (task == NULL)
			return 0;
		goto out_sleep;
	}
	if (xprt->nocong || __xprt_get_cong(xprt, task)) {
		xprt->snd_task = task;
		if (req) {
			req->rq_bytes_sent = 0;
			req->rq_ntrans++;
		}
		return 1;
	}
	smp_mb__before_clear_bit();
	clear_bit(XPRT_LOCKED, &xprt->sockstate);
	smp_mb__after_clear_bit();
out_sleep:
	dprintk("RPC: %4d failed to lock socket %p\n", task->tk_pid, xprt);
	task->tk_timeout = 0;
	task->tk_status = -EAGAIN;
	if (req && req->rq_ntrans)
		rpc_sleep_on(&xprt->resend, task, NULL, NULL);
	else
		rpc_sleep_on(&xprt->sending, task, NULL, NULL);
	return 0;
}
コード例 #3
0
ファイル: xprt.c プロジェクト: qwerty1023/wive-rtnl-firmware
static void __xprt_lock_write_next_cong(struct rpc_xprt *xprt)
{
	struct rpc_task *task;

	if (test_and_set_bit(XPRT_LOCKED, &xprt->state))
		return;
	if (RPCXPRT_CONGESTED(xprt))
		goto out_unlock;
	task = rpc_wake_up_next(&xprt->resend);
	if (!task) {
		task = rpc_wake_up_next(&xprt->sending);
		if (!task)
			goto out_unlock;
	}
	if (__xprt_get_cong(xprt, task)) {
		struct rpc_rqst *req = task->tk_rqstp;
		xprt->snd_task = task;
		if (req) {
			req->rq_bytes_sent = 0;
			req->rq_ntrans++;
		}
		return;
	}
out_unlock:
	xprt_clear_locked(xprt);
}
コード例 #4
0
ファイル: xprt.c プロジェクト: qwerty1023/wive-rtnl-firmware
/*
 * xprt_reserve_xprt_cong - serialize write access to transports
 * @task: task that is requesting access to the transport
 *
 * Same as xprt_reserve_xprt, but Van Jacobson congestion control is
 * integrated into the decision of whether a request is allowed to be
 * woken up and given access to the transport.
 */
int xprt_reserve_xprt_cong(struct rpc_task *task)
{
	struct rpc_xprt	*xprt = task->tk_xprt;
	struct rpc_rqst *req = task->tk_rqstp;

	if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) {
		if (task == xprt->snd_task)
			return 1;
		goto out_sleep;
	}
	if (__xprt_get_cong(xprt, task)) {
		xprt->snd_task = task;
		if (req) {
			req->rq_bytes_sent = 0;
			req->rq_ntrans++;
		}
		return 1;
	}
	xprt_clear_locked(xprt);
out_sleep:
	dprintk("RPC: %5u failed to lock transport %p\n", task->tk_pid, xprt);
	task->tk_timeout = 0;
	task->tk_status = -EAGAIN;
	if (req && req->rq_ntrans)
		rpc_sleep_on(&xprt->resend, task, NULL, NULL);
	else
		rpc_sleep_on(&xprt->sending, task, NULL, NULL);
	return 0;
}
コード例 #5
0
ファイル: xprt.c プロジェクト: xricson/knoppix
/*
 * Serialize write access to sockets, in order to prevent different
 * requests from interfering with each other.
 * Also prevents TCP socket connects from colliding with writes.
 */
static int
__xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
{
	struct rpc_rqst *req = task->tk_rqstp;

	if (!xprt->snd_task) {
		if (xprt->nocong || __xprt_get_cong(xprt, task)) {
			xprt->snd_task = task;
			if (req) {
				req->rq_bytes_sent = 0;
				req->rq_ntrans++;
			}
		}
	}
	if (xprt->snd_task != task) {
		dprintk("RPC: %4d TCP write queue full\n", task->tk_pid);
		task->tk_timeout = 0;
		task->tk_status = -EAGAIN;
		if (req && req->rq_ntrans)
			rpc_sleep_on(&xprt->resend, task, NULL, NULL);
		else
			rpc_sleep_on(&xprt->sending, task, NULL, NULL);
	}
	return xprt->snd_task == task;
}
コード例 #6
0
ファイル: xprt.c プロジェクト: muromec/linux-ezxdev
static void
__xprt_lock_write_next(struct rpc_xprt *xprt)
{
	struct rpc_task *task;

	if (xprt->snd_task)
		return;
	task = rpc_wake_up_next(&xprt->resend);
	if (!task) {
		if (!xprt->nocong && RPCXPRT_CONGESTED(xprt))
			return;
		task = rpc_wake_up_next(&xprt->sending);
		if (!task)
			return;
	}
	if (xprt->nocong || __xprt_get_cong(xprt, task))
		xprt->snd_task = task;
}
コード例 #7
0
ファイル: xprt.c プロジェクト: muromec/linux-ezxdev
/*
 * Serialize write access to sockets, in order to prevent different
 * requests from interfering with each other.
 * Also prevents TCP socket reconnections from colliding with writes.
 */
static int
__xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
{
	if (!xprt->snd_task) {
		if (xprt->nocong || __xprt_get_cong(xprt, task))
			xprt->snd_task = task;
	}
	if (xprt->snd_task != task) {
		dprintk("RPC: %4d TCP write queue full\n", task->tk_pid);
		task->tk_timeout = 0;
		task->tk_status = -EAGAIN;
		if (task->tk_rqstp && task->tk_rqstp->rq_nresend)
			rpc_sleep_on(&xprt->resend, task, NULL, NULL);
		else
			rpc_sleep_on(&xprt->sending, task, NULL, NULL);
	}
	return xprt->snd_task == task;
}
コード例 #8
0
ファイル: xprt.c プロジェクト: JBTech/ralink_rt5350
static void
__xprt_lock_write_next(struct rpc_xprt *xprt)
{
	struct rpc_task *task;

	if (xprt->snd_task)
		return;
	task = rpc_wake_up_next(&xprt->resend);
	if (!task) {
		if (!xprt->nocong && RPCXPRT_CONGESTED(xprt))
			return;
		task = rpc_wake_up_next(&xprt->sending);
		if (!task)
			return;
	}
	if (xprt->nocong || __xprt_get_cong(xprt, task)) {
		struct rpc_rqst *req = task->tk_rqstp;
		xprt->snd_task = task;
		if (req) {
			req->rq_bytes_sent = 0;
			req->rq_ntrans++;
		}
	}
}