1e6babe4cSAndy Grover /* 2e6babe4cSAndy Grover * Copyright (c) 2006 Oracle. All rights reserved. 3e6babe4cSAndy Grover * 4e6babe4cSAndy Grover * This software is available to you under a choice of one of two 5e6babe4cSAndy Grover * licenses. You may choose to be licensed under the terms of the GNU 6e6babe4cSAndy Grover * General Public License (GPL) Version 2, available from the file 7e6babe4cSAndy Grover * COPYING in the main directory of this source tree, or the 8e6babe4cSAndy Grover * OpenIB.org BSD license below: 9e6babe4cSAndy Grover * 10e6babe4cSAndy Grover * Redistribution and use in source and binary forms, with or 11e6babe4cSAndy Grover * without modification, are permitted provided that the following 12e6babe4cSAndy Grover * conditions are met: 13e6babe4cSAndy Grover * 14e6babe4cSAndy Grover * - Redistributions of source code must retain the above 15e6babe4cSAndy Grover * copyright notice, this list of conditions and the following 16e6babe4cSAndy Grover * disclaimer. 17e6babe4cSAndy Grover * 18e6babe4cSAndy Grover * - Redistributions in binary form must reproduce the above 19e6babe4cSAndy Grover * copyright notice, this list of conditions and the following 20e6babe4cSAndy Grover * disclaimer in the documentation and/or other materials 21e6babe4cSAndy Grover * provided with the distribution. 22e6babe4cSAndy Grover * 23e6babe4cSAndy Grover * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24e6babe4cSAndy Grover * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25e6babe4cSAndy Grover * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26e6babe4cSAndy Grover * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27e6babe4cSAndy Grover * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28e6babe4cSAndy Grover * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29e6babe4cSAndy Grover * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30e6babe4cSAndy Grover * SOFTWARE. 31e6babe4cSAndy Grover * 32e6babe4cSAndy Grover */ 33e6babe4cSAndy Grover #include <linux/percpu.h> 34e6babe4cSAndy Grover #include <linux/seq_file.h> 35e6babe4cSAndy Grover #include <linux/proc_fs.h> 36e6babe4cSAndy Grover 37e6babe4cSAndy Grover #include "rds.h" 38e6babe4cSAndy Grover #include "ib.h" 39e6babe4cSAndy Grover 40b9bf3121STejun Heo DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_ib_statistics, rds_ib_stats); 41e6babe4cSAndy Grover 4236cbd3dcSJan Engelhardt static const char *const rds_ib_stat_names[] = { 43e6babe4cSAndy Grover "ib_connect_raced", 44e6babe4cSAndy Grover "ib_listen_closed_stale", 45f4f943c9SSantosh Shilimkar "s_ib_evt_handler_call", 46f4f943c9SSantosh Shilimkar "ib_tasklet_call", 47e6babe4cSAndy Grover "ib_tx_cq_event", 48e6babe4cSAndy Grover "ib_tx_ring_full", 49e6babe4cSAndy Grover "ib_tx_throttle", 50e6babe4cSAndy Grover "ib_tx_sg_mapping_failure", 51e6babe4cSAndy Grover "ib_tx_stalled", 52e6babe4cSAndy Grover "ib_tx_credit_updates", 53e6babe4cSAndy Grover "ib_rx_cq_event", 54e6babe4cSAndy Grover "ib_rx_ring_empty", 55e6babe4cSAndy Grover "ib_rx_refill_from_cq", 56e6babe4cSAndy Grover "ib_rx_refill_from_thread", 57e6babe4cSAndy Grover "ib_rx_alloc_limit", 58*09b2b8f5SSantosh Shilimkar "ib_rx_total_frags", 59*09b2b8f5SSantosh Shilimkar "ib_rx_total_incs", 60e6babe4cSAndy Grover "ib_rx_credit_updates", 61e6babe4cSAndy Grover "ib_ack_sent", 62e6babe4cSAndy Grover "ib_ack_send_failure", 63e6babe4cSAndy Grover "ib_ack_send_delayed", 64e6babe4cSAndy Grover "ib_ack_send_piggybacked", 65e6babe4cSAndy Grover "ib_ack_received", 6606766513SSantosh Shilimkar "ib_rdma_mr_8k_alloc", 6706766513SSantosh Shilimkar "ib_rdma_mr_8k_free", 6806766513SSantosh Shilimkar "ib_rdma_mr_8k_used", 6906766513SSantosh Shilimkar "ib_rdma_mr_8k_pool_flush", 7006766513SSantosh Shilimkar "ib_rdma_mr_8k_pool_wait", 7106766513SSantosh Shilimkar "ib_rdma_mr_8k_pool_depleted", 7206766513SSantosh Shilimkar "ib_rdma_mr_1m_alloc", 7306766513SSantosh Shilimkar "ib_rdma_mr_1m_free", 7406766513SSantosh Shilimkar "ib_rdma_mr_1m_used", 7506766513SSantosh Shilimkar "ib_rdma_mr_1m_pool_flush", 7606766513SSantosh Shilimkar "ib_rdma_mr_1m_pool_wait", 7706766513SSantosh Shilimkar "ib_rdma_mr_1m_pool_depleted", 78db42753aSsantosh.shilimkar@oracle.com "ib_rdma_mr_8k_reused", 79db42753aSsantosh.shilimkar@oracle.com "ib_rdma_mr_1m_reused", 8051e2cba8SAndy Grover "ib_atomic_cswp", 8151e2cba8SAndy Grover "ib_atomic_fadd", 82e6babe4cSAndy Grover }; 83e6babe4cSAndy Grover 84e6babe4cSAndy Grover unsigned int rds_ib_stats_info_copy(struct rds_info_iterator *iter, 85e6babe4cSAndy Grover unsigned int avail) 86e6babe4cSAndy Grover { 87e6babe4cSAndy Grover struct rds_ib_statistics stats = {0, }; 88e6babe4cSAndy Grover uint64_t *src; 89e6babe4cSAndy Grover uint64_t *sum; 90e6babe4cSAndy Grover size_t i; 91e6babe4cSAndy Grover int cpu; 92e6babe4cSAndy Grover 93e6babe4cSAndy Grover if (avail < ARRAY_SIZE(rds_ib_stat_names)) 94e6babe4cSAndy Grover goto out; 95e6babe4cSAndy Grover 96e6babe4cSAndy Grover for_each_online_cpu(cpu) { 97e6babe4cSAndy Grover src = (uint64_t *)&(per_cpu(rds_ib_stats, cpu)); 98e6babe4cSAndy Grover sum = (uint64_t *)&stats; 99e6babe4cSAndy Grover for (i = 0; i < sizeof(stats) / sizeof(uint64_t); i++) 100e6babe4cSAndy Grover *(sum++) += *(src++); 101e6babe4cSAndy Grover } 102e6babe4cSAndy Grover 103e6babe4cSAndy Grover rds_stats_info_copy(iter, (uint64_t *)&stats, rds_ib_stat_names, 104e6babe4cSAndy Grover ARRAY_SIZE(rds_ib_stat_names)); 105e6babe4cSAndy Grover out: 106e6babe4cSAndy Grover return ARRAY_SIZE(rds_ib_stat_names); 107e6babe4cSAndy Grover } 108