|
@@ -62,8 +62,7 @@ struct smap_psock_map_entry {
|
|
|
|
|
|
struct smap_psock {
|
|
|
struct rcu_head rcu;
|
|
|
- /* refcnt is used inside sk_callback_lock */
|
|
|
- u32 refcnt;
|
|
|
+ refcount_t refcnt;
|
|
|
|
|
|
/* datapath variables */
|
|
|
struct sk_buff_head rxqueue;
|
|
@@ -373,15 +372,13 @@ static void smap_destroy_psock(struct rcu_head *rcu)
|
|
|
|
|
|
static void smap_release_sock(struct smap_psock *psock, struct sock *sock)
|
|
|
{
|
|
|
- psock->refcnt--;
|
|
|
- if (psock->refcnt)
|
|
|
- return;
|
|
|
-
|
|
|
- tcp_cleanup_ulp(sock);
|
|
|
- smap_stop_sock(psock, sock);
|
|
|
- clear_bit(SMAP_TX_RUNNING, &psock->state);
|
|
|
- rcu_assign_sk_user_data(sock, NULL);
|
|
|
- call_rcu_sched(&psock->rcu, smap_destroy_psock);
|
|
|
+ if (refcount_dec_and_test(&psock->refcnt)) {
|
|
|
+ tcp_cleanup_ulp(sock);
|
|
|
+ smap_stop_sock(psock, sock);
|
|
|
+ clear_bit(SMAP_TX_RUNNING, &psock->state);
|
|
|
+ rcu_assign_sk_user_data(sock, NULL);
|
|
|
+ call_rcu_sched(&psock->rcu, smap_destroy_psock);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int smap_parse_func_strparser(struct strparser *strp,
|
|
@@ -511,7 +508,7 @@ static struct smap_psock *smap_init_psock(struct sock *sock,
|
|
|
INIT_WORK(&psock->tx_work, smap_tx_work);
|
|
|
INIT_WORK(&psock->gc_work, smap_gc_work);
|
|
|
INIT_LIST_HEAD(&psock->maps);
|
|
|
- psock->refcnt = 1;
|
|
|
+ refcount_set(&psock->refcnt, 1);
|
|
|
|
|
|
rcu_assign_sk_user_data(sock, psock);
|
|
|
sock_hold(sock);
|
|
@@ -772,7 +769,7 @@ static int sock_map_ctx_update_elem(struct bpf_sock_ops_kern *skops,
|
|
|
err = -EBUSY;
|
|
|
goto out_progs;
|
|
|
}
|
|
|
- psock->refcnt++;
|
|
|
+ refcount_inc(&psock->refcnt);
|
|
|
} else {
|
|
|
psock = smap_init_psock(sock, stab);
|
|
|
if (IS_ERR(psock)) {
|