X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fldp.c;h=0d4fe43dd7d152f087a3a32f43ab3e79624a87f2;hb=b0f662fe93f1db0098f7b50306c2f084644788b1;hp=96a7c36acef66e46dcd37b83b8c8076aa6247d68;hpb=6917b94f2146aa51195a6a2a1ccd8416a1d74bf3;p=vpp.git diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c index 96a7c36acef..0d4fe43dd7d 100644 --- a/src/vcl/ldp.c +++ b/src/vcl/ldp.c @@ -29,6 +29,9 @@ #include #include #include +#include +#include +#include #define HAVE_CONSTRUCTOR_ATTRIBUTE #ifdef HAVE_CONSTRUCTOR_ATTRIBUTE @@ -46,15 +49,23 @@ #define DESTRUCTOR_ATTRIBUTE #endif -typedef struct +#define LDP_MAX_NWORKERS 32 + +typedef struct ldp_fd_entry_ +{ + u32 session_index; + u32 fd; + u32 fd_index; +} ldp_fd_entry_t; + +typedef struct ldp_worker_ctx_ { - int init; - char app_name[LDP_APP_NAME_MAX]; - u32 sid_bit_val; - u32 sid_bit_mask; - u32 debug; u8 *io_buffer; clib_time_t clib_time; + + /* + * Select state + */ clib_bitmap_t *rd_bitmap; clib_bitmap_t *wr_bitmap; clib_bitmap_t *ex_bitmap; @@ -64,21 +75,44 @@ typedef struct clib_bitmap_t *libc_rd_bitmap; clib_bitmap_t *libc_wr_bitmap; clib_bitmap_t *libc_ex_bitmap; + u8 select_vcl; + + /* + * Poll state + */ vcl_poll_t *vcl_poll; struct pollfd *libc_poll; u16 *libc_poll_idxs; - u8 select_vcl; + + /* + * Epoll state + */ u8 epoll_wait_vcl; - u8 vcl_needs_real_epoll; /*< vcl needs next epoll_create to - go to libc_epoll */ int vcl_mq_epfd; +} ldp_worker_ctx_t; + +typedef struct +{ + ldp_worker_ctx_t *workers; + int init; + char app_name[LDP_APP_NAME_MAX]; + u32 sid_bit_val; + u32 sid_bit_mask; + u32 debug; + ldp_fd_entry_t *fd_pool; + clib_rwlock_t fd_table_lock; + uword *session_index_to_fd_table; + + /** vcl needs next epoll_create to go to libc_epoll */ + u8 vcl_needs_real_epoll; } ldp_main_t; + #define LDP_DEBUG ldp->debug #define LDBG(_lvl, _fmt, _args...) \ if (ldp->debug > _lvl) \ - clib_warning (_fmt, ##_args) + clib_warning ("ldp<%d>: " _fmt, getpid(), ##_args) static ldp_main_t ldp_main = { .sid_bit_val = (1 << LDP_SID_BIT_MIN), @@ -88,6 +122,12 @@ static ldp_main_t ldp_main = { static ldp_main_t *ldp = &ldp_main; +static inline ldp_worker_ctx_t * +ldp_worker_get_current (void) +{ + return (ldp->workers + vppcom_worker_index ()); +} + /* * RETURN: 0 on success or -1 on error. * */ @@ -110,31 +150,104 @@ ldp_get_app_name () return ldp->app_name; } +static int +ldp_fd_alloc (u32 sid) +{ + ldp_fd_entry_t *fde; + + clib_rwlock_writer_lock (&ldp->fd_table_lock); + if (pool_elts (ldp->fd_pool) >= (1ULL << 32) - ldp->sid_bit_val) + { + clib_rwlock_writer_unlock (&ldp->fd_table_lock); + return -1; + } + pool_get (ldp->fd_pool, fde); + fde->session_index = vppcom_session_index (sid); + fde->fd_index = fde - ldp->fd_pool; + fde->fd = fde->fd_index + ldp->sid_bit_val; + hash_set (ldp->session_index_to_fd_table, fde->session_index, fde->fd); + clib_rwlock_writer_unlock (&ldp->fd_table_lock); + return fde->fd; +} + +static ldp_fd_entry_t * +ldp_fd_entry_get_w_lock (u32 fd_index) +{ + clib_rwlock_reader_lock (&ldp->fd_table_lock); + if (pool_is_free_index (ldp->fd_pool, fd_index)) + return 0; + + return pool_elt_at_index (ldp->fd_pool, fd_index); +} + static inline int ldp_fd_from_sid (u32 sid) { - if (PREDICT_FALSE (sid >= ldp->sid_bit_val)) - return -EMFILE; - else - return (sid | ldp->sid_bit_val); + uword *fdp; + int fd; + + clib_rwlock_reader_lock (&ldp->fd_table_lock); + fdp = hash_get (ldp->session_index_to_fd_table, vppcom_session_index (sid)); + fd = fdp ? *fdp : -EMFILE; + clib_rwlock_reader_unlock (&ldp->fd_table_lock); + + return fd; } static inline int ldp_fd_is_sid (int fd) { - return ((u32) fd & ldp->sid_bit_val) ? 1 : 0; + return fd >= ldp->sid_bit_val; } static inline u32 ldp_sid_from_fd (int fd) { - return (ldp_fd_is_sid (fd) ? ((u32) fd & ldp->sid_bit_mask) : - INVALID_SESSION_ID); + u32 fd_index, session_index; + ldp_fd_entry_t *fde; + + if (!ldp_fd_is_sid (fd)) + return INVALID_SESSION_ID; + + fd_index = fd - ldp->sid_bit_val; + fde = ldp_fd_entry_get_w_lock (fd_index); + if (!fde) + { + LDBG (0, "unknown fd %d", fd); + clib_rwlock_reader_unlock (&ldp->fd_table_lock); + return INVALID_SESSION_ID; + } + session_index = fde->session_index; + clib_rwlock_reader_unlock (&ldp->fd_table_lock); + + return vppcom_session_handle (session_index); +} + +static void +ldp_fd_free_w_sid (u32 sid) +{ + ldp_fd_entry_t *fde; + u32 fd_index; + int fd; + + fd = ldp_fd_from_sid (sid); + if (!fd) + return; + + fd_index = fd - ldp->sid_bit_val; + fde = ldp_fd_entry_get_w_lock (fd_index); + if (fde) + { + hash_unset (ldp->session_index_to_fd_table, fde->session_index); + pool_put (ldp->fd_pool, fde); + } + clib_rwlock_writer_unlock (&ldp->fd_table_lock); } static inline int ldp_init (void) { + ldp_worker_ctx_t *ldpw; int rv; if (PREDICT_TRUE (ldp->init)) @@ -145,13 +258,17 @@ ldp_init (void) rv = vppcom_app_create (ldp_get_app_name ()); if (rv != VPPCOM_OK) { - fprintf (stderr, "\nLDP<%d>: ERROR: ldp_init: vppcom_app_create()" - " failed! rv = %d (%s)\n", - getpid (), rv, vppcom_retval_str (rv)); + ldp->vcl_needs_real_epoll = 0; + if (rv == VPPCOM_EEXIST) + return 0; + LDBG (2, "\nERROR: ldp_init: vppcom_app_create()" + " failed! rv = %d (%s)\n", rv, vppcom_retval_str (rv)); ldp->init = 0; return rv; } ldp->vcl_needs_real_epoll = 0; + pool_alloc (ldp->workers, LDP_MAX_NWORKERS); + ldpw = ldp_worker_get_current (); char *env_var_str = getenv (LDP_ENV_DEBUG); if (env_var_str) @@ -164,8 +281,8 @@ ldp_init (void) else { ldp->debug = tmp; - LDBG (0, "LDP<%d>: configured LDP debug level (%u) from env var " - LDP_ENV_DEBUG "!", getpid (), ldp->debug); + LDBG (0, "configured LDP debug level (%u) from env var " + LDP_ENV_DEBUG "!", ldp->debug); } } @@ -173,8 +290,8 @@ ldp_init (void) if (env_var_str) { ldp_set_app_name (env_var_str); - LDBG (0, "LDP<%d>: configured LDP app name (%s) from the env var " - LDP_ENV_APP_NAME "!", getpid (), ldp->app_name); + LDBG (0, "configured LDP app name (%s) from the env var " + LDP_ENV_APP_NAME "!", ldp->app_name); } env_var_str = getenv (LDP_ENV_SID_BIT); @@ -215,14 +332,15 @@ ldp_init (void) ldp->sid_bit_val = (1 << sb); ldp->sid_bit_mask = ldp->sid_bit_val - 1; - LDBG (0, "LDP<%d>: configured LDP sid bit (%u) from " - LDP_ENV_SID_BIT "! sid bit value %d (0x%x)", getpid (), sb, + LDBG (0, "configured LDP sid bit (%u) from " + LDP_ENV_SID_BIT "! sid bit value %d (0x%x)", sb, ldp->sid_bit_val, ldp->sid_bit_val); } } - clib_time_init (&ldp->clib_time); - LDBG (0, "LDP<%d>: LDP initialization: done!", getpid ()); + clib_time_init (&ldpw->clib_time); + clib_rwlock_init (&ldp->fd_table_lock); + LDBG (0, "LDP initialization: done!"); return 0; } @@ -230,8 +348,7 @@ ldp_init (void) int close (int fd) { - int rv; - const char *func_str; + int rv, refcnt; u32 sid = ldp_sid_from_fd (fd); if ((errno = -ldp_init ())) @@ -241,14 +358,11 @@ close (int fd) { int epfd; - func_str = "vppcom_session_attr[GET_LIBC_EPFD]"; epfd = vppcom_session_attr (sid, VPPCOM_ATTR_GET_LIBC_EPFD, 0, 0); if (epfd > 0) { - func_str = "libc_close"; - - LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): epfd %u (0x%x)", - getpid (), fd, fd, func_str, epfd, epfd); + LDBG (0, "fd %d (0x%x): calling libc_close: epfd %u (0x%x)", + fd, fd, epfd, epfd); rv = libc_close (epfd); if (rv < 0) @@ -267,44 +381,28 @@ close (int fd) goto done; } - func_str = "vppcom_session_close"; - - LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x)", - getpid (), fd, fd, func_str, sid, sid); + LDBG (0, "fd %d (0x%x): calling vppcom_session_close: sid %u (0x%x)", + fd, fd, sid, sid); + refcnt = vppcom_session_attr (sid, VPPCOM_ATTR_GET_REFCNT, 0, 0); rv = vppcom_session_close (sid); if (rv != VPPCOM_OK) { errno = -rv; rv = -1; } + if (refcnt <= 1) + ldp_fd_free_w_sid (sid); } else { - func_str = "libc_close"; - - LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s()", getpid (), fd, fd, - func_str); - + LDBG (0, "fd %d (0x%x): calling libc_close", fd, fd); rv = libc_close (fd); } done: - if (LDP_DEBUG > 0) - { - if (rv < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, rv, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, rv, rv); - } + + LDBG (1, "fd %d (0x%x): returning %d (0x%x)", fd, fd, rv, rv); return rv; } @@ -312,7 +410,6 @@ ssize_t read (int fd, void *buf, size_t nbytes) { ssize_t size; - const char *func_str; u32 sid = ldp_sid_from_fd (fd); if ((errno = -ldp_init ())) @@ -320,12 +417,8 @@ read (int fd, void *buf, size_t nbytes) if (sid != INVALID_SESSION_ID) { - func_str = "vppcom_session_read"; - - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "sid %u (0x%x), buf %p, nbytes %u", getpid (), - fd, fd, func_str, sid, sid, buf, nbytes); + LDBG (2, "fd %d (0x%x): calling vppcom_session_read(): sid %u (0x%x)," + " buf %p, nbytes %u", fd, fd, sid, sid, buf, nbytes); size = vppcom_session_read (sid, buf, nbytes); if (size < 0) @@ -336,38 +429,19 @@ read (int fd, void *buf, size_t nbytes) } else { - func_str = "libc_read"; - - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "buf %p, nbytes %u", getpid (), - fd, fd, func_str, buf, nbytes); + LDBG (2, "fd %d (0x%x): calling libc_read(): buf %p, nbytes %u", + fd, fd, buf, nbytes); size = libc_read (fd, buf, nbytes); } - if (LDP_DEBUG > 2) - { - if (size < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, size, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, size, size); - } + LDBG (2, "fd %d (0x%x): returning %d (0x%x)", fd, fd, size, size); return size; } ssize_t readv (int fd, const struct iovec * iov, int iovcnt) { - const char *func_str; ssize_t size = 0; u32 sid = ldp_sid_from_fd (fd); int rv = 0, i, total = 0; @@ -377,16 +451,13 @@ readv (int fd, const struct iovec * iov, int iovcnt) if (sid != INVALID_SESSION_ID) { - func_str = "vppcom_session_read"; do { for (i = 0; i < iovcnt; ++i) { - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s() [%d]: " - "sid %u (0x%x), iov %p, iovcnt %d, total %d", - getpid (), fd, fd, func_str, i, sid, sid, - iov, iovcnt, total); + LDBG (2, "fd %d (0x%x): calling vppcom_session_read() [%d]:" + " sid %u (0x%x), iov %p, iovcnt %d, total %d", fd, fd, i, + sid, sid, iov, iovcnt, total); rv = vppcom_session_read (sid, iov[i].iov_base, iov[i].iov_len); if (rv < 0) @@ -396,11 +467,8 @@ readv (int fd, const struct iovec * iov, int iovcnt) total += rv; if (rv < iov[i].iov_len) { - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): " - "rv (%d) < iov[%d].iov_len (%d)", - getpid (), fd, fd, rv, i, - iov[i].iov_len); + LDBG (2, "fd %d (0x%x): rv (%d) < iov[%d].iov_len (%d)", + fd, fd, rv, i, iov[i].iov_len); break; } } @@ -418,37 +486,20 @@ readv (int fd, const struct iovec * iov, int iovcnt) } else { - func_str = "libc_readv"; - - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "iov %p, iovcnt %d", getpid (), fd, fd, iov, iovcnt); + LDBG (2, "fd %d (0x%x): calling libc_readv(): iov %p, iovcnt %d", fd, + fd, iov, iovcnt); size = libc_readv (fd, iov, iovcnt); } - if (LDP_DEBUG > 2) - { - if (size < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, size, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, size, size); - } + + LDBG (2, "fd %d (0x%x): returning %d (0x%x)", fd, fd, size, size); return size; } ssize_t write (int fd, const void *buf, size_t nbytes) { - const char *func_str; ssize_t size = 0; u32 sid = ldp_sid_from_fd (fd); @@ -457,14 +508,10 @@ write (int fd, const void *buf, size_t nbytes) if (sid != INVALID_SESSION_ID) { - func_str = "vppcom_session_write"; + LDBG (2, "fd %d (0x%x): calling vppcom_session_write(): sid %u (0x%x), " + "buf %p, nbytes %u", fd, fd, sid, sid, buf, nbytes); - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "sid %u (0x%x), buf %p, nbytes %u", getpid (), - fd, fd, func_str, sid, sid, buf, nbytes); - - size = vppcom_session_write (sid, (void *) buf, nbytes); + size = vppcom_session_write_msg (sid, (void *) buf, nbytes); if (size < 0) { errno = -size; @@ -473,38 +520,19 @@ write (int fd, const void *buf, size_t nbytes) } else { - func_str = "libc_write"; - - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "buf %p, nbytes %u", getpid (), - fd, fd, func_str, buf, nbytes); + LDBG (2, "fd %d (0x%x): calling libc_write(): buf %p, nbytes %u", + fd, fd, buf, nbytes); size = libc_write (fd, buf, nbytes); } - if (LDP_DEBUG > 2) - { - if (size < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, size, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, size, size); - } + LDBG (2, "fd %d (0x%x): returning %d (0x%x)", fd, fd, size, size); return size; } ssize_t writev (int fd, const struct iovec * iov, int iovcnt) { - const char *func_str; ssize_t size = 0, total = 0; u32 sid = ldp_sid_from_fd (fd); int i, rv = 0; @@ -518,33 +546,19 @@ writev (int fd, const struct iovec * iov, int iovcnt) if (sid != INVALID_SESSION_ID) { - func_str = "vppcom_session_write"; do { for (i = 0; i < iovcnt; ++i) { - if (LDP_DEBUG > 4) - printf ("%s:%d: LDP<%d>: fd %d (0x%x): calling %s() [%d]: " - "sid %u (0x%x), buf %p, nbytes %ld, total %ld", - __func__, __LINE__, getpid (), fd, fd, func_str, - i, sid, sid, iov[i].iov_base, iov[i].iov_len, total); - - rv = vppcom_session_write (sid, iov[i].iov_base, - iov[i].iov_len); + rv = vppcom_session_write_msg (sid, iov[i].iov_base, + iov[i].iov_len); if (rv < 0) break; else { total += rv; if (rv < iov[i].iov_len) - { - if (LDP_DEBUG > 4) - printf ("%s:%d: LDP<%d>: fd %d (0x%x): " - "rv (%d) < iov[%d].iov_len (%ld)", - __func__, __LINE__, getpid (), fd, fd, - rv, i, iov[i].iov_len); - break; - } + break; } } } @@ -560,32 +574,9 @@ writev (int fd, const struct iovec * iov, int iovcnt) } else { - func_str = "libc_writev"; - - if (LDP_DEBUG > 4) - printf ("%s:%d: LDP<%d>: fd %d (0x%x): calling %s(): " - "iov %p, iovcnt %d\n", __func__, __LINE__, getpid (), - fd, fd, func_str, iov, iovcnt); - size = libc_writev (fd, iov, iovcnt); } - if (LDP_DEBUG > 4) - { - if (size < 0) - { - int errno_val = errno; - perror (func_str); - fprintf (stderr, - "%s:%d: LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %ld, errno = %d\n", __func__, __LINE__, getpid (), fd, - fd, func_str, size, errno_val); - errno = errno_val; - } - else - printf ("%s:%d: LDP<%d>: fd %d (0x%x): returning %ld\n", - __func__, __LINE__, getpid (), fd, fd, size); - } return size; } @@ -612,36 +603,35 @@ fcntl (int fd, int cmd, ...) { case F_SETFL: func_str = "vppcom_session_attr[SET_FLAGS]"; - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "sid %u (0x%x) flags %d (0x%x), size %d", - getpid (), fd, fd, func_str, sid, sid, - flags, flags, size); + LDBG (2, "fd %d (0x%x): calling %s(): sid %u (0x%x) " + "flags %d (0x%x), size %d", fd, fd, func_str, sid, + sid, flags, flags, size); - rv = - vppcom_session_attr (sid, VPPCOM_ATTR_SET_FLAGS, &flags, &size); + rv = vppcom_session_attr (sid, VPPCOM_ATTR_SET_FLAGS, &flags, + &size); break; case F_GETFL: func_str = "vppcom_session_attr[GET_FLAGS]"; - if (LDP_DEBUG > 2) - clib_warning - ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), " - "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid, - sid, flags, flags, size); + LDBG (2, "fd %d (0x%x): calling %s(): sid %u (0x%x), " + "flags %d (0x%x), size %d", fd, fd, func_str, sid, + sid, flags, flags, size); - rv = - vppcom_session_attr (sid, VPPCOM_ATTR_GET_FLAGS, &flags, &size); + rv = vppcom_session_attr (sid, VPPCOM_ATTR_GET_FLAGS, &flags, + &size); if (rv == VPPCOM_OK) { - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x), cmd %d (F_GETFL): " - "%s() returned flags %d (0x%x)", - getpid (), fd, fd, cmd, func_str, flags, flags); + LDBG (2, "fd %d (0x%x), cmd %d (F_GETFL): %s() " + "returned flags %d (0x%x)", fd, fd, cmd, + func_str, flags, flags); rv = flags; } break; - + case F_SETFD: + /* TODO handle this */ + LDBG (0, "F_SETFD ignored flags %u", flags); + rv = 0; + break; default: rv = -EOPNOTSUPP; break; @@ -656,9 +646,7 @@ fcntl (int fd, int cmd, ...) { func_str = "libc_vfcntl"; - if (LDP_DEBUG > 2) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): cmd %d", - getpid (), fd, fd, func_str, cmd); + LDBG (2, "fd %d (0x%x): calling %s(): cmd %d", fd, fd, func_str, cmd); rv = libc_vfcntl (fd, cmd, ap); } @@ -777,13 +765,12 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, const struct timespec *__restrict timeout, const __sigset_t * __restrict sigmask) { - int rv; + uword sid_bits, sid_bits_set, libc_bits, libc_bits_set; + ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); + u32 minbits = clib_max (nfds, BITS (uword)), sid; char *func_str = "##"; f64 time_out; - int fd; - uword sid_bits, sid_bits_set, libc_bits, libc_bits_set; - u32 minbits = clib_max (nfds, BITS (uword)); - u32 sid; + int rv, fd; if (nfds < 0) { @@ -800,12 +787,10 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, /* select as fine grained sleep */ if (!nfds) { - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: sleeping for %.02f seconds", - getpid (), time_out); + LDBG (3, "sleeping for %.02f seconds", time_out); - time_out += clib_time_now (&ldp->clib_time); - while (clib_time_now (&ldp->clib_time) < time_out) + time_out += clib_time_now (&ldpw->clib_time); + while (clib_time_now (&ldpw->clib_time) < time_out) ; return 0; } @@ -823,11 +808,9 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, { func_str = "libc_pselect"; - if (LDP_DEBUG > 3) - clib_warning - ("LDP<%d>: calling %s(): nfds %d, readfds %p, writefds %p, " - "exceptfds %p, timeout %p, sigmask %p", getpid (), func_str, nfds, - readfds, writefds, exceptfds, timeout, sigmask); + LDBG (3, "calling %s(): nfds %d, readfds %p, writefds %p, " + "exceptfds %p, timeout %p, sigmask %p", func_str, nfds, + readfds, writefds, exceptfds, timeout, sigmask); rv = libc_pselect (nfds, readfds, writefds, exceptfds, timeout, sigmask); @@ -845,107 +828,102 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, } sid_bits = libc_bits = 0; + u32 n_bytes = nfds / 8 + ((nfds % 8) ? 1 : 0); if (readfds) { - clib_bitmap_validate (ldp->sid_rd_bitmap, minbits); - clib_bitmap_validate (ldp->libc_rd_bitmap, minbits); - clib_bitmap_validate (ldp->rd_bitmap, minbits); - clib_memcpy (ldp->rd_bitmap, readfds, - vec_len (ldp->rd_bitmap) * sizeof (clib_bitmap_t)); - FD_ZERO (readfds); + clib_bitmap_validate (ldpw->sid_rd_bitmap, minbits); + clib_bitmap_validate (ldpw->libc_rd_bitmap, minbits); + clib_bitmap_validate (ldpw->rd_bitmap, minbits); + clib_memcpy_fast (ldpw->rd_bitmap, readfds, n_bytes); + memset (readfds, 0, n_bytes); /* *INDENT-OFF* */ - clib_bitmap_foreach (fd, ldp->rd_bitmap, - ({ - sid = ldp_sid_from_fd (fd); - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: readfds: fd %d (0x%x), sid %u (0x%x)", - getpid (), fd, fd, sid, sid); - if (sid == INVALID_SESSION_ID) - clib_bitmap_set_no_check (ldp->libc_rd_bitmap, fd, 1); - else - clib_bitmap_set_no_check (ldp->sid_rd_bitmap, sid, 1); - })); + clib_bitmap_foreach (fd, ldpw->rd_bitmap, ({ + if (fd > nfds) + break; + sid = ldp_sid_from_fd (fd); + LDBG (3, "readfds: fd %d (0x%x), sid %u (0x%x)", fd, fd, sid, sid); + if (sid == INVALID_SESSION_ID) + clib_bitmap_set_no_check (ldpw->libc_rd_bitmap, fd, 1); + else + clib_bitmap_set_no_check (ldpw->sid_rd_bitmap, + vppcom_session_index (sid), 1); + })); /* *INDENT-ON* */ - sid_bits_set = clib_bitmap_last_set (ldp->sid_rd_bitmap) + 1; + sid_bits_set = clib_bitmap_last_set (ldpw->sid_rd_bitmap) + 1; sid_bits = (sid_bits_set > sid_bits) ? sid_bits_set : sid_bits; - libc_bits_set = clib_bitmap_last_set (ldp->libc_rd_bitmap) + 1; + libc_bits_set = clib_bitmap_last_set (ldpw->libc_rd_bitmap) + 1; libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits; - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: readfds: sid_bits_set %d, sid_bits %d, " - "libc_bits_set %d, libc_bits %d", getpid (), - sid_bits_set, sid_bits, libc_bits_set, libc_bits); + LDBG (3, "readfds: sid_bits_set %d, sid_bits %d, " + "libc_bits_set %d, libc_bits %d", sid_bits_set, + sid_bits, libc_bits_set, libc_bits); } if (writefds) { - clib_bitmap_validate (ldp->sid_wr_bitmap, minbits); - clib_bitmap_validate (ldp->libc_wr_bitmap, minbits); - clib_bitmap_validate (ldp->wr_bitmap, minbits); - clib_memcpy (ldp->wr_bitmap, writefds, - vec_len (ldp->wr_bitmap) * sizeof (clib_bitmap_t)); - FD_ZERO (writefds); + clib_bitmap_validate (ldpw->sid_wr_bitmap, minbits); + clib_bitmap_validate (ldpw->libc_wr_bitmap, minbits); + clib_bitmap_validate (ldpw->wr_bitmap, minbits); + clib_memcpy_fast (ldpw->wr_bitmap, writefds, n_bytes); + memset (writefds, 0, n_bytes); /* *INDENT-OFF* */ - clib_bitmap_foreach (fd, ldp->wr_bitmap, - ({ - sid = ldp_sid_from_fd (fd); - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: writefds: fd %d (0x%x), sid %u (0x%x)", - getpid (), fd, fd, sid, sid); - if (sid == INVALID_SESSION_ID) - clib_bitmap_set_no_check (ldp->libc_wr_bitmap, fd, 1); - else - clib_bitmap_set_no_check (ldp->sid_wr_bitmap, sid, 1); - })); + clib_bitmap_foreach (fd, ldpw->wr_bitmap, ({ + if (fd > nfds) + break; + sid = ldp_sid_from_fd (fd); + LDBG (3, "writefds: fd %d (0x%x), sid %u (0x%x)", fd, fd, sid, sid); + if (sid == INVALID_SESSION_ID) + clib_bitmap_set_no_check (ldpw->libc_wr_bitmap, fd, 1); + else + clib_bitmap_set_no_check (ldpw->sid_wr_bitmap, + vppcom_session_index (sid), 1); + })); /* *INDENT-ON* */ - sid_bits_set = clib_bitmap_last_set (ldp->sid_wr_bitmap) + 1; + sid_bits_set = clib_bitmap_last_set (ldpw->sid_wr_bitmap) + 1; sid_bits = (sid_bits_set > sid_bits) ? sid_bits_set : sid_bits; - libc_bits_set = clib_bitmap_last_set (ldp->libc_wr_bitmap) + 1; + libc_bits_set = clib_bitmap_last_set (ldpw->libc_wr_bitmap) + 1; libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits; - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: writefds: sid_bits_set %d, sid_bits %d, " - "libc_bits_set %d, libc_bits %d", getpid (), - sid_bits_set, sid_bits, libc_bits_set, libc_bits); + LDBG (3, "writefds: sid_bits_set %d, sid_bits %d, " + "libc_bits_set %d, libc_bits %d", + sid_bits_set, sid_bits, libc_bits_set, libc_bits); } if (exceptfds) { - clib_bitmap_validate (ldp->sid_ex_bitmap, minbits); - clib_bitmap_validate (ldp->libc_ex_bitmap, minbits); - clib_bitmap_validate (ldp->ex_bitmap, minbits); - clib_memcpy (ldp->ex_bitmap, exceptfds, - vec_len (ldp->ex_bitmap) * sizeof (clib_bitmap_t)); - FD_ZERO (exceptfds); + clib_bitmap_validate (ldpw->sid_ex_bitmap, minbits); + clib_bitmap_validate (ldpw->libc_ex_bitmap, minbits); + clib_bitmap_validate (ldpw->ex_bitmap, minbits); + clib_memcpy_fast (ldpw->ex_bitmap, exceptfds, n_bytes); + memset (exceptfds, 0, n_bytes); /* *INDENT-OFF* */ - clib_bitmap_foreach (fd, ldp->ex_bitmap, - ({ - sid = ldp_sid_from_fd (fd); - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: exceptfds: fd %d (0x%x), sid %u (0x%x)", - getpid (), fd, fd, sid, sid); - if (sid == INVALID_SESSION_ID) - clib_bitmap_set_no_check (ldp->libc_ex_bitmap, fd, 1); - else - clib_bitmap_set_no_check (ldp->sid_ex_bitmap, sid, 1); - })); + clib_bitmap_foreach (fd, ldpw->ex_bitmap, ({ + if (fd > nfds) + break; + sid = ldp_sid_from_fd (fd); + LDBG (3, "exceptfds: fd %d (0x%x), sid %u (0x%x)", fd, fd, sid, sid); + if (sid == INVALID_SESSION_ID) + clib_bitmap_set_no_check (ldpw->libc_ex_bitmap, fd, 1); + else + clib_bitmap_set_no_check (ldpw->sid_ex_bitmap, + vppcom_session_index (sid), 1); + })); /* *INDENT-ON* */ - sid_bits_set = clib_bitmap_last_set (ldp->sid_ex_bitmap) + 1; + sid_bits_set = clib_bitmap_last_set (ldpw->sid_ex_bitmap) + 1; sid_bits = (sid_bits_set > sid_bits) ? sid_bits_set : sid_bits; - libc_bits_set = clib_bitmap_last_set (ldp->libc_ex_bitmap) + 1; + libc_bits_set = clib_bitmap_last_set (ldpw->libc_ex_bitmap) + 1; libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits; - if (LDP_DEBUG > 3) - clib_warning ("LDP<%d>: exceptfds: sid_bits_set %d, sid_bits %d, " - "libc_bits_set %d, libc_bits %d", getpid (), - sid_bits_set, sid_bits, libc_bits_set, libc_bits); + LDBG (3, "exceptfds: sid_bits_set %d, sid_bits %d, " + "libc_bits_set %d, libc_bits %d", + sid_bits_set, sid_bits, libc_bits_set, libc_bits); } if (PREDICT_FALSE (!sid_bits && !libc_bits)) @@ -959,27 +937,27 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, { if (sid_bits) { - if (!ldp->select_vcl) + if (!ldpw->select_vcl) { func_str = "vppcom_select"; if (readfds) - clib_memcpy (ldp->rd_bitmap, ldp->sid_rd_bitmap, - vec_len (ldp->rd_bitmap) * - sizeof (clib_bitmap_t)); + clib_memcpy_fast (ldpw->rd_bitmap, ldpw->sid_rd_bitmap, + vec_len (ldpw->rd_bitmap) * + sizeof (clib_bitmap_t)); if (writefds) - clib_memcpy (ldp->wr_bitmap, ldp->sid_wr_bitmap, - vec_len (ldp->wr_bitmap) * - sizeof (clib_bitmap_t)); + clib_memcpy_fast (ldpw->wr_bitmap, ldpw->sid_wr_bitmap, + vec_len (ldpw->wr_bitmap) * + sizeof (clib_bitmap_t)); if (exceptfds) - clib_memcpy (ldp->ex_bitmap, ldp->sid_ex_bitmap, - vec_len (ldp->ex_bitmap) * - sizeof (clib_bitmap_t)); + clib_memcpy_fast (ldpw->ex_bitmap, ldpw->sid_ex_bitmap, + vec_len (ldpw->ex_bitmap) * + sizeof (clib_bitmap_t)); rv = vppcom_select (sid_bits, - readfds ? ldp->rd_bitmap : NULL, - writefds ? ldp->wr_bitmap : NULL, - exceptfds ? ldp->ex_bitmap : NULL, 0); + readfds ? ldpw->rd_bitmap : NULL, + writefds ? ldpw->wr_bitmap : NULL, + exceptfds ? ldpw->ex_bitmap : NULL, 0); if (rv < 0) { errno = -rv; @@ -990,9 +968,9 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, if (readfds) { /* *INDENT-OFF* */ - clib_bitmap_foreach (sid, ldp->rd_bitmap, + clib_bitmap_foreach (sid, ldpw->rd_bitmap, ({ - fd = ldp_fd_from_sid (sid); + fd = ldp_fd_from_sid (vppcom_session_handle (sid)); if (PREDICT_FALSE (fd < 0)) { errno = EBADFD; @@ -1006,9 +984,9 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, if (writefds) { /* *INDENT-OFF* */ - clib_bitmap_foreach (sid, ldp->wr_bitmap, + clib_bitmap_foreach (sid, ldpw->wr_bitmap, ({ - fd = ldp_fd_from_sid (sid); + fd = ldp_fd_from_sid (vppcom_session_handle (sid)); if (PREDICT_FALSE (fd < 0)) { errno = EBADFD; @@ -1022,9 +1000,9 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, if (exceptfds) { /* *INDENT-OFF* */ - clib_bitmap_foreach (sid, ldp->ex_bitmap, + clib_bitmap_foreach (sid, ldpw->ex_bitmap, ({ - fd = ldp_fd_from_sid (sid); + fd = ldp_fd_from_sid (vppcom_session_handle (sid)); if (PREDICT_FALSE (fd < 0)) { errno = EBADFD; @@ -1035,12 +1013,12 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, })); /* *INDENT-ON* */ } - ldp->select_vcl = 1; + ldpw->select_vcl = 1; goto done; } } else - ldp->select_vcl = 0; + ldpw->select_vcl = 0; } if (libc_bits) { @@ -1049,14 +1027,17 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, func_str = "libc_pselect"; if (readfds) - clib_memcpy (readfds, ldp->libc_rd_bitmap, - vec_len (ldp->rd_bitmap) * sizeof (clib_bitmap_t)); + clib_memcpy_fast (readfds, ldpw->libc_rd_bitmap, + vec_len (ldpw->rd_bitmap) * + sizeof (clib_bitmap_t)); if (writefds) - clib_memcpy (writefds, ldp->libc_wr_bitmap, - vec_len (ldp->wr_bitmap) * sizeof (clib_bitmap_t)); + clib_memcpy_fast (writefds, ldpw->libc_wr_bitmap, + vec_len (ldpw->wr_bitmap) * + sizeof (clib_bitmap_t)); if (exceptfds) - clib_memcpy (exceptfds, ldp->libc_ex_bitmap, - vec_len (ldp->ex_bitmap) * sizeof (clib_bitmap_t)); + clib_memcpy_fast (exceptfds, ldpw->libc_ex_bitmap, + vec_len (ldpw->ex_bitmap) * + sizeof (clib_bitmap_t)); tspec.tv_sec = tspec.tv_nsec = 0; rv = libc_pselect (libc_bits, readfds ? readfds : NULL, @@ -1066,20 +1047,20 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, goto done; } } - while ((time_out == -1) || (clib_time_now (&ldp->clib_time) < time_out)); + while ((time_out == -1) || (clib_time_now (&ldpw->clib_time) < time_out)); rv = 0; done: /* TBD: set timeout to amount of time left */ - vec_reset_length (ldp->rd_bitmap); - vec_reset_length (ldp->sid_rd_bitmap); - vec_reset_length (ldp->libc_rd_bitmap); - vec_reset_length (ldp->wr_bitmap); - vec_reset_length (ldp->sid_wr_bitmap); - vec_reset_length (ldp->libc_wr_bitmap); - vec_reset_length (ldp->ex_bitmap); - vec_reset_length (ldp->sid_ex_bitmap); - vec_reset_length (ldp->libc_ex_bitmap); + clib_bitmap_zero (ldpw->rd_bitmap); + clib_bitmap_zero (ldpw->sid_rd_bitmap); + clib_bitmap_zero (ldpw->libc_rd_bitmap); + clib_bitmap_zero (ldpw->wr_bitmap); + clib_bitmap_zero (ldpw->sid_wr_bitmap); + clib_bitmap_zero (ldpw->libc_wr_bitmap); + clib_bitmap_zero (ldpw->ex_bitmap); + clib_bitmap_zero (ldpw->sid_ex_bitmap); + clib_bitmap_zero (ldpw->libc_ex_bitmap); if (LDP_DEBUG > 3) { @@ -1146,9 +1127,8 @@ socket (int domain, int type, int protocol) func_str = "vppcom_session_create"; - LDBG (0, "LDP<%d>: : calling %s(): proto %u (%s), is_nonblocking %u", - getpid (), func_str, proto, vppcom_proto_str (proto), - is_nonblocking); + LDBG (0, "calling %s(): proto %u (%s), is_nonblocking %u", + func_str, proto, vppcom_proto_str (proto), is_nonblocking); sid = vppcom_session_create (proto, is_nonblocking); if (sid < 0) @@ -1159,7 +1139,7 @@ socket (int domain, int type, int protocol) else { func_str = "ldp_fd_from_sid"; - rv = ldp_fd_from_sid (sid); + rv = ldp_fd_alloc (sid); if (rv < 0) { (void) vppcom_session_close (sid); @@ -1172,7 +1152,7 @@ socket (int domain, int type, int protocol) { func_str = "libc_socket"; - LDBG (0, "LDP<%d>: : calling %s()", getpid (), func_str); + LDBG (0, "calling %s()", func_str); rv = libc_socket (domain, type, protocol); } @@ -1189,7 +1169,7 @@ socket (int domain, int type, int protocol) errno = errno_val; } else - clib_warning ("LDP<%d>: : returning fd %d (0x%x)", getpid (), rv, rv); + clib_warning ("returning fd %d (0x%x)", getpid (), rv, rv); } return rv; } @@ -1224,10 +1204,9 @@ socketpair (int domain, int type, int protocol, int fds[2]) { func_str = "libc_socket"; - if (LDP_DEBUG > 1) - clib_warning ("LDP<%d>: : calling %s()", getpid (), func_str); + LDBG (1, "calling %s()", func_str); - rv = libc_socket (domain, type, protocol); + rv = libc_socketpair (domain, type, protocol, fds); } if (LDP_DEBUG > 1) @@ -1251,7 +1230,6 @@ int bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { int rv; - const char *func_str; u32 sid = ldp_sid_from_fd (fd); if ((errno = -ldp_init ())) @@ -1261,8 +1239,6 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { vppcom_endpt_t ep; - func_str = "vppcom_session_bind"; - switch (addr->sa_family) { case AF_INET: @@ -1303,10 +1279,8 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) rv = -1; goto done; } - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), " - "addr %p, len %u", - getpid (), fd, fd, func_str, sid, sid, addr, len); + LDBG (0, "fd %d (0x%x): calling vppcom_session_bind(): " + "sid %u (0x%x), addr %p, len %u", fd, fd, sid, sid, addr, len); rv = vppcom_session_bind (sid, &ep); if (rv != VPPCOM_OK) @@ -1317,32 +1291,15 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) } else { - func_str = "libc_bind"; - - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "addr %p, len %u", - getpid (), fd, fd, func_str, addr, len); + LDBG (0, "fd %d (0x%x): calling libc_bind(): addr %p, len %u", + fd, fd, addr, len); rv = libc_bind (fd, addr, len); } done: - if (LDP_DEBUG > 0) - { - if (rv < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, rv, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, rv, rv); - } + LDBG (1, "fd %d (0x%x): returning %d", fd, fd, rv); + return rv; } @@ -1466,7 +1423,6 @@ int connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { int rv; - const char *func_str = __func__; u32 sid = ldp_sid_from_fd (fd); if ((errno = -ldp_init ())) @@ -1485,8 +1441,6 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { vppcom_endpt_t ep; - func_str = "vppcom_session_connect"; - switch (addr->sa_family) { case AF_INET: @@ -1527,10 +1481,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) rv = -1; goto done; } - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x) " - "addr %p len %u", - getpid (), fd, fd, func_str, sid, sid, addr, len); + LDBG (0, "fd %d (0x%x): calling vppcom_session_connect(): sid %u (0x%x)" + " addr %p len %u", fd, fd, sid, sid, addr, len); rv = vppcom_session_connect (sid, &ep); if (rv != VPPCOM_OK) @@ -1541,32 +1493,14 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) } else { - func_str = "libc_connect"; - - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): " - "addr %p, len %u", - getpid (), fd, fd, func_str, addr, len); + LDBG (0, "fd %d (0x%x): calling libc_connect(): addr %p, len %u", + fd, fd, addr, len); rv = libc_connect (fd, addr, len); } done: - if (LDP_DEBUG > 0) - { - if (rv < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, rv, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, rv, rv); - } + LDBG (1, "fd %d (0x%x): returning %d (0x%x)", fd, fd, rv, rv); return rv; } @@ -1700,6 +1634,7 @@ send (int fd, const void *buf, size_t n, int flags) ssize_t sendfile (int out_fd, int in_fd, off_t * offset, size_t len) { + ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); ssize_t size = 0; const char *func_str; u32 sid = ldp_sid_from_fd (out_fd); @@ -1728,7 +1663,7 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) out_fd, out_fd, func_str, sid, sid, rv, vppcom_retval_str (rv)); - vec_reset_length (ldp->io_buffer); + vec_reset_length (ldpw->io_buffer); errno = -rv; size = -1; goto done; @@ -1764,7 +1699,7 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) ("LDP<%d>: ERROR: fd %d (0x%x): %s(): sid %u (0x%x), " "returned %d (%s)!", getpid (), out_fd, out_fd, func_str, sid, sid, size, vppcom_retval_str (size)); - vec_reset_length (ldp->io_buffer); + vec_reset_length (ldpw->io_buffer); errno = -size; size = -1; goto done; @@ -1796,8 +1731,8 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) continue; } bytes_to_read = clib_min (n_bytes_left, bytes_to_read); - vec_validate (ldp->io_buffer, bytes_to_read); - nbytes = libc_read (in_fd, ldp->io_buffer, bytes_to_read); + vec_validate (ldpw->io_buffer, bytes_to_read); + nbytes = libc_read (in_fd, ldpw->io_buffer, bytes_to_read); if (nbytes < 0) { func_str = "libc_read"; @@ -1805,13 +1740,13 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s(): in_fd (%d), " "io_buffer %p, bytes_to_read %lu, rv %d, " "errno %d", getpid (), out_fd, out_fd, func_str, - in_fd, ldp->io_buffer, bytes_to_read, nbytes, + in_fd, ldpw->io_buffer, bytes_to_read, nbytes, errno_val); errno = errno_val; if (results == 0) { - vec_reset_length (ldp->io_buffer); + vec_reset_length (ldpw->io_buffer); size = -1; goto done; } @@ -1822,10 +1757,10 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), " "buf %p, nbytes %u: results %d, n_bytes_left %d", getpid (), - out_fd, out_fd, func_str, sid, sid, ldp->io_buffer, nbytes, + out_fd, out_fd, func_str, sid, sid, ldpw->io_buffer, nbytes, results, n_bytes_left); - size = vppcom_session_write (sid, ldp->io_buffer, nbytes); + size = vppcom_session_write (sid, ldpw->io_buffer, nbytes); if (size < 0) { if (size == VPPCOM_EAGAIN) @@ -1851,12 +1786,12 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) "sid %u, io_buffer %p, nbytes %u " "returned %d (%s)", getpid (), out_fd, out_fd, func_str, - sid, ldp->io_buffer, nbytes, + sid, ldpw->io_buffer, nbytes, size, vppcom_retval_str (size)); } if (results == 0) { - vec_reset_length (ldp->io_buffer); + vec_reset_length (ldpw->io_buffer); errno = -size; size = -1; goto done; @@ -1871,7 +1806,7 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) while (n_bytes_left > 0); update_offset: - vec_reset_length (ldp->io_buffer); + vec_reset_length (ldpw->io_buffer); if (offset) { off_t off = lseek (in_fd, *offset, SEEK_SET); @@ -2747,7 +2682,6 @@ int listen (int fd, int n) { int rv; - const char *func_str; u32 sid = ldp_sid_from_fd (fd); if ((errno = -ldp_init ())) @@ -2755,10 +2689,8 @@ listen (int fd, int n) if (sid != INVALID_SESSION_ID) { - func_str = "vppcom_session_listen"; - - LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), n %d", - getpid (), fd, fd, func_str, sid, sid, n); + LDBG (0, "fd %d (0x%x): calling vppcom_session_listen():" + " sid %u (0x%x), n %d", fd, fd, sid, sid, n); rv = vppcom_session_listen (sid, n); if (rv != VPPCOM_OK) @@ -2769,29 +2701,12 @@ listen (int fd, int n) } else { - func_str = "libc_listen"; - - LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): n %d", getpid (), fd, - fd, func_str, n); + LDBG (0, "fd %d (0x%x): calling libc_listen(): n %d", fd, fd, n); rv = libc_listen (fd, n); } - if (LDP_DEBUG > 0) - { - if (rv < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), fd, fd, - func_str, rv, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: fd %d (0x%x): returning %d (0x%x)", - getpid (), fd, fd, rv, rv); - } + LDBG (1, "fd %d (0x%x): returning %d (0x%x)", fd, fd, rv, rv); return rv; } @@ -2800,7 +2715,6 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, socklen_t * __restrict addr_len, int flags) { int rv; - const char *func_str; u32 listen_sid = ldp_sid_from_fd (listen_fd); int accept_sid; @@ -2814,13 +2728,9 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, memset (&ep, 0, sizeof (ep)); ep.ip = src_addr; - func_str = "vppcom_session_accept"; - - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: listen fd %d (0x%x): calling %s(): " - "listen sid %u (0x%x), ep %p, flags 0x%x", - getpid (), listen_fd, listen_fd, func_str, - listen_sid, listen_sid, ep, flags); + LDBG (0, "listen fd %d (0x%x): calling vppcom_session_accept:" + " listen sid %u (0x%x), ep %p, flags 0x%x", listen_fd, + listen_fd, listen_sid, listen_sid, ep, flags); accept_sid = vppcom_session_accept (listen_sid, &ep, flags); if (accept_sid < 0) @@ -2839,13 +2749,7 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, } else { - func_str = "ldp_fd_from_sid"; - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: listen fd %d (0x%x): calling %s(): " - "accept sid %u (0x%x), ep %p, flags 0x%x", - getpid (), listen_fd, listen_fd, - func_str, accept_sid, accept_sid, ep, flags); - rv = ldp_fd_from_sid ((u32) accept_sid); + rv = ldp_fd_alloc ((u32) accept_sid); if (rv < 0) { (void) vppcom_session_close ((u32) accept_sid); @@ -2857,32 +2761,16 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, } else { - func_str = "libc_accept4"; - - if (LDP_DEBUG > 0) - clib_warning ("LDP<%d>: listen fd %d (0x%x): calling %s(): " - "addr %p, addr_len %p, flags 0x%x", - getpid (), listen_fd, listen_fd, func_str, - addr, addr_len, flags); + LDBG (0, "listen fd %d (0x%x): calling libc_accept4(): " + "addr %p, addr_len %p, flags 0x%x", listen_fd, + listen_fd, addr, addr_len, flags); rv = libc_accept4 (listen_fd, addr, addr_len, flags); } - if (LDP_DEBUG > 0) - { - if (rv < 0) - { - int errno_val = errno; - perror (func_str); - clib_warning ("LDP<%d>: ERROR: listen fd %d (0x%x): %s() failed! " - "rv %d, errno = %d", getpid (), listen_fd, - listen_fd, func_str, rv, errno_val); - errno = errno_val; - } - else - clib_warning ("LDP<%d>: listen fd %d (0x%x): returning %d (0x%x)", - getpid (), listen_fd, listen_fd, rv, rv); - } + LDBG (1, "listen fd %d (0x%x): returning %d (0x%x)", listen_fd, listen_fd, + rv, rv); + return rv; } @@ -2946,6 +2834,7 @@ shutdown (int fd, int how) int epoll_create1 (int flags) { + ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); const char *func_str; int rv; @@ -2956,13 +2845,13 @@ epoll_create1 (int flags) { rv = libc_epoll_create1 (flags); ldp->vcl_needs_real_epoll = 0; - ldp->vcl_mq_epfd = rv; - LDBG (0, "LDP<%d>: created vcl epfd %u", getpid (), rv); + ldpw->vcl_mq_epfd = rv; + LDBG (0, "created vcl epfd %u", rv); return rv; } func_str = "vppcom_epoll_create"; - LDBG (1, "LDP<%d>: calling %s()", getpid (), func_str); + LDBG (1, "calling %s()", func_str); rv = vppcom_epoll_create (); @@ -2972,7 +2861,7 @@ epoll_create1 (int flags) rv = -1; } else - rv = ldp_fd_from_sid ((u32) rv); + rv = ldp_fd_alloc ((u32) rv); if (LDP_DEBUG > 1) { @@ -3016,8 +2905,8 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) */ func_str = "libc_epoll_ctl"; - LDBG (1, "LDP<%d>: epfd %d (0x%x): calling %s(): op %d, fd %d (0x%x)," - " event %p", getpid (), epfd, epfd, func_str, op, fd, fd, event); + LDBG (1, "epfd %d (0x%x): calling %s(): op %d, fd %d (0x%x)," + " event %p", epfd, epfd, func_str, op, fd, fd, event); rv = libc_epoll_ctl (epfd, op, fd, event); goto done; @@ -3025,15 +2914,15 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) sid = ldp_sid_from_fd (fd); - LDBG (0, "LDP<%d>: epfd %d (0x%x), vep_idx %d (0x%x), sid %d (0x%x)", - getpid (), epfd, epfd, vep_idx, vep_idx, sid, sid); + LDBG (0, "epfd %d (0x%x), vep_idx %d (0x%x), sid %d (0x%x)", + epfd, epfd, vep_idx, vep_idx, sid, sid); if (sid != INVALID_SESSION_ID) { func_str = "vppcom_epoll_ctl"; - LDBG (1, "LDP<%d>: epfd %d (0x%x): calling %s(): vep_idx %d (0x%x)," - " op %d, sid %u (0x%x), event %p", getpid (), epfd, epfd, + LDBG (1, "epfd %d (0x%x): calling %s(): vep_idx %d (0x%x)," + " op %d, sid %u (0x%x), event %p", epfd, epfd, func_str, vep_idx, vep_idx, sid, sid, event); rv = vppcom_epoll_ctl (vep_idx, op, sid, event); @@ -3051,16 +2940,16 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) func_str = "vppcom_session_attr[GET_LIBC_EPFD]"; libc_epfd = vppcom_session_attr (vep_idx, VPPCOM_ATTR_GET_LIBC_EPFD, 0, 0); - LDBG (1, "LDP<%d>: epfd %d (0x%x), vep_idx %d (0x%x): %s() " - "returned libc_epfd %d (0x%x)", getpid (), epfd, epfd, + LDBG (1, "epfd %d (0x%x), vep_idx %d (0x%x): %s() " + "returned libc_epfd %d (0x%x)", epfd, epfd, vep_idx, vep_idx, func_str, libc_epfd, libc_epfd); if (!libc_epfd) { func_str = "libc_epoll_create1"; - LDBG (1, "LDP<%d>: epfd %d (0x%x), vep_idx %d (0x%x): " - "calling %s(): EPOLL_CLOEXEC", getpid (), epfd, epfd, + LDBG (1, "epfd %d (0x%x), vep_idx %d (0x%x): " + "calling %s(): EPOLL_CLOEXEC", epfd, epfd, vep_idx, vep_idx, func_str); libc_epfd = libc_epoll_create1 (EPOLL_CLOEXEC); @@ -3071,9 +2960,9 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) } func_str = "vppcom_session_attr[SET_LIBC_EPFD]"; - LDBG (1, "LDP<%d>: epfd %d (0x%x): calling %s(): vep_idx %d (0x%x)," + LDBG (1, "epfd %d (0x%x): calling %s(): vep_idx %d (0x%x)," " VPPCOM_ATTR_SET_LIBC_EPFD, libc_epfd %d (0x%x), size %d", - getpid (), epfd, epfd, func_str, vep_idx, vep_idx, libc_epfd, + epfd, epfd, func_str, vep_idx, vep_idx, libc_epfd, libc_epfd, size); rv = vppcom_session_attr (vep_idx, VPPCOM_ATTR_SET_LIBC_EPFD, @@ -3094,8 +2983,8 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) func_str = "libc_epoll_ctl"; - LDBG (1, "LDP<%d>: epfd %d (0x%x): calling %s(): libc_epfd %d (0x%x), " - "op %d, fd %d (0x%x), event %p", getpid (), epfd, epfd, func_str, + LDBG (1, "epfd %d (0x%x): calling %s(): libc_epfd %d (0x%x), " + "op %d, fd %d (0x%x), event %p", epfd, epfd, func_str, libc_epfd, libc_epfd, op, fd, fd, event); rv = libc_epoll_ctl (libc_epfd, op, fd, event); @@ -3124,6 +3013,7 @@ static inline int ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, int timeout, const sigset_t * sigmask) { + ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); double time_to_wait = (double) 0, time_out, now = 0; u32 vep_idx = ldp_sid_from_fd (epfd); int libc_epfd, rv = 0; @@ -3138,7 +3028,7 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, return -1; } - if (epfd == ldp->vcl_mq_epfd) + if (epfd == ldpw->vcl_mq_epfd) return libc_epoll_pwait (epfd, events, maxevents, timeout, sigmask); if (PREDICT_FALSE (vep_idx == INVALID_SESSION_ID)) @@ -3149,8 +3039,8 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, return -1; } - time_to_wait = ((timeout >= 0) ? (double) timeout : 0); - time_out = clib_time_now (&ldp->clib_time) + time_to_wait; + time_to_wait = ((timeout >= 0) ? (double) timeout / 1000 : 0); + time_out = clib_time_now (&ldpw->clib_time) + time_to_wait; func_str = "vppcom_session_attr[GET_LIBC_EPFD]"; libc_epfd = vppcom_session_attr (vep_idx, VPPCOM_ATTR_GET_LIBC_EPFD, 0, 0); @@ -3161,24 +3051,24 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, goto done; } - LDBG (2, "LDP<%d>: epfd %d (0x%x): vep_idx %d (0x%x), libc_epfd %d (0x%x), " + LDBG (2, "epfd %d (0x%x): vep_idx %d (0x%x), libc_epfd %d (0x%x), " "events %p, maxevents %d, timeout %d, sigmask %p: time_to_wait %.02f", - getpid (), epfd, epfd, vep_idx, vep_idx, libc_epfd, libc_epfd, events, + epfd, epfd, vep_idx, vep_idx, libc_epfd, libc_epfd, events, maxevents, timeout, sigmask, time_to_wait, time_out); do { - if (!ldp->epoll_wait_vcl) + if (!ldpw->epoll_wait_vcl) { func_str = "vppcom_epoll_wait"; - LDBG (3, "LDP<%d>: epfd %d (0x%x): calling %s(): vep_idx %d (0x%x)," - " events %p, maxevents %d", getpid (), epfd, epfd, func_str, + LDBG (3, "epfd %d (0x%x): calling %s(): vep_idx %d (0x%x)," + " events %p, maxevents %d", epfd, epfd, func_str, vep_idx, vep_idx, events, maxevents); rv = vppcom_epoll_wait (vep_idx, events, maxevents, 0); if (rv > 0) { - ldp->epoll_wait_vcl = 1; + ldpw->epoll_wait_vcl = 1; goto done; } else if (rv < 0) @@ -3189,24 +3079,24 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, } } else - ldp->epoll_wait_vcl = 0; + ldpw->epoll_wait_vcl = 0; if (libc_epfd > 0) { func_str = "libc_epoll_pwait"; - LDBG (3, "LDP<%d>: epfd %d (0x%x): calling %s(): libc_epfd %d " - "(0x%x), events %p, maxevents %d, sigmask %p", getpid (), + LDBG (3, "epfd %d (0x%x): calling %s(): libc_epfd %d " + "(0x%x), events %p, maxevents %d, sigmask %p", epfd, epfd, func_str, libc_epfd, libc_epfd, events, maxevents, sigmask); - rv = libc_epoll_pwait (libc_epfd, events, maxevents, 1, sigmask); + rv = libc_epoll_pwait (libc_epfd, events, maxevents, 0, sigmask); if (rv != 0) goto done; } if (timeout != -1) - now = clib_time_now (&ldp->clib_time); + now = clib_time_now (&ldpw->clib_time); } while (now < time_out); @@ -3247,14 +3137,14 @@ epoll_wait (int epfd, struct epoll_event *events, int maxevents, int timeout) int poll (struct pollfd *fds, nfds_t nfds, int timeout) { + ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); const char *func_str = __func__; int rv, i, n_revents = 0; u32 sid; vcl_poll_t *vp; double wait_for_time; - LDBG (3, "LDP<%d>: fds %p, nfds %d, timeout %d", getpid (), fds, nfds, - timeout); + LDBG (3, "fds %p, nfds %d, timeout %d", fds, nfds, timeout); if (timeout >= 0) wait_for_time = (f64) timeout / 1000; @@ -3266,15 +3156,14 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) if (fds[i].fd < 0) continue; - LDBG (3, "LDP<%d>: fds[%d] fd %d (0x%0x) events = 0x%x revents = 0x%x", - getpid (), i, fds[i].fd, fds[i].fd, fds[i].events, - fds[i].revents); + LDBG (3, "fds[%d] fd %d (0x%0x) events = 0x%x revents = 0x%x", + i, fds[i].fd, fds[i].fd, fds[i].events, fds[i].revents); sid = ldp_sid_from_fd (fds[i].fd); if (sid != INVALID_SESSION_ID) { fds[i].fd = -fds[i].fd; - vec_add2 (ldp->vcl_poll, vp, 1); + vec_add2 (ldpw->vcl_poll, vp, 1); vp->fds_ndx = i; vp->sid = sid; vp->events = fds[i].events; @@ -3288,23 +3177,23 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) } else { - vec_add1 (ldp->libc_poll, fds[i]); - vec_add1 (ldp->libc_poll_idxs, i); + vec_add1 (ldpw->libc_poll, fds[i]); + vec_add1 (ldpw->libc_poll_idxs, i); } } do { - if (vec_len (ldp->vcl_poll)) + if (vec_len (ldpw->vcl_poll)) { func_str = "vppcom_poll"; - LDBG (3, "LDP<%d>: calling %s(): vcl_poll %p, n_sids %u (0x%x): " - "n_libc_fds %u", getpid (), func_str, ldp->vcl_poll, - vec_len (ldp->vcl_poll), vec_len (ldp->vcl_poll), - vec_len (ldp->libc_poll)); + LDBG (3, "calling %s(): vcl_poll %p, n_sids %u (0x%x): " + "n_libc_fds %u", func_str, ldpw->vcl_poll, + vec_len (ldpw->vcl_poll), vec_len (ldpw->vcl_poll), + vec_len (ldpw->libc_poll)); - rv = vppcom_poll (ldp->vcl_poll, vec_len (ldp->vcl_poll), 0); + rv = vppcom_poll (ldpw->vcl_poll, vec_len (ldpw->vcl_poll), 0); if (rv < 0) { errno = -rv; @@ -3315,14 +3204,14 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) n_revents += rv; } - if (vec_len (ldp->libc_poll)) + if (vec_len (ldpw->libc_poll)) { func_str = "libc_poll"; - LDBG (3, "LDP<%d>: calling %s(): fds %p, nfds %u: n_sids %u", - getpid (), fds, nfds, vec_len (ldp->vcl_poll)); + LDBG (3, "calling %s(): fds %p, nfds %u: n_sids %u", + fds, nfds, vec_len (ldpw->vcl_poll)); - rv = libc_poll (ldp->libc_poll, vec_len (ldp->libc_poll), 0); + rv = libc_poll (ldpw->libc_poll, vec_len (ldpw->libc_poll), 0); if (rv < 0) goto done; else @@ -3336,11 +3225,11 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) } } while ((wait_for_time == -1) || - (clib_time_now (&ldp->clib_time) < wait_for_time)); + (clib_time_now (&ldpw->clib_time) < wait_for_time)); rv = 0; done: - vec_foreach (vp, ldp->vcl_poll) + vec_foreach (vp, ldpw->vcl_poll) { fds[vp->fds_ndx].fd = -fds[vp->fds_ndx].fd; fds[vp->fds_ndx].revents = vp->revents; @@ -3353,14 +3242,14 @@ done: fds[vp->fds_ndx].revents |= POLLWRNORM; #endif } - vec_reset_length (ldp->vcl_poll); + vec_reset_length (ldpw->vcl_poll); - for (i = 0; i < vec_len (ldp->libc_poll); i++) + for (i = 0; i < vec_len (ldpw->libc_poll); i++) { - fds[ldp->libc_poll_idxs[i]].revents = ldp->libc_poll[i].revents; + fds[ldpw->libc_poll_idxs[i]].revents = ldpw->libc_poll[i].revents; } - vec_reset_length (ldp->libc_poll_idxs); - vec_reset_length (ldp->libc_poll); + vec_reset_length (ldpw->libc_poll_idxs); + vec_reset_length (ldpw->libc_poll); if (LDP_DEBUG > 3) { @@ -3377,7 +3266,7 @@ done: { clib_warning ("LDP<%d>: returning %d (0x%x): n_sids %u, " "n_libc_fds %d", getpid (), rv, rv, - vec_len (ldp->vcl_poll), vec_len (ldp->libc_poll)); + vec_len (ldpw->vcl_poll), vec_len (ldpw->libc_poll)); for (i = 0; i < nfds; i++) { @@ -3438,10 +3327,7 @@ ldp_destructor (void) { swrap_destructor (); if (ldp->init) - { - vppcom_app_destroy (); - ldp->init = 0; - } + ldp->init = 0; /* Don't use clib_warning() here because that calls writev() * which will call ldp_init().