On Sat, May 06, 2023 at 11:11:25AM +0000, Klemens Nanni wrote:
> pf_osfp.c contains all the locking for these three ioctls, this removes
> the net lock from it.
> 
> All data is protected by the pf lock, new asserts verify that.
> 
> Beside the pf ioctl handler, pf_match_rule()'s call to pf_osfp_match()
> is the only hook into it.
> 
> tcpbump still compiles pf_osfp.c without object change.
> 
> Feedback? OK?

Could you document that pf_osfp_list and fp_next is protected by
pf lock?

There is nothing in pf_osfp_fingerprint() that needs pf lock directly.
The critical access is the SLIST_FOREACH in pf_osfp_find().  Place
the PF_ASSERT_LOCKED() there.

Why is pf_osfp_list passed to pf_osfp_find() and pf_osfp_find_exact()?
Can we remove the parameter and just use pf_osfp_list?

bluhm

> Index: pf_osfp.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf_osfp.c,v
> retrieving revision 1.45
> diff -u -p -r1.45 pf_osfp.c
> --- pf_osfp.c 15 Dec 2020 15:23:48 -0000      1.45
> +++ pf_osfp.c 3 May 2023 21:55:21 -0000
> @@ -60,10 +60,9 @@ typedef struct pool pool_t;
>  #define pool_put(pool, item) free(item)
>  #define pool_init(pool, size, a, ao, f, m, p)        (*(pool)) = (size)
>  
> -#define NET_LOCK()
> -#define NET_UNLOCK()
>  #define PF_LOCK()
>  #define PF_UNLOCK()
> +#define PF_ASSERT_LOCKED()
>  
>  #ifdef PFDEBUG
>  #include <sys/stdarg.h>      /* for DPFPRINTF() */
> @@ -96,6 +95,8 @@ pf_osfp_fingerprint(struct pf_pdesc *pd)
>       struct ip6_hdr  *ip6 = NULL;
>       char             hdr[60];
>  
> +     PF_ASSERT_LOCKED();
> +
>       if (pd->proto != IPPROTO_TCP)
>               return (NULL);
>  
> @@ -312,7 +313,6 @@ pf_osfp_flush(void)
>       struct pf_os_fingerprint *fp;
>       struct pf_osfp_entry *entry;
>  
> -     NET_LOCK();
>       PF_LOCK();
>       while ((fp = SLIST_FIRST(&pf_osfp_list))) {
>               SLIST_REMOVE_HEAD(&pf_osfp_list, fp_next);
> @@ -323,7 +323,6 @@ pf_osfp_flush(void)
>               pool_put(&pf_osfp_pl, fp);
>       }
>       PF_UNLOCK();
> -     NET_UNLOCK();
>  }
>  
>  
> @@ -379,14 +378,12 @@ pf_osfp_add(struct pf_osfp_ioctl *fpioc)
>               return (ENOMEM);
>       }
>  
> -     NET_LOCK();
>       PF_LOCK();
>       if ((fp = pf_osfp_find_exact(&pf_osfp_list, &fpadd))) {
>               struct pf_osfp_entry *tentry;
>  
>                SLIST_FOREACH(tentry, &fp->fp_oses, fp_entry) {
>                       if (PF_OSFP_ENTRY_EQ(tentry, &fpioc->fp_os)) {
> -                             NET_UNLOCK();
>                               PF_UNLOCK();
>                               pool_put(&pf_osfp_entry_pl, entry);
>                               pool_put(&pf_osfp_pl, fp_prealloc);
> @@ -416,7 +413,6 @@ pf_osfp_add(struct pf_osfp_ioctl *fpioc)
>  
>       SLIST_INSERT_HEAD(&fp->fp_oses, entry, fp_entry);
>       PF_UNLOCK();
> -     NET_UNLOCK();
>  
>  #ifdef PFDEBUG
>       if ((fp = pf_osfp_validate()))
> @@ -553,7 +549,6 @@ pf_osfp_get(struct pf_osfp_ioctl *fpioc)
>  
>  
>       memset(fpioc, 0, sizeof(*fpioc));
> -     NET_LOCK();
>       PF_LOCK();
>       SLIST_FOREACH(fp, &pf_osfp_list, fp_next) {
>               SLIST_FOREACH(entry, &fp->fp_oses, fp_entry) {
> @@ -568,13 +563,11 @@ pf_osfp_get(struct pf_osfp_ioctl *fpioc)
>                               memcpy(&fpioc->fp_os, entry,
>                                   sizeof(fpioc->fp_os));
>                               PF_UNLOCK();
> -                             NET_UNLOCK();
>                               return (0);
>                       }
>               }
>       }
>       PF_UNLOCK();
> -     NET_UNLOCK();
>  
>       return (EBUSY);
>  }
> @@ -585,6 +578,8 @@ struct pf_os_fingerprint *
>  pf_osfp_validate(void)
>  {
>       struct pf_os_fingerprint *f, *f2, find;
> +
> +     PF_ASSERT_LOCKED();
>  
>       SLIST_FOREACH(f, &pf_osfp_list, fp_next) {
>               memcpy(&find, f, sizeof(find));

Reply via email to