Commit bbd172e3 authored by David Howells's avatar David Howells
Browse files

rxrpc: Provide kernel interface to set max lifespan on a call



Provide an interface to set max lifespan on a call from inside of the
kernel without having to call kernel_sendmsg().

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 51eba999
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1056,6 +1056,16 @@ The kernel interface functions are as follows:
     This value can be used to determine if the remote client has been
     restarted as it shouldn't change otherwise.

 (*) Set the maxmimum lifespan on a call.

	void rxrpc_kernel_set_max_life(struct socket *sock,
				       struct rxrpc_call *call,
				       unsigned long hard_timeout)

     This sets the maximum lifespan on a call to hard_timeout (which is in
     jiffies).  In the event of the timeout occurring, the call will be
     aborted and -ETIME or -ETIMEDOUT will be returned.


=======================
CONFIGURABLE PARAMETERS
+2 −0
Original line number Diff line number Diff line
@@ -68,5 +68,7 @@ u32 rxrpc_kernel_get_epoch(struct socket *, struct rxrpc_call *);
bool rxrpc_kernel_get_reply_time(struct socket *, struct rxrpc_call *,
				 ktime_t *);
bool rxrpc_kernel_call_is_complete(struct rxrpc_call *);
void rxrpc_kernel_set_max_life(struct socket *, struct rxrpc_call *,
			       unsigned long);

#endif /* _NET_RXRPC_H */
+25 −0
Original line number Diff line number Diff line
@@ -443,6 +443,31 @@ void rxrpc_kernel_new_call_notification(
}
EXPORT_SYMBOL(rxrpc_kernel_new_call_notification);

/**
 * rxrpc_kernel_set_max_life - Set maximum lifespan on a call
 * @sock: The socket the call is on
 * @call: The call to configure
 * @hard_timeout: The maximum lifespan of the call in jiffies
 *
 * Set the maximum lifespan of a call.  The call will end with ETIME or
 * ETIMEDOUT if it takes longer than this.
 */
void rxrpc_kernel_set_max_life(struct socket *sock, struct rxrpc_call *call,
			       unsigned long hard_timeout)
{
	unsigned long now;

	mutex_lock(&call->user_mutex);

	now = jiffies;
	hard_timeout += now;
	WRITE_ONCE(call->expect_term_by, hard_timeout);
	rxrpc_reduce_call_timer(call, hard_timeout, now, rxrpc_timer_set_for_hard);

	mutex_unlock(&call->user_mutex);
}
EXPORT_SYMBOL(rxrpc_kernel_set_max_life);

/*
 * connect an RxRPC socket
 * - this just targets it at a specific destination; no actual connection