pf: add pf_release_staten and use it in pf_unlink_state

Saves one atomic op.

Reviewed by:	kp
Sponsored by:	Rubicon Communications, LLC ("Netgate")
This commit is contained in:
Mateusz Guzik 2021-06-28 14:18:43 +02:00
parent 175841285e
commit d09388d013
2 changed files with 13 additions and 5 deletions

View file

@ -1510,6 +1510,17 @@ pf_release_state(struct pf_state *s)
return (0);
}
static __inline int
pf_release_staten(struct pf_state *s, u_int n)
{
if (refcount_releasen(&s->refs, n)) {
pf_free_state(s);
return (1);
} else
return (0);
}
extern struct pf_state *pf_find_state_byid(uint64_t, uint32_t);
extern struct pf_state *pf_find_state_all(struct pf_state_key_cmp *,
u_int, int *);

View file

@ -1732,11 +1732,8 @@ pf_unlink_state(struct pf_state *s, u_int flags)
PF_HASHROW_UNLOCK(ih);
pf_detach_state(s);
/* pf_state_insert() initialises refs to 2, so we can never release the
* last reference here, only in pf_release_state(). */
(void)refcount_release(&s->refs);
return (pf_release_state(s));
/* pf_state_insert() initialises refs to 2 */
return (pf_release_staten(s, 2));
}
void