net/tls: use RCU protection on icsk->icsk_ulp_data
We need to make sure context does not get freed while diag code is interrogating it. Free struct tls_context with kfree_rcu(). We add the __rcu annotation directly in icsk, and cast it away in the datapath accessor. Presumably all ULPs will do a similar thing. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
ed6e8103ba
commit
15a7dea750
@@ -41,6 +41,7 @@
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/skmsg.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rcupdate.h>
|
||||
|
||||
#include <net/tcp.h>
|
||||
#include <net/strparser.h>
|
||||
@@ -290,6 +291,7 @@ struct tls_context {
|
||||
|
||||
struct list_head list;
|
||||
refcount_t refcount;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
enum tls_offload_ctx_dir {
|
||||
@@ -348,7 +350,7 @@ struct tls_offload_context_rx {
|
||||
#define TLS_OFFLOAD_CONTEXT_SIZE_RX \
|
||||
(sizeof(struct tls_offload_context_rx) + TLS_DRIVER_STATE_SIZE_RX)
|
||||
|
||||
void tls_ctx_free(struct tls_context *ctx);
|
||||
void tls_ctx_free(struct sock *sk, struct tls_context *ctx);
|
||||
int wait_on_pending_writer(struct sock *sk, long *timeo);
|
||||
int tls_sk_query(struct sock *sk, int optname, char __user *optval,
|
||||
int __user *optlen);
|
||||
@@ -467,7 +469,10 @@ static inline struct tls_context *tls_get_ctx(const struct sock *sk)
|
||||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
return icsk->icsk_ulp_data;
|
||||
/* Use RCU on icsk_ulp_data only for sock diag code,
|
||||
* TLS data path doesn't need rcu_dereference().
|
||||
*/
|
||||
return (__force void *)icsk->icsk_ulp_data;
|
||||
}
|
||||
|
||||
static inline void tls_advance_record_sn(struct sock *sk,
|
||||
|
Reference in New Issue
Block a user