Hello,

</snip>
> 
> claudio had some questions about numbers used by the diff. some of the
> maths here is set up so that every pf state purge run is guaranteed to
> do a MINUMUM amount of work. by default pf is configured with a purge
> interfval of 10 seconds, bu the pf state purge processing runs every
> second and tries to process 1/interval (ie 1/10th) of the states. if we
> have 4 states, then 4/10 is 0, so no states would be purged. by having a
> minimum of 64 states processed every second, we guarantee this small
> number of states gets processed.
> 
> i would like to commit this diff now (at the start of h2k22) so i can
> keep an eye on it. ive been running it for a while without issues.
> 
> the obvious next step will be to remove the NET_LOCKs.

    I think this can go in as-is. I'm fine with change.
    found just small nit, but it's more a matter of personal state.
    leaving it up to David to go for it or not. Details are below.

OK sashan

> 
> Index: pf.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf.c,v
> retrieving revision 1.1141
> diff -u -p -r1.1141 pf.c
> --- pf.c      10 Oct 2022 16:43:12 -0000      1.1141
> +++ pf.c      6 Nov 2022 13:08:15 -0000

</snip>
> @@ -1559,28 +1619,38 @@ pf_purge_expired_states(u_int32_t maxche
>  
>       now = getuptime();
>  
> -     do {
> +     for (scanned = 0; scanned < limit; scanned++) {
>               uint8_t stimeout = cur->timeout;
> +             unsigned int limited = 0;
>  
>               if ((stimeout == PFTM_UNLINKED) ||
>                   (pf_state_expires(cur, stimeout) <= now)) {
>                       st = pf_state_ref(cur);
>                       SLIST_INSERT_HEAD(&gcl, st, gc_list);
> +
> +                     if (++collected >= collect)
> +                             limited = 1;
>               }

    I think we can get away without introducing a 'limited' local
    variable.

>  
>               /* don't iterate past the end of our view of the list */
>               if (cur == tail) {
> +                     scanned = limit;
>                       cur = NULL;
>                       break;
>               }
>  
>               cur = TAILQ_NEXT(cur, entry_list);
> -     } while (maxcheck--);
> +
> +             /* don't spend too much time here. */
> +             if (ISSET(READ_ONCE(curcpu()->ci_schedstate.spc_schedflags),
> +                  SPCF_SHOULDYIELD) || limited)
> +                     break;
> +     }
>  

    and of course the condition above needs to be changed to:
                     SPCF_SHOULDYIELD) || (collected >= collect))

    As I've said it's just nit.

Reply via email to