Commit 5acbee46 authored by David Howells's avatar David Howells

rxrpc: Provide queuing helper functions

Provide queueing helper functions so that the queueing of local and
connection objects can be fixed later.

The issue is that a ref on the object needs to be passed to the work queue,
but the act of queueing the object may fail because the object is already
queued.  Testing the queuedness of an object before hand doesn't work
because there can be a race with someone else trying to queue it.  What
will have to be done is to adjust the refcount depending on the result of
the queue operation.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent a263629d
...@@ -35,7 +35,6 @@ struct rxrpc_crypt { ...@@ -35,7 +35,6 @@ struct rxrpc_crypt {
queue_delayed_work(rxrpc_workqueue, (WS), (D)) queue_delayed_work(rxrpc_workqueue, (WS), (D))
#define rxrpc_queue_call(CALL) rxrpc_queue_work(&(CALL)->processor) #define rxrpc_queue_call(CALL) rxrpc_queue_work(&(CALL)->processor)
#define rxrpc_queue_conn(CONN) rxrpc_queue_work(&(CONN)->processor)
struct rxrpc_connection; struct rxrpc_connection;
...@@ -566,6 +565,12 @@ static inline void rxrpc_get_connection(struct rxrpc_connection *conn) ...@@ -566,6 +565,12 @@ static inline void rxrpc_get_connection(struct rxrpc_connection *conn)
atomic_inc(&conn->usage); atomic_inc(&conn->usage);
} }
static inline void rxrpc_queue_conn(struct rxrpc_connection *conn)
{
rxrpc_queue_work(&conn->processor);
}
/* /*
* input.c * input.c
*/ */
...@@ -618,6 +623,11 @@ static inline void rxrpc_put_local(struct rxrpc_local *local) ...@@ -618,6 +623,11 @@ static inline void rxrpc_put_local(struct rxrpc_local *local)
__rxrpc_put_local(local); __rxrpc_put_local(local);
} }
static inline void rxrpc_queue_local(struct rxrpc_local *local)
{
rxrpc_queue_work(&local->processor);
}
/* /*
* misc.c * misc.c
*/ */
......
...@@ -318,7 +318,7 @@ void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb) ...@@ -318,7 +318,7 @@ void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb)
CHECK_SLAB_OKAY(&local->usage); CHECK_SLAB_OKAY(&local->usage);
skb_queue_tail(&local->reject_queue, skb); skb_queue_tail(&local->reject_queue, skb);
rxrpc_queue_work(&local->processor); rxrpc_queue_local(local);
} }
/* /*
......
...@@ -595,7 +595,7 @@ static void rxrpc_post_packet_to_local(struct rxrpc_local *local, ...@@ -595,7 +595,7 @@ static void rxrpc_post_packet_to_local(struct rxrpc_local *local,
_enter("%p,%p", local, skb); _enter("%p,%p", local, skb);
skb_queue_tail(&local->event_queue, skb); skb_queue_tail(&local->event_queue, skb);
rxrpc_queue_work(&local->processor); rxrpc_queue_local(local);
} }
/* /*
......
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