|
Packit |
6d2c1b |
/*
|
|
Packit |
6d2c1b |
* Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* This software is available to you under a choice of one of two
|
|
Packit |
6d2c1b |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
6d2c1b |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
6d2c1b |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
6d2c1b |
* BSD license below:
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
6d2c1b |
* without modification, are permitted provided that the following
|
|
Packit |
6d2c1b |
* conditions are met:
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* - Redistributions of source code must retain the above
|
|
Packit |
6d2c1b |
* copyright notice, this list of conditions and the following
|
|
Packit |
6d2c1b |
* disclaimer.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
6d2c1b |
* copyright notice, this list of conditions and the following
|
|
Packit |
6d2c1b |
* disclaimer in the documentation and/or other materials
|
|
Packit |
6d2c1b |
* provided with the distribution.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
6d2c1b |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
6d2c1b |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
6d2c1b |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
6d2c1b |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
6d2c1b |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
6d2c1b |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
6d2c1b |
* SOFTWARE.
|
|
Packit |
6d2c1b |
*/
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#include <vlogger/vlogger.h>
|
|
Packit |
6d2c1b |
#include "utils/bullseye.h"
|
|
Packit |
6d2c1b |
#include <vma/event/event_handler_manager.h>
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#include "sock-redirect.h"
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#include "pipeinfo.h"
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#define MODULE_NAME "pi"
|
|
Packit |
6d2c1b |
#undef VLOG_PRINTF
|
|
Packit |
6d2c1b |
#define VLOG_PRINTF(log_level, log_fmt, log_args...) vlog_printf(log_level, "fd[%#x]:%s() " log_fmt "\n", m_fd, __FUNCTION__, ##log_args)
|
|
Packit |
6d2c1b |
#define VLOG_PRINTF_DETAILS(log_level, log_fmt, log_args...) vlog_printf(log_level, MODULE_NAME ":%d:fd[%#x]:%s() " log_fmt "\n", __LINE__, m_fd, __FUNCTION__, ##log_args)
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#define pi_logpanic(log_fmt, log_args...) VLOG_PRINTF(VLOG_PANIC, log_fmt, ##log_args); throw;
|
|
Packit |
6d2c1b |
#define pi_logerr(log_fmt, log_args...) VLOG_PRINTF(VLOG_ERROR, log_fmt, ##log_args)
|
|
Packit |
6d2c1b |
#define pi_logwarn(log_fmt, log_args...) VLOG_PRINTF(VLOG_WARNING, log_fmt, ##log_args)
|
|
Packit |
6d2c1b |
#define pi_loginfo(log_fmt, log_args...) VLOG_PRINTF(VLOG_INFO, log_fmt, ##log_args)
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#if (VMA_MAX_DEFINED_LOG_LEVEL < DEFINED_VLOG_DEBUG)
|
|
Packit |
6d2c1b |
#define pi_logdbg_no_funcname(log_fmt, log_args...) ((void)0)
|
|
Packit |
6d2c1b |
#define pi_logdbg(log_fmt, log_args...) ((void)0)
|
|
Packit |
6d2c1b |
#define si_logdbg_no_funcname(log_fmt, log_args...) ((void)0)
|
|
Packit |
6d2c1b |
#else
|
|
Packit |
6d2c1b |
#define pi_logdbg_no_funcname(log_fmt, log_args...) if (g_vlogger_level >= VLOG_DEBUG) vlog_printf(VLOG_DEBUG, MODULE_NAME ":%d:fd[%d]: " log_fmt "\n", __LINE__, m_fd, ##log_args)
|
|
Packit |
6d2c1b |
#define pi_logdbg(log_fmt, log_args...) if (g_vlogger_level >= VLOG_DEBUG) VLOG_PRINTF_DETAILS(VLOG_DEBUG, log_fmt, ##log_args)
|
|
Packit |
6d2c1b |
#define si_logdbg_no_funcname(log_fmt, log_args...) do { if (g_vlogger_level >= VLOG_DEBUG) vlog_printf(VLOG_DEBUG, MODULE_NAME "[fd=%d]:%d: " log_fmt "\n", m_fd, __LINE__, ##log_args); } while (0)
|
|
Packit |
6d2c1b |
#endif
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#if (VMA_MAX_DEFINED_LOG_LEVEL < DEFINED_VLOG_FINE)
|
|
Packit |
6d2c1b |
#define pi_logfunc(log_fmt, log_args...) ((void)0)
|
|
Packit |
6d2c1b |
#else
|
|
Packit |
6d2c1b |
#define pi_logfunc(log_fmt, log_args...) if (g_vlogger_level >= VLOG_FUNC) VLOG_PRINTF_DETAILS(VLOG_FUNC, log_fmt, ##log_args)
|
|
Packit |
6d2c1b |
#endif
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#if (VMA_MAX_DEFINED_LOG_LEVEL < DEFINED_VLOG_FINER)
|
|
Packit |
6d2c1b |
#define pi_logfuncall(log_fmt, log_args...) ((void)0)
|
|
Packit |
6d2c1b |
#else
|
|
Packit |
6d2c1b |
#define pi_logfuncall(log_fmt, log_args...) if (g_vlogger_level >= VLOG_FUNC_ALL) VLOG_PRINTF_DETAILS(VLOG_FUNC_ALL, log_fmt, ##log_args)
|
|
Packit |
6d2c1b |
#endif /* VMA_MAX_DEFINED_LOG_LEVEL */
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pipeinfo::pipeinfo(int fd) : socket_fd_api(fd),
|
|
Packit |
6d2c1b |
m_lock("pipeinfo::m_lock"),
|
|
Packit |
6d2c1b |
m_lock_rx("pipeinfo::m_lock_rx"),
|
|
Packit |
6d2c1b |
m_lock_tx("pipeinfo::m_lock_tx")
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
pi_logfunc("");
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_b_closed = true;
|
|
Packit |
6d2c1b |
m_timer_handle = NULL;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_b_blocking = true;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_p_socket_stats = NULL; // mce_stats_instance_create_socket_block();
|
|
Packit |
6d2c1b |
if (m_p_socket_stats == NULL) {
|
|
Packit |
6d2c1b |
// pi_logdbg("Got NULL from mce_stats_instance_create_socket_block, using local member");
|
|
Packit |
6d2c1b |
m_p_socket_stats = &m_socket_stats;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
m_p_socket_stats->reset();
|
|
Packit |
6d2c1b |
m_p_socket_stats->fd = m_fd;
|
|
Packit |
6d2c1b |
m_p_socket_stats->b_blocking = m_b_blocking;
|
|
Packit |
6d2c1b |
m_p_socket_stats->n_rx_ready_pkt_count = 0;
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_ready_pkt_max = 0;
|
|
Packit |
6d2c1b |
m_p_socket_stats->n_rx_ready_byte_count = 0;
|
|
Packit |
6d2c1b |
m_p_socket_stats->n_tx_ready_byte_count = 0;
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_ready_byte_max = 0;
|
|
Packit |
6d2c1b |
m_p_socket_stats->n_rx_zcopy_pkt_count = 0;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_b_closed = false;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_b_lbm_event_q_pipe_timer_on = false;
|
|
Packit |
6d2c1b |
m_write_count = m_write_count_on_last_timer = 0;
|
|
Packit |
6d2c1b |
m_write_count_no_change_count = 0;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pi_logfunc("done");
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pipeinfo::~pipeinfo()
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
m_b_closed = true;
|
|
Packit |
6d2c1b |
pi_logfunc("");
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
// Change to non-blocking socket so calling threads can exit
|
|
Packit |
6d2c1b |
m_b_blocking = false;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_lock_tx.lock();
|
|
Packit |
6d2c1b |
m_lock_rx.lock();
|
|
Packit |
6d2c1b |
m_lock.lock();
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
if (m_timer_handle) {
|
|
Packit |
6d2c1b |
g_p_event_handler_manager->unregister_timer_event(this, m_timer_handle);
|
|
Packit |
6d2c1b |
m_timer_handle = NULL;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
statistics_print();
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_lock_tx.unlock();
|
|
Packit |
6d2c1b |
m_lock_rx.unlock();
|
|
Packit |
6d2c1b |
m_lock.unlock();
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pi_logfunc("done");
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void pipeinfo::clean_obj()
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
if (is_cleaned()) {
|
|
Packit |
6d2c1b |
return ;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
set_cleaned();
|
|
Packit |
6d2c1b |
m_timer_handle = NULL;
|
|
Packit |
6d2c1b |
if (g_p_event_handler_manager->is_running()) {
|
|
Packit |
6d2c1b |
g_p_event_handler_manager->unregister_timers_event_and_delete(this);
|
|
Packit |
6d2c1b |
} else {
|
|
Packit |
6d2c1b |
cleanable_obj::clean_obj();
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int pipeinfo::fcntl(int __cmd, unsigned long int __arg)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
switch (__cmd) {
|
|
Packit |
6d2c1b |
case F_SETFL:
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
pi_logfunc("cmd=F_SETFL, arg=%#x", __cmd, __arg);
|
|
Packit |
6d2c1b |
if (__arg & O_NONBLOCK) {
|
|
Packit |
6d2c1b |
pi_logdbg("set to non-blocking mode");
|
|
Packit |
6d2c1b |
m_b_blocking = false;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
else {
|
|
Packit |
6d2c1b |
pi_logdbg("set to blocked mode");
|
|
Packit |
6d2c1b |
m_b_blocking = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
m_p_socket_stats->b_blocking = m_b_blocking;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
case F_GETFL: /* Get file status flags. */
|
|
Packit |
6d2c1b |
pi_logfunc("F_GETFL, arg=%#x", __arg);
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
case F_GETFD: /* Get file descriptor flags. */
|
|
Packit |
6d2c1b |
pi_logfunc("F_GETFD, arg=%#x", __arg);
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
case F_SETFD: /* Set file descriptor flags. */
|
|
Packit |
6d2c1b |
pi_logfunc("F_SETFD, arg=%#x", __arg);
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
default:
|
|
Packit |
6d2c1b |
pi_logfunc("cmd=%d, arg=%#x", __cmd, __arg);
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
return orig_os_api.fcntl(m_fd, __cmd, __arg);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int pipeinfo::ioctl(unsigned long int __request, unsigned long int __arg)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
int *p_arg = (int *)__arg;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
switch (__request) {
|
|
Packit |
6d2c1b |
case FIONBIO:
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
if (*p_arg) {
|
|
Packit |
6d2c1b |
pi_logdbg("FIONBIO, arg=%d - set to non-blocking mode", *p_arg);
|
|
Packit |
6d2c1b |
m_b_blocking = false;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
else {
|
|
Packit |
6d2c1b |
pi_logdbg("FIONBIO, arg=%d - set to blocked mode", *p_arg);
|
|
Packit |
6d2c1b |
m_b_blocking = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_p_socket_stats->b_blocking = m_b_blocking;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
default:
|
|
Packit |
6d2c1b |
pi_logfunc("request=%d, arg=%#x", __request, __arg);
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
return orig_os_api.ioctl(m_fd, __request, __arg);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
ssize_t pipeinfo::rx(const rx_call_t call_type, iovec* p_iov, ssize_t sz_iov,
|
|
Packit |
6d2c1b |
int* p_flags, sockaddr *__from, socklen_t *__fromlen, struct msghdr *__msg)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
pi_logfunc("");
|
|
Packit |
6d2c1b |
ssize_t ret = socket_fd_api::rx_os(call_type, p_iov, sz_iov, *p_flags, __from, __fromlen, __msg);
|
|
Packit |
6d2c1b |
save_stats_rx_os(ret);
|
|
Packit |
6d2c1b |
return ret;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void pipeinfo::handle_timer_expired(void* user_data)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
NOT_IN_USE(user_data);
|
|
Packit |
6d2c1b |
pi_logfunc("(m_write_count=%d)", m_write_count);
|
|
Packit |
6d2c1b |
m_lock_tx.lock();
|
|
Packit |
6d2c1b |
write_lbm_pipe_enhance();
|
|
Packit |
6d2c1b |
m_lock_tx.unlock();
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
ssize_t pipeinfo::tx(vma_tx_call_attr_t &tx_arg)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
const iovec* p_iov = tx_arg.attr.msg.iov;
|
|
Packit |
6d2c1b |
const ssize_t sz_iov = tx_arg.attr.msg.sz_iov;
|
|
Packit |
6d2c1b |
const int __flags = tx_arg.attr.msg.flags;
|
|
Packit |
6d2c1b |
const struct sockaddr *__to = tx_arg.attr.msg.addr;
|
|
Packit |
6d2c1b |
const socklen_t __tolen = tx_arg.attr.msg.len;
|
|
Packit |
6d2c1b |
ssize_t ret = -1;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pi_logfunc("");
|
|
Packit |
6d2c1b |
m_lock_tx.lock();
|
|
Packit |
6d2c1b |
switch (tx_arg.opcode) {
|
|
Packit |
6d2c1b |
case TX_WRITE:
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
if ((safe_mce_sys().mce_spec == MCE_SPEC_29WEST_LBM_29 || safe_mce_sys().mce_spec == MCE_SPEC_WOMBAT_FH_LBM_554) &&
|
|
Packit |
6d2c1b |
(p_iov[0].iov_len == 1) && (((char*)p_iov[0].iov_base)[0] == '\0')) {
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
// We will pass one pipe write in every T usec
|
|
Packit |
6d2c1b |
//
|
|
Packit |
6d2c1b |
// 1) First signaling pipe write will go through, and triger timer logic
|
|
Packit |
6d2c1b |
// 2) Then we'll send a single pipe writes every T usec (safe_mce_sys().mce_spec_param1)
|
|
Packit |
6d2c1b |
// 3) We'll stop the timer once we have N cycles with no pipe write
|
|
Packit |
6d2c1b |
//
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_write_count++;
|
|
Packit |
6d2c1b |
if (m_b_lbm_event_q_pipe_timer_on == false) {
|
|
Packit |
6d2c1b |
m_timer_handle = g_p_event_handler_manager->register_timer_event(safe_mce_sys().mce_spec_param1/1000, this, PERIODIC_TIMER, 0);
|
|
Packit |
6d2c1b |
m_b_lbm_event_q_pipe_timer_on = true;
|
|
Packit |
6d2c1b |
m_write_count_on_last_timer = 0;
|
|
Packit |
6d2c1b |
m_write_count_no_change_count = 0;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pi_logdbg("\n\n\npipe_write DONE timer Reg\n\n\n");
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
// simulate a pipe_write
|
|
Packit |
6d2c1b |
write_lbm_pipe_enhance();
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
else if ((int)m_write_count > (int)(m_write_count_on_last_timer + safe_mce_sys().mce_spec_param2)) {
|
|
Packit |
6d2c1b |
// simulate a pipe_write
|
|
Packit |
6d2c1b |
write_lbm_pipe_enhance();
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
ret = 1;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
else {
|
|
Packit |
6d2c1b |
ret = orig_os_api.write(m_fd, p_iov[0].iov_base, p_iov[0].iov_len);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
case TX_SEND:
|
|
Packit |
6d2c1b |
case TX_SENDTO:
|
|
Packit |
6d2c1b |
case TX_SENDMSG:
|
|
Packit |
6d2c1b |
default:
|
|
Packit |
6d2c1b |
ret = socket_fd_api::tx_os(tx_arg.opcode, p_iov, sz_iov, __flags, __to, __tolen);
|
|
Packit |
6d2c1b |
break;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
save_stats_tx_os(ret);
|
|
Packit |
6d2c1b |
m_lock_tx.unlock();
|
|
Packit |
6d2c1b |
return ret;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void pipeinfo::write_lbm_pipe_enhance()
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
pi_logfunc("(m_write_count=%d)", m_write_count);
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
if (m_write_count == m_write_count_on_last_timer) {
|
|
Packit |
6d2c1b |
// No pipe write happened during the last timer_expired()
|
|
Packit |
6d2c1b |
m_write_count_no_change_count++;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
// After 3 of these stop timer
|
|
Packit |
6d2c1b |
if (m_write_count_no_change_count >= 2 && m_b_lbm_event_q_pipe_timer_on) {
|
|
Packit |
6d2c1b |
if (m_timer_handle) {
|
|
Packit |
6d2c1b |
g_p_event_handler_manager->unregister_timer_event(this, m_timer_handle);
|
|
Packit |
6d2c1b |
m_timer_handle = NULL;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
m_b_lbm_event_q_pipe_timer_on = false;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
pi_logfunc("pipe_write DONE timer Un-Reg");
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
m_write_count = 0;
|
|
Packit |
6d2c1b |
m_write_count_no_change_count = 0;
|
|
Packit |
6d2c1b |
m_write_count_on_last_timer = 0;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
// Send the buffered data
|
|
Packit |
6d2c1b |
char buf[10] = "\0";
|
|
Packit |
6d2c1b |
orig_os_api.write(m_fd, buf, 1);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void pipeinfo::statistics_print()
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
bool b_any_activiy = false;
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_tx_sent_byte_count || m_p_socket_stats->counters.n_tx_sent_pkt_count || m_p_socket_stats->counters.n_tx_errors || m_p_socket_stats->counters.n_tx_drops) {
|
|
Packit |
6d2c1b |
pi_logdbg_no_funcname("Tx Offload: %d KB / %d / %d / %d [bytes/packets/errors/drops]", m_p_socket_stats->counters.n_tx_sent_byte_count/1024, m_p_socket_stats->counters.n_tx_sent_pkt_count, m_p_socket_stats->counters.n_tx_errors, m_p_socket_stats->counters.n_tx_drops);
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_tx_os_bytes || m_p_socket_stats->counters.n_tx_os_packets || m_p_socket_stats->counters.n_tx_os_errors) {
|
|
Packit |
6d2c1b |
pi_logdbg_no_funcname("Tx OS info: %d KB / %d / %d [bytes/packets/errors]", m_p_socket_stats->counters.n_tx_os_bytes/1024, m_p_socket_stats->counters.n_tx_os_packets, m_p_socket_stats->counters.n_tx_os_errors);
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_rx_bytes || m_p_socket_stats->counters.n_rx_packets || m_p_socket_stats->counters.n_rx_errors || m_p_socket_stats->counters.n_rx_eagain) {
|
|
Packit |
6d2c1b |
pi_logdbg_no_funcname("Rx Offload: %d KB / %d / %d / %d [bytes/packets/errors/eagains]", m_p_socket_stats->counters.n_rx_bytes/1024, m_p_socket_stats->counters.n_rx_packets, m_p_socket_stats->counters.n_rx_errors, m_p_socket_stats->counters.n_rx_eagain);
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_rx_os_bytes || m_p_socket_stats->counters.n_rx_os_packets || m_p_socket_stats->counters.n_rx_os_errors) {
|
|
Packit |
6d2c1b |
pi_logdbg_no_funcname("Rx OS info: %d KB / %d / %d [bytes/packets/errors]", m_p_socket_stats->counters.n_rx_os_bytes/1024, m_p_socket_stats->counters.n_rx_os_packets, m_p_socket_stats->counters.n_rx_os_errors);
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_rx_poll_miss || m_p_socket_stats->counters.n_rx_poll_hit) {
|
|
Packit |
6d2c1b |
pi_logdbg_no_funcname("Rx poll: %d / %d (%2.2f%%) [miss/hit]", m_p_socket_stats->counters.n_rx_poll_miss, m_p_socket_stats->counters.n_rx_poll_hit,
|
|
Packit |
6d2c1b |
(float)(m_p_socket_stats->counters.n_rx_poll_hit * 100) / (float)(m_p_socket_stats->counters.n_rx_poll_miss + m_p_socket_stats->counters.n_rx_poll_hit));
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_rx_ready_byte_drop) {
|
|
Packit |
6d2c1b |
si_logdbg_no_funcname("Rx byte: max %d / dropped %d (%2.2f%%) [limit is %d]", m_p_socket_stats->counters.n_rx_ready_byte_max, m_p_socket_stats->counters.n_rx_ready_byte_drop,
|
|
Packit |
6d2c1b |
(m_p_socket_stats->counters.n_rx_packets ? (float)(m_p_socket_stats->counters.n_rx_ready_byte_drop * 100) / (float)m_p_socket_stats->counters.n_rx_packets : 0),
|
|
Packit |
6d2c1b |
m_p_socket_stats->n_rx_ready_byte_limit);
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (m_p_socket_stats->counters.n_rx_ready_pkt_drop) {
|
|
Packit |
6d2c1b |
si_logdbg_no_funcname("Rx pkt : max %d / dropped %d (%2.2f%%)", m_p_socket_stats->counters.n_rx_ready_pkt_max, m_p_socket_stats->counters.n_rx_ready_pkt_drop,
|
|
Packit |
6d2c1b |
(m_p_socket_stats->counters.n_rx_packets ? (float)(m_p_socket_stats->counters.n_rx_ready_pkt_drop * 100) / (float)m_p_socket_stats->counters.n_rx_packets : 0));
|
|
Packit |
6d2c1b |
b_any_activiy = true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
if (b_any_activiy == false) {
|
|
Packit |
6d2c1b |
pi_logdbg_no_funcname("Rx and Tx where not active");
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void pipeinfo::save_stats_rx_os(int bytes)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
if (bytes >= 0) {
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_os_bytes += bytes;
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_os_packets++;
|
|
Packit |
6d2c1b |
}else if ( errno == EAGAIN ){
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_os_eagain++;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
else {
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_os_errors++;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void pipeinfo::save_stats_tx_os(int bytes)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
if (bytes >= 0) {
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_tx_os_bytes += bytes;
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_tx_os_packets++;
|
|
Packit |
6d2c1b |
}else if ( errno == EAGAIN ){
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_rx_os_eagain++;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
else {
|
|
Packit |
6d2c1b |
m_p_socket_stats->counters.n_tx_os_errors++;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|