Claudio Jeker(cje...@diehard.n-r-g.com) on 2020.11.03 09:09:47 +0100:
> On Wed, Oct 21, 2020 at 07:16:07PM +0200, Claudio Jeker wrote:
> > This refactors the control code a bit and removes the common var from the
> > session.h header. The session engine no longer walks the control
> > connection list. Additionally cleanup the control.c code around
> > control_dispatch_msg(). E.g. don't do double lookups of control sessions
> > by fd to close them.
> > 
> > OK?

ok


> 
> Ping
> 
> -- 
> :wq Claudio
> 
> Index: control.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/control.c,v
> retrieving revision 1.100
> diff -u -p -r1.100 control.c
> --- control.c 10 May 2020 13:38:46 -0000      1.100
> +++ control.c 21 Oct 2020 16:57:53 -0000
> @@ -29,11 +29,13 @@
>  #include "session.h"
>  #include "log.h"
>  
> +TAILQ_HEAD(ctl_conns, ctl_conn) ctl_conns = 
> TAILQ_HEAD_INITIALIZER(ctl_conns);
> +
>  #define      CONTROL_BACKLOG 5
>  
>  struct ctl_conn      *control_connbyfd(int);
>  struct ctl_conn      *control_connbypid(pid_t);
> -int           control_close(int);
> +int           control_close(struct ctl_conn *);
>  void          control_result(struct ctl_conn *, u_int);
>  ssize_t               imsg_read_nofd(struct imsgbuf *);
>  
> @@ -136,6 +138,22 @@ control_shutdown(int fd)
>       close(fd);
>  }
>  
> +size_t
> +control_fill_pfds(struct pollfd *pfd, size_t size)
> +{
> +     struct ctl_conn *ctl_conn;
> +     size_t i = 0;
> +
> +     TAILQ_FOREACH(ctl_conn, &ctl_conns, entry) {
> +             pfd[i].fd = ctl_conn->ibuf.fd;
> +             pfd[i].events = POLLIN;
> +             if (ctl_conn->ibuf.w.queued > 0)
> +                     pfd[i].events |= POLLOUT;
> +             i++;
> +     }
> +     return i;
> +}
> +
>  unsigned int
>  control_accept(int listenfd, int restricted)
>  {
> @@ -198,15 +216,8 @@ control_connbypid(pid_t pid)
>  }
>  
>  int
> -control_close(int fd)
> +control_close(struct ctl_conn *c)
>  {
> -     struct ctl_conn *c;
> -
> -     if ((c = control_connbyfd(fd)) == NULL) {
> -             log_warn("control_close: fd %d: not found", fd);
> -             return (0);
> -     }
> -
>       if (c->terminate && c->ibuf.pid)
>               imsg_ctl_rde(IMSG_CTL_TERMINATE, c->ibuf.pid, NULL, 0);
>  
> @@ -220,8 +231,7 @@ control_close(int fd)
>  }
>  
>  int
> -control_dispatch_msg(struct pollfd *pfd, u_int *ctl_cnt,
> -    struct peer_head *peers)
> +control_dispatch_msg(struct pollfd *pfd, struct peer_head *peers)
>  {
>       struct imsg              imsg;
>       struct ctl_conn         *c;
> @@ -237,10 +247,8 @@ control_dispatch_msg(struct pollfd *pfd,
>       }
>  
>       if (pfd->revents & POLLOUT) {
> -             if (msgbuf_write(&c->ibuf.w) <= 0 && errno != EAGAIN) {
> -                     *ctl_cnt -= control_close(pfd->fd);
> -                     return (1);
> -             }
> +             if (msgbuf_write(&c->ibuf.w) <= 0 && errno != EAGAIN)
> +                     return control_close(c);
>               if (c->throttled && c->ibuf.w.queued < CTL_MSG_LOW_MARK) {
>                       if (imsg_ctl_rde(IMSG_XON, c->ibuf.pid, NULL, 0) != -1)
>                               c->throttled = 0;
> @@ -251,16 +259,12 @@ control_dispatch_msg(struct pollfd *pfd,
>               return (0);
>  
>       if (((n = imsg_read_nofd(&c->ibuf)) == -1 && errno != EAGAIN) ||
> -         n == 0) {
> -             *ctl_cnt -= control_close(pfd->fd);
> -             return (1);
> -     }
> +         n == 0)
> +             return control_close(c);
>  
>       for (;;) {
> -             if ((n = imsg_get(&c->ibuf, &imsg)) == -1) {
> -                     *ctl_cnt -= control_close(pfd->fd);
> -                     return (1);
> -             }
> +             if ((n = imsg_get(&c->ibuf, &imsg)) == -1)
> +                     return control_close(c);
>  
>               if (n == 0)
>                       break;
> Index: session.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
> retrieving revision 1.402
> diff -u -p -r1.402 session.c
> --- session.c 27 Jun 2020 07:24:42 -0000      1.402
> +++ session.c 21 Oct 2020 16:49:10 -0000
> @@ -196,7 +196,6 @@ session_main(int debug, int verbose)
>       struct peer             *p, **peer_l = NULL, *next;
>       struct mrt              *m, *xm, **mrt_l = NULL;
>       struct pollfd           *pfd = NULL;
> -     struct ctl_conn         *ctl_conn;
>       struct listen_addr      *la;
>       void                    *newp;
>       time_t                   now;
> @@ -237,7 +236,6 @@ session_main(int debug, int verbose)
>               fatal(NULL);
>       imsg_init(ibuf_main, 3);
>  
> -     TAILQ_INIT(&ctl_conns);
>       LIST_INIT(&mrthead);
>       listener_cnt = 0;
>       peer_cnt = 0;
> @@ -438,13 +436,10 @@ session_main(int debug, int verbose)
>  
>               idx_mrts = i;
>  
> -             TAILQ_FOREACH(ctl_conn, &ctl_conns, entry) {
> -                     pfd[i].fd = ctl_conn->ibuf.fd;
> -                     pfd[i].events = POLLIN;
> -                     if (ctl_conn->ibuf.w.queued > 0)
> -                             pfd[i].events |= POLLOUT;
> -                     i++;
> -             }
> +             i += control_fill_pfds(pfd + i, pfd_elms -i);
> +
> +             if (i > pfd_elms)
> +                     fatalx("poll pfd overflow");
>  
>               if (pauseaccept && timeout > 1)
>                       timeout = 1;
> @@ -511,7 +506,7 @@ session_main(int debug, int verbose)
>                               mrt_write(mrt_l[j - idx_peers]);
>  
>               for (; j < i; j++)
> -                     control_dispatch_msg(&pfd[j], &ctl_cnt, &conf->peers);
> +                     ctl_cnt -= control_dispatch_msg(&pfd[j], &conf->peers);
>       }
>  
>       RB_FOREACH_SAFE(p, peer_head, &conf->peers, next) {
> Index: session.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/session.h,v
> retrieving revision 1.146
> diff -u -p -r1.146 session.h
> --- session.h 10 May 2020 13:38:46 -0000      1.146
> +++ session.h 21 Oct 2020 16:49:43 -0000
> @@ -146,8 +146,6 @@ struct ctl_conn {
>       int                     terminate;
>  };
>  
> -TAILQ_HEAD(ctl_conns, ctl_conn)      ctl_conns;
> -
>  struct peer_stats {
>       unsigned long long       msg_rcvd_open;
>       unsigned long long       msg_rcvd_update;
> @@ -260,8 +258,9 @@ int        prepare_listeners(struct bgpd_confi
>  int  control_check(char *);
>  int  control_init(int, char *);
>  int  control_listen(int);
> +size_t       control_fill_pfds(struct pollfd *, size_t);
>  void control_shutdown(int);
> -int  control_dispatch_msg(struct pollfd *, u_int *, struct peer_head *);
> +int  control_dispatch_msg(struct pollfd *, struct peer_head *);
>  unsigned int control_accept(int, int);
>  
>  /* log.c */
> 

Reply via email to