/*
- * Copyright (C) 2009-2012 Cray, Inc.
+ * Copyright (C) 2009-2012, 2016 Cray, Inc.
+ *
+ * Copyright (c) 2013, 2015, Intel Corporation.
*
* Author: Nic Henke <nic@cray.com>
+ * Author: James Shimek <jshimek@cray.com>
*
* This file is part of Lustre, http://www.lustre.org.
*
#define DEBUG_SUBSYSTEM S_LND
#include "gnilnd.h"
#include <linux/seq_file.h>
+#include <lprocfs_status.h>
#define GNILND_PROC_STATS "stats"
#define GNILND_PROC_MDD "mdd"
for (i = 0; i < LNET_MAX_IOV; i++) {
src[i].kiov_offset = 0;
src[i].kiov_len = PAGE_SIZE;
- src[i].kiov_page = alloc_page(__GFP_IO | __GFP_FS | __GFP_ZERO);
+ src[i].kiov_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
if (src[i].kiov_page == NULL) {
CERROR("couldn't allocate page %d\n", i);
dest[i].kiov_offset = 0;
dest[i].kiov_len = PAGE_SIZE;
- dest[i].kiov_page = alloc_page(__GFP_IO | __GFP_FS | __GFP_ZERO);
+ dest[i].kiov_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
if (dest[i].kiov_page == NULL) {
CERROR("couldn't allocate page %d\n", i);
getnstimeofday(&end);
- mbytes = (nloops * nob * 2) / (1024*1024);
+ mbytes = ((__u64)nloops * nob * 2) / (1024*1024);
diff = kgnilnd_ts_sub(end, begin);
- LCONSOLE_INFO("running "LPD64"MB took %ld.%ld seconds\n",
+ LCONSOLE_INFO("running %lldMB took %ld.%ld seconds\n",
mbytes, diff.tv_sec, diff.tv_nsec);
unwind:
return rc;
}
-static int
-kgnilnd_proc_cksum_test_write(struct file *file, const char *ubuffer,
- unsigned long count, void *data)
+static ssize_t
+kgnilnd_proc_cksum_test_write(struct file *file, const char __user *ubuffer,
+ size_t count, loff_t *ppos)
{
char dummy[256 + 1] = { '\0' };
int testno, nloops, nbytes;
}
static int
-kgnilnd_proc_stats_read(char *page, char **start, off_t off,
- int count, int *eof, void *data)
+kgnilnd_cksum_test_seq_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, NULL, PDE_DATA(inode));
+}
+
+static const struct file_operations kgn_cksum_test_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_cksum_test_seq_open,
+ .write = kgnilnd_proc_cksum_test_write,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+static int
+kgnilnd_stats_seq_show(struct seq_file *sf, void *v)
{
kgn_device_t *dev;
struct timeval now;
int rc;
if (kgnilnd_data.kgn_init < GNILND_INIT_ALL) {
- rc = sprintf(page,
- "kgnilnd is not initialized yet\n");
+ rc = seq_printf(sf, "kgnilnd is not initialized yet\n");
return rc;
}
smp_rmb();
do_gettimeofday(&now);
- rc = sprintf(page, "time: %lu.%lu\n"
+ rc = seq_printf(sf, "time: %lu.%lu\n"
"ntx: %d\n"
"npeers: %d\n"
"nconns: %d\n"
"nfmablk: %d\n"
"n_mdd: %d\n"
"n_mdd_held: %d\n"
+ "n_eager_allocs: %d\n"
"GART map bytes: %ld\n"
"TX queued maps: %d\n"
"TX phys nmaps: %d\n"
"TX phys bytes: %lu\n"
"TX virt nmaps: %d\n"
- "TX virt bytes: "LPU64"\n"
+ "TX virt bytes: %llu\n"
"RDMAQ bytes_auth: %ld\n"
"RDMAQ bytes_left: %ld\n"
"RDMAQ nstalls: %d\n"
"SMSG fast_try: %d\n"
"SMSG fast_ok: %d\n"
"SMSG fast_block: %d\n"
- "SMSG ntx: %d\n"
- "SMSG tx_bytes: %ld\n"
- "SMSG nrx: %d\n"
- "SMSG rx_bytes: %ld\n"
- "RDMA ntx: %d\n"
- "RDMA tx_bytes: %ld\n"
- "RDMA nrx: %d\n"
- "RDMA rx_bytes: %ld\n"
+ "SMSG ntx: %u\n"
+ "SMSG tx_bytes: %lu\n"
+ "SMSG nrx: %u\n"
+ "SMSG rx_bytes: %lu\n"
+ "RDMA ntx: %u\n"
+ "RDMA tx_bytes: %lu\n"
+ "RDMA nrx: %u\n"
+ "RDMA rx_bytes: %lu\n"
"VMAP short: %d\n"
"VMAP cksum: %d\n"
"KMAP short: %d\n"
atomic_read(&dev->gnd_ndgrams),
atomic_read(&dev->gnd_nfmablk),
atomic_read(&dev->gnd_n_mdd), atomic_read(&dev->gnd_n_mdd_held),
+ atomic_read(&kgnilnd_data.kgn_neager_allocs),
atomic64_read(&dev->gnd_nbytes_map),
atomic_read(&dev->gnd_nq_map),
dev->gnd_map_nphys, dev->gnd_map_physnop * PAGE_SIZE,
return rc;
}
-static int
-kgnilnd_proc_stats_write(struct file *file, const char *ubuffer,
- unsigned long count, void *data)
+static ssize_t
+kgnilnd_proc_stats_write(struct file *file, const char __user *ubuffer,
+ size_t count, loff_t *ppos)
{
kgn_device_t *dev;
return count;
}
+static int
+kgnilnd_stats_seq_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, kgnilnd_stats_seq_show, PDE_DATA(inode));
+}
+
+static const struct file_operations kgn_stats_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_stats_seq_open,
+ .read = seq_read,
+ .write = kgnilnd_proc_stats_write,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
typedef struct {
kgn_device_t *gmdd_dev;
kgn_tx_t *gmdd_tx;
hndl.qword1 = tx->tx_map_key.qword1;
hndl.qword2 = tx->tx_map_key.qword2;
- seq_printf(s, "%p %x %16"LPF64"u %8d %#8x "LPX64"."LPX64"x\n",
+ seq_printf(s, "%p %x %16llu %8d %#8x %#llx.%#llxx\n",
tx, id, nob, physnop, buftype,
hndl.qword1, hndl.qword2);
spin_unlock(&dev->gnd_fmablk_lock);
if (live) {
- seq_printf(s, "%5d %4s %6d/%5d/%5d %9d %18p "LPX64"."LPX64"\n",
+ seq_printf(s, "%5d %4s %6d/%5d/%5d %9d %18p %#llx.%#llx\n",
(int) gseq->gsmsg_off, kgnilnd_fmablk_state2str(state),
avail_mboxs, held_mboxs, num_mboxs, blk_size,
fmablk, hndl.qword1, hndl.qword2);
static int
kgnilnd_smsg_seq_open(struct inode *inode, struct file *file)
{
- struct proc_dir_entry *dp = PDE(inode);
struct seq_file *sf;
int rc;
rc = seq_open(file, &kgn_smsg_sops);
if (rc == 0) {
sf = file->private_data;
- sf->private = dp->data;
+ sf->private = PDE_DATA(inode);
}
return rc;
"rx sq %u %dms/%dms "
"noop r/s %d/%d w/s/cq %lds/%lds/%lds "
"sched a/d %lds/%lds "
- "tx_re "LPD64" TO %ds %s\n",
+ "tx_re %lld TO %ds %s\n",
conn, peer ? libcfs_nid2str(peer->gnp_nid) : "<?>",
atomic_read(&conn->gnc_refcount),
kgnilnd_count_list(&conn->gnc_fmaq),
atomic_read(&conn->gnc_nlive_fma),
atomic_read(&conn->gnc_nlive_rdma),
- conn->gnc_tx_seq,
+ atomic_read(&conn->gnc_tx_seq),
jiffies_to_msecs(jiffies - conn->gnc_last_tx),
jiffies_to_msecs(jiffies - conn->gnc_last_tx_cq),
- conn->gnc_rx_seq,
+ atomic_read(&conn->gnc_rx_seq),
jiffies_to_msecs(jiffies - conn->gnc_last_rx),
jiffies_to_msecs(jiffies - conn->gnc_last_rx_cq),
atomic_read(&conn->gnc_reaper_noop),
#define KGN_DEBUG_PEER_NID_DEFAULT -1
static int kgnilnd_debug_peer_nid = KGN_DEBUG_PEER_NID_DEFAULT;
-static int
-kgnilnd_proc_peer_conns_write(struct file *file, const char *ubuffer,
- unsigned long count, void *data)
+static ssize_t
+kgnilnd_proc_peer_conns_write(struct file *file, const char __user *ubuffer,
+ size_t count, loff_t *ppos)
{
char dummy[8];
int rc;
*/
static int
-kgnilnd_proc_peer_conns_read(char *page, char **start, off_t off,
- int count, int *eof, void *data)
+kgnilnd_proc_peer_conns_seq_show(struct seq_file *sf, void *v)
{
kgn_peer_t *peer;
kgn_conn_t *conn;
struct tm ctm;
struct timespec now;
unsigned long jifs;
- int len = 0;
- int rc;
+ int rc = 0;
if (kgnilnd_debug_peer_nid == KGN_DEBUG_PEER_NID_DEFAULT) {
- rc = sprintf(page, "peer_conns not initialized\n");
+ rc = seq_printf(sf, "peer_conns not initialized\n");
return rc;
}
peer = kgnilnd_find_peer_locked(kgnilnd_debug_peer_nid);
if (peer == NULL) {
- rc = sprintf(page, "peer not found for this nid %d\n",
+ rc = seq_printf(sf, "peer not found for this nid %d\n",
kgnilnd_debug_peer_nid);
write_unlock(&kgnilnd_data.kgn_peer_conn_lock);
return rc;
}
list_for_each_entry(conn, &peer->gnp_conns, gnc_list) {
- len += scnprintf(page, count - len,
+ rc = seq_printf(sf,
"%04ld-%02d-%02dT%02d:%02d:%02d.%06ld %s "
"mbox adr %p "
"dg type %s "
conn->gnc_close_recvd,
conn->gnc_error,
conn->gnc_peer_error,
- conn->gnc_tx_seq,
+ atomic_read(&conn->gnc_tx_seq),
jiffies_to_msecs(jifs - conn->gnc_last_tx),
jiffies_to_msecs(jifs - conn->gnc_last_tx_cq),
- conn->gnc_rx_seq,
+ atomic_read(&conn->gnc_rx_seq),
jiffies_to_msecs(jifs - conn->gnc_first_rx),
jiffies_to_msecs(jifs - conn->gnc_last_rx),
jiffies_to_msecs(jifs - conn->gnc_last_rx_cq),
}
write_unlock(&kgnilnd_data.kgn_peer_conn_lock);
- return len;
+ return rc;
}
static int
+kgnilnd_peer_conns_seq_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, kgnilnd_proc_peer_conns_seq_show,
+ PDE_DATA(inode));
+}
+
+static const struct file_operations kgn_peer_conns_fops = {
+ .owner = THIS_MODULE,
+ .open = kgnilnd_peer_conns_seq_open,
+ .read = seq_read,
+ .write = kgnilnd_proc_peer_conns_write,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+static int
kgnilnd_conn_seq_open(struct inode *inode, struct file *file)
{
- struct proc_dir_entry *dp = PDE(inode);
struct seq_file *sf;
int rc;
rc = seq_open(file, &kgn_conn_sops);
if (rc == 0) {
sf = file->private_data;
- sf->private = dp->data;
+ sf->private = PDE_DATA(inode);
}
return rc;
read_unlock(&kgnilnd_data.kgn_peer_conn_lock);
- seq_printf(s, "%p->%s [%d] %s NIC 0x%x q %d conn %c purg %d "
- "last %d@%dms dgram %d@%dms "
- "reconn %dms to %lus \n",
+ seq_printf(s, "%p->%s [%d] %s NIC 0x%x q %d conn %c purg %d last %d@%dms dgram %d@%dms reconn %dms to %lus \n",
peer, libcfs_nid2str(peer->gnp_nid),
atomic_read(&peer->gnp_refcount),
- (peer->gnp_down == GNILND_RCA_NODE_DOWN) ? "down" : "up",
+ (peer->gnp_state == GNILND_PEER_DOWN) ? "down" :
+ peer->gnp_state == GNILND_PEER_TIMED_OUT ? "timedout" : "up",
peer->gnp_host_id,
kgnilnd_count_list(&peer->gnp_tx_queue),
conn_str,
static int
kgnilnd_peer_seq_open(struct inode *inode, struct file *file)
{
- struct proc_dir_entry *dp = PDE(inode);
struct seq_file *sf;
int rc;
rc = seq_open(file, &kgn_peer_sops);
if (rc == 0) {
sf = file->private_data;
- sf->private = dp->data;
+ sf->private = PDE_DATA(inode);
}
return rc;
}
/* Initialize CKSUM_TEST */
- pde = create_proc_entry(GNILND_PROC_CKSUM_TEST, 0200, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_CKSUM_TEST, 0200, kgn_proc_root,
+ &kgn_cksum_test_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_CKSUM_TEST);
GOTO(remove_dir, rc = -ENOENT);
}
- pde->data = NULL;
- pde->write_proc = kgnilnd_proc_cksum_test_write;
-
/* Initialize STATS */
- pde = create_proc_entry(GNILND_PROC_STATS, 0644, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_STATS, 0644, kgn_proc_root,
+ &kgn_stats_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_STATS);
GOTO(remove_test, rc = -ENOENT);
}
- pde->data = NULL;
- pde->read_proc = kgnilnd_proc_stats_read;
- pde->write_proc = kgnilnd_proc_stats_write;
-
/* Initialize MDD */
- pde = create_proc_entry(GNILND_PROC_MDD, 0444, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_MDD, 0444, kgn_proc_root, &kgn_mdd_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_MDD);
GOTO(remove_stats, rc = -ENOENT);
}
- pde->data = NULL;
- pde->proc_fops = &kgn_mdd_fops;
-
/* Initialize SMSG */
- pde = create_proc_entry(GNILND_PROC_SMSG, 0444, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_SMSG, 0444, kgn_proc_root,
+ &kgn_smsg_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_SMSG);
GOTO(remove_mdd, rc = -ENOENT);
}
- pde->data = NULL;
- pde->proc_fops = &kgn_smsg_fops;
-
/* Initialize CONN */
- pde = create_proc_entry(GNILND_PROC_CONN, 0444, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_CONN, 0444, kgn_proc_root,
+ &kgn_conn_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_CONN);
GOTO(remove_smsg, rc = -ENOENT);
}
- pde->data = NULL;
- pde->proc_fops = &kgn_conn_fops;
-
/* Initialize peer conns debug */
- pde = create_proc_entry(GNILND_PROC_PEER_CONNS, 0644, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_PEER_CONNS, 0644, kgn_proc_root,
+ &kgn_peer_conns_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_PEER_CONNS);
GOTO(remove_conn, rc = -ENOENT);
}
- pde->data = NULL;
- pde->read_proc = kgnilnd_proc_peer_conns_read;
- pde->write_proc = kgnilnd_proc_peer_conns_write;
-
/* Initialize PEER */
- pde = create_proc_entry(GNILND_PROC_PEER, 0444, kgn_proc_root);
+ pde = proc_create(GNILND_PROC_PEER, 0444, kgn_proc_root,
+ &kgn_peer_fops);
if (pde == NULL) {
CERROR("couldn't create proc entry %s\n", GNILND_PROC_PEER);
GOTO(remove_pc, rc = -ENOENT);
}
-
- pde->data = NULL;
- pde->proc_fops = &kgn_peer_fops;
RETURN_EXIT;
remove_pc:
remove_test:
remove_proc_entry(GNILND_PROC_CKSUM_TEST, kgn_proc_root);
remove_dir:
- remove_proc_entry(kgn_proc_root->name, NULL);
+ remove_proc_entry(libcfs_lnd2modname(GNILND), NULL);
RETURN_EXIT;
}
remove_proc_entry(GNILND_PROC_SMSG, kgn_proc_root);
remove_proc_entry(GNILND_PROC_STATS, kgn_proc_root);
remove_proc_entry(GNILND_PROC_CKSUM_TEST, kgn_proc_root);
- remove_proc_entry(kgn_proc_root->name, NULL);
+ remove_proc_entry(libcfs_lnd2modname(GNILND), NULL);
}