Same logic and argument as for the parent *S ioctl, might as well have committed them together: --- Remove net lock from DIOCGETQUEUES
Both ticket and number of queues stem from the pf_queues_active list which is effectively static to pf_ioctl.c and fully protected by the pf lock. --- OK? Index: pf_ioctl.c =================================================================== RCS file: /cvs/src/sys/net/pf_ioctl.c,v retrieving revision 1.401 diff -u -p -U5 -r1.401 pf_ioctl.c --- pf_ioctl.c 28 Apr 2023 14:08:38 -0000 1.401 +++ pf_ioctl.c 28 Apr 2023 20:52:54 -0000 @@ -1229,32 +1229,28 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a case DIOCGETQUEUE: { struct pfioc_queue *pq = (struct pfioc_queue *)addr; struct pf_queuespec *qs; u_int32_t nr = 0; - NET_LOCK(); PF_LOCK(); if (pq->ticket != pf_main_ruleset.rules.active.version) { error = EBUSY; PF_UNLOCK(); - NET_UNLOCK(); goto fail; } /* save state to not run over them all each time? */ qs = TAILQ_FIRST(pf_queues_active); while ((qs != NULL) && (nr++ < pq->nr)) qs = TAILQ_NEXT(qs, entries); if (qs == NULL) { error = EBUSY; PF_UNLOCK(); - NET_UNLOCK(); goto fail; } memcpy(&pq->queue, qs, sizeof(pq->queue)); PF_UNLOCK(); - NET_UNLOCK(); break; } case DIOCGETQSTATS: { struct pfioc_qstats *pq = (struct pfioc_qstats *)addr;