On Wed, Jan 18, 2023 at 12:06:08PM +0100, Claudio Jeker wrote: > In the RDE the poll loop needs to know if any additional work is pending. > This is done calling various functions and if anyone has pending work the > timeout is reduced to 0. > > Now some of the functions will more often trigger than others. So it is > best to order them accordingly. Check for incoming and outgoing updates > first (these are most frequently true). Then nexthop_pending() since it is > cheap and finally rib_dump_pending(). > > Also try to make these functions as cheap as possible. In the case for > peer_imsg_pending() this can be done by a simple imsg_pending counter. > This way there is no need to loop over all peers.
Makes sense and readas fine. ok tb > Similar changes may be possible for other checks but they are a bit more > complicated (apart from nexthop_pending() which is already minimal). > > -- > :wq Claudio > > Index: rde.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v > retrieving revision 1.586 > diff -u -p -r1.586 rde.c > --- rde.c 16 Jan 2023 10:37:08 -0000 1.586 > +++ rde.c 18 Jan 2023 10:50:54 -0000 > @@ -248,8 +248,8 @@ rde_main(int debug, int verbose) > } > } > > - if (rib_dump_pending() || rde_update_queue_pending() || > - nexthop_pending() || peer_imsg_pending()) > + if (peer_imsg_pending() || rde_update_queue_pending() || > + nexthop_pending() || rib_dump_pending()) > timeout = 0; > > if (poll(pfd, i, timeout) == -1) { > Index: rde_peer.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde_peer.c,v > retrieving revision 1.25 > diff -u -p -r1.25 rde_peer.c > --- rde_peer.c 23 Sep 2022 15:49:20 -0000 1.25 > +++ rde_peer.c 18 Jan 2023 10:51:57 -0000 > @@ -28,6 +28,7 @@ > > struct peer_tree peertable; > struct rde_peer *peerself; > +static long imsg_pending; > > CTASSERT(sizeof(peerself->recv_eor) * 8 > AID_MAX); > CTASSERT(sizeof(peerself->sent_eor) * 8 > AID_MAX); > @@ -610,6 +611,7 @@ peer_imsg_push(struct rde_peer *peer, st > fatal(NULL); > imsg_move(&iq->imsg, imsg); > SIMPLEQ_INSERT_TAIL(&peer->imsg_queue, iq, entry); > + imsg_pending++; > } > > /* > @@ -629,29 +631,18 @@ peer_imsg_pop(struct rde_peer *peer, str > > SIMPLEQ_REMOVE_HEAD(&peer->imsg_queue, entry); > free(iq); > + imsg_pending--; > > return 1; > } > > -static void > -peer_imsg_queued(struct rde_peer *peer, void *arg) > -{ > - int *p = arg; > - > - *p = *p || !SIMPLEQ_EMPTY(&peer->imsg_queue); > -} > - > /* > * Check if any imsg are pending, return 0 if none are pending > */ > int > peer_imsg_pending(void) > { > - int pending = 0; > - > - peer_foreach(peer_imsg_queued, &pending); > - > - return pending; > + return imsg_pending != 0; > } > > /* > @@ -665,5 +656,6 @@ peer_imsg_flush(struct rde_peer *peer) > while ((iq = SIMPLEQ_FIRST(&peer->imsg_queue)) != NULL) { > SIMPLEQ_REMOVE_HEAD(&peer->imsg_queue, entry); > free(iq); > + imsg_pending--; > } > } >