X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fklnds%2Fgnilnd%2Fgnilnd_proc.c;h=ab2eda97a976c72fafa928d2c6add4a0e30fe3cc;hb=refs%2Fchanges%2F96%2F39396%2F2;hp=38ef64a31326c73717084be8de20b40ad42ebfcd;hpb=59071a8334bbc1a3a6d31565b7474063438d1f43;p=fs%2Flustre-release.git diff --git a/lnet/klnds/gnilnd/gnilnd_proc.c b/lnet/klnds/gnilnd/gnilnd_proc.c index 38ef64a..ab2eda9 100644 --- a/lnet/klnds/gnilnd/gnilnd_proc.c +++ b/lnet/klnds/gnilnd/gnilnd_proc.c @@ -1,7 +1,10 @@ /* - * Copyright (C) 2009-2012 Cray, Inc. + * Copyright (C) 2009-2012, 2016 Cray, Inc. + * + * Copyright (c) 2013, 2015, Intel Corporation. * * Author: Nic Henke + * Author: James Shimek * * This file is part of Lustre, http://www.lustre.org. * @@ -24,6 +27,7 @@ #define DEBUG_SUBSYSTEM S_LND #include "gnilnd.h" #include +#include #define GNILND_PROC_STATS "stats" #define GNILND_PROC_MDD "mdd" @@ -36,38 +40,39 @@ static int _kgnilnd_proc_run_cksum_test(int caseno, int nloops, int nob) { - lnet_kiov_t *src, *dest; + struct bio_vec *src, *dest; struct timespec begin, end, diff; int niov; + int rc = 0; int i = 0, j = 0, n; __u16 cksum, cksum2; __u64 mbytes; - LIBCFS_ALLOC(src, LNET_MAX_IOV * sizeof(lnet_kiov_t)); - LIBCFS_ALLOC(dest, LNET_MAX_IOV * sizeof(lnet_kiov_t)); + CFS_ALLOC_PTR_ARRAY(src, LNET_MAX_IOV); + CFS_ALLOC_PTR_ARRAY(dest, LNET_MAX_IOV); if (src == NULL || dest == NULL) { CERROR("couldn't allocate iovs\n"); - GOTO(unwind, -ENOMEM); + GOTO(unwind, rc = -ENOMEM); } 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].bv_offset = 0; + src[i].bv_len = PAGE_SIZE; + src[i].bv_page = alloc_page(GFP_KERNEL | __GFP_ZERO); - if (src[i].kiov_page == NULL) { + if (src[i].bv_page == NULL) { CERROR("couldn't allocate page %d\n", i); - GOTO(unwind, -ENOMEM); + GOTO(unwind, rc = -ENOMEM); } - 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].bv_offset = 0; + dest[i].bv_len = PAGE_SIZE; + dest[i].bv_page = alloc_page(GFP_KERNEL | __GFP_ZERO); - if (dest[i].kiov_page == NULL) { + if (dest[i].bv_page == NULL) { CERROR("couldn't allocate page %d\n", i); - GOTO(unwind, -ENOMEM); + GOTO(unwind, rc = -ENOMEM); } } @@ -76,35 +81,35 @@ _kgnilnd_proc_run_cksum_test(int caseno, int nloops, int nob) if (niov > LNET_MAX_IOV) { CERROR("bytes %d too large, requires niov %d > %d\n", nob, niov, LNET_MAX_IOV); - GOTO(unwind, -E2BIG); + GOTO(unwind, rc = -E2BIG); } /* setup real data */ - src[0].kiov_offset = 317; - dest[0].kiov_offset = 592; + src[0].bv_offset = 317; + dest[0].bv_offset = 592; switch (caseno) { default: /* odd -> even */ break; case 1: /* odd -> odd */ - dest[0].kiov_offset -= 1; + dest[0].bv_offset -= 1; break; case 2: /* even -> even */ - src[0].kiov_offset += 1; + src[0].bv_offset += 1; break; case 3: /* even -> odd */ - src[0].kiov_offset += 1; - dest[0].kiov_offset -= 1; + src[0].bv_offset += 1; + dest[0].bv_offset -= 1; } - src[0].kiov_len = PAGE_SIZE - src[0].kiov_offset; - dest[0].kiov_len = PAGE_SIZE - dest[0].kiov_offset; + src[0].bv_len = PAGE_SIZE - src[0].bv_offset; + dest[0].bv_len = PAGE_SIZE - dest[0].bv_offset; for (i = 0; i < niov; i++) { - memset(page_address(src[i].kiov_page) + src[i].kiov_offset, - 0xf0 + i, src[i].kiov_len); + memset(page_address(src[i].bv_page) + src[i].bv_offset, + 0xf0 + i, src[i].bv_len); } lnet_copy_kiov2kiov(niov, dest, 0, niov, src, 0, nob); @@ -112,63 +117,65 @@ _kgnilnd_proc_run_cksum_test(int caseno, int nloops, int nob) getnstimeofday(&begin); for (n = 0; n < nloops; n++) { - CDEBUG(D_BUFFS, "case %d loop %d src %d dest %d nob %d niov %d\n", - caseno, n, src[0].kiov_offset, dest[0].kiov_offset, nob, niov); + CDEBUG(D_BUFFS, + "case %d loop %d src %d dest %d nob %d niov %d\n", + caseno, n, src[0].bv_offset, dest[0].bv_offset, nob, + niov); cksum = kgnilnd_cksum_kiov(niov, src, 0, nob - (n % nob), 1); cksum2 = kgnilnd_cksum_kiov(niov, dest, 0, nob - (n % nob), 1); if (cksum != cksum2) { CERROR("case %d loop %d different checksums %x expected %x\n", j, n, cksum2, cksum); - GOTO(unwind, -ENOKEY); + GOTO(unwind, rc = -ENOKEY); } } 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: CDEBUG(D_NET, "freeing %d pages\n", i); for (i -= 1; i >= 0; i--) { - if (src[i].kiov_page != NULL) { - __free_page(src[i].kiov_page); - } - if (dest[i].kiov_page != NULL) { - __free_page(dest[i].kiov_page); - } + if (src[i].bv_page) + __free_page(src[i].bv_page); + + if (dest[i].bv_page) + __free_page(dest[i].bv_page); } if (src != NULL) - LIBCFS_FREE(src, LNET_MAX_IOV * sizeof(lnet_kiov_t)); + CFS_FREE_PTR_ARRAY(src, LNET_MAX_IOV); if (dest != NULL) - LIBCFS_FREE(dest, LNET_MAX_IOV * sizeof(lnet_kiov_t)); - return 0; + CFS_FREE_PTR_ARRAY(dest, LNET_MAX_IOV); + 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; int rc; + ENTRY; if (kgnilnd_data.kgn_init < GNILND_INIT_ALL) { CERROR("can't run cksum test, kgnilnd is not initialized yet\n"); - return -ENOSYS; + RETURN(-ENOSYS); } if (count >= sizeof(dummy) || count == 0) - return -EINVAL; + RETURN(-EINVAL); if (copy_from_user(dummy, ubuffer, count)) - return -EFAULT; + RETURN(-EFAULT); if (sscanf(dummy, "%d:%d:%d", &testno, &nloops, &nbytes) == 3) { rc = _kgnilnd_proc_run_cksum_test(testno, nloops, nbytes); @@ -183,17 +190,28 @@ kgnilnd_proc_cksum_test_write(struct file *file, const char *ubuffer, } 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; + struct timespec64 now; if (kgnilnd_data.kgn_init < GNILND_INIT_ALL) { - rc = sprintf(page, - "kgnilnd is not initialized yet\n"); - return rc; + seq_printf(sf, "kgnilnd is not initialized yet\n"); + return 0; } /* only do the first device */ @@ -201,82 +219,87 @@ kgnilnd_proc_stats_read(char *page, char **start, off_t off, /* sampling is racy, but so is reading this file! */ smp_rmb(); - do_gettimeofday(&now); - - rc = sprintf(page, "time: %lu.%lu\n" - "ntx: %d\n" - "npeers: %d\n" - "nconns: %d\n" - "nEPs: %d\n" - "ndgrams: %d\n" - "nfmablk: %d\n" - "n_mdd: %d\n" - "n_mdd_held: %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" - "RDMAQ bytes_auth: %ld\n" - "RDMAQ bytes_left: %ld\n" - "RDMAQ nstalls: %d\n" - "dev mutex delay: %ld\n" - "dev n_yield: %d\n" - "dev n_schedule: %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" - "VMAP short: %d\n" - "VMAP cksum: %d\n" - "KMAP short: %d\n" - "RDMA REV length: %d\n" - "RDMA REV offset: %d\n" - "RDMA REV copy: %d\n", - now.tv_sec, now.tv_usec, - atomic_read(&kgnilnd_data.kgn_ntx), - atomic_read(&kgnilnd_data.kgn_npeers), - atomic_read(&kgnilnd_data.kgn_nconns), - atomic_read(&dev->gnd_neps), - atomic_read(&dev->gnd_ndgrams), - atomic_read(&dev->gnd_nfmablk), - atomic_read(&dev->gnd_n_mdd), atomic_read(&dev->gnd_n_mdd_held), - atomic64_read(&dev->gnd_nbytes_map), - atomic_read(&dev->gnd_nq_map), - dev->gnd_map_nphys, dev->gnd_map_physnop * PAGE_SIZE, - dev->gnd_map_nvirt, dev->gnd_map_virtnob, - atomic64_read(&dev->gnd_rdmaq_bytes_out), - atomic64_read(&dev->gnd_rdmaq_bytes_ok), - atomic_read(&dev->gnd_rdmaq_nstalls), - dev->gnd_mutex_delay, - atomic_read(&dev->gnd_n_yield), atomic_read(&dev->gnd_n_schedule), - atomic_read(&dev->gnd_fast_try), atomic_read(&dev->gnd_fast_ok), - atomic_read(&dev->gnd_fast_block), - atomic_read(&dev->gnd_short_ntx), atomic64_read(&dev->gnd_short_txbytes), - atomic_read(&dev->gnd_short_nrx), atomic64_read(&dev->gnd_short_rxbytes), - atomic_read(&dev->gnd_rdma_ntx), atomic64_read(&dev->gnd_rdma_txbytes), - atomic_read(&dev->gnd_rdma_nrx), atomic64_read(&dev->gnd_rdma_rxbytes), - atomic_read(&kgnilnd_data.kgn_nvmap_short), - atomic_read(&kgnilnd_data.kgn_nvmap_cksum), - atomic_read(&kgnilnd_data.kgn_nkmap_short), - atomic_read(&kgnilnd_data.kgn_rev_length), - atomic_read(&kgnilnd_data.kgn_rev_offset), - atomic_read(&kgnilnd_data.kgn_rev_copy_buff)); + ktime_get_ts64(&now); + + seq_printf(sf, "time: %llu.%lu\n" + "ntx: %d\n" + "npeers: %d\n" + "nconns: %d\n" + "nEPs: %d\n" + "ndgrams: %d\n" + "nfmablk: %d\n" + "n_mdd: %d\n" + "n_mdd_held: %d\n" + "n_eager_allocs: %d\n" + "GART map bytes: %lld\n" + "TX queued maps: %d\n" + "TX phys nmaps: %d\n" + "TX phys bytes: %lu\n" + "RDMAQ bytes_auth: %lld\n" + "RDMAQ bytes_left: %lld\n" + "RDMAQ nstalls: %d\n" + "dev mutex delay: %ld\n" + "dev n_yield: %d\n" + "dev n_schedule: %d\n" + "SMSG fast_try: %d\n" + "SMSG fast_ok: %d\n" + "SMSG fast_block: %d\n" + "SMSG ntx: %u\n" + "SMSG tx_bytes: %llu\n" + "SMSG nrx: %u\n" + "SMSG rx_bytes: %llu\n" + "RDMA ntx: %u\n" + "RDMA tx_bytes: %llu\n" + "RDMA nrx: %u\n" + "RDMA rx_bytes: %llu\n" + "VMAP short: %d\n" + "VMAP cksum: %d\n" + "KMAP short: %d\n" + "RDMA REV length: %d\n" + "RDMA REV offset: %d\n" + "RDMA REV copy: %d\n", + (s64)now.tv_sec, now.tv_nsec, + atomic_read(&kgnilnd_data.kgn_ntx), + atomic_read(&kgnilnd_data.kgn_npeers), + atomic_read(&kgnilnd_data.kgn_nconns), + atomic_read(&dev->gnd_neps), + 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), + (s64)atomic64_read(&dev->gnd_nbytes_map), + atomic_read(&dev->gnd_nq_map), + dev->gnd_map_nphys, dev->gnd_map_physnop * PAGE_SIZE, + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_out), + (s64)atomic64_read(&dev->gnd_rdmaq_bytes_ok), + atomic_read(&dev->gnd_rdmaq_nstalls), + dev->gnd_mutex_delay, + atomic_read(&dev->gnd_n_yield), + atomic_read(&dev->gnd_n_schedule), + atomic_read(&dev->gnd_fast_try), + atomic_read(&dev->gnd_fast_ok), + atomic_read(&dev->gnd_fast_block), + atomic_read(&dev->gnd_short_ntx), + (s64)atomic64_read(&dev->gnd_short_txbytes), + atomic_read(&dev->gnd_short_nrx), + (s64)atomic64_read(&dev->gnd_short_rxbytes), + atomic_read(&dev->gnd_rdma_ntx), + (s64)atomic64_read(&dev->gnd_rdma_txbytes), + atomic_read(&dev->gnd_rdma_nrx), + (s64)atomic64_read(&dev->gnd_rdma_rxbytes), + atomic_read(&kgnilnd_data.kgn_nvmap_short), + atomic_read(&kgnilnd_data.kgn_nvmap_cksum), + atomic_read(&kgnilnd_data.kgn_nkmap_short), + atomic_read(&kgnilnd_data.kgn_rev_length), + atomic_read(&kgnilnd_data.kgn_rev_offset), + atomic_read(&kgnilnd_data.kgn_rev_copy_buff)); - return rc; + return 0; } -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; @@ -311,6 +334,21 @@ kgnilnd_proc_stats_write(struct file *file, const char *ubuffer, 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; @@ -419,10 +457,10 @@ kgnilnd_mdd_seq_next(struct seq_file *s, void *iter, loff_t *pos) loff_t next = *pos + 1; rc = kgnilnd_mdd_seq_seek(gseq, next); + *pos = next; if (rc != 0) { return NULL; } - *pos = next; return gseq; } @@ -454,14 +492,14 @@ kgnilnd_mdd_seq_show(struct seq_file *s, void *iter) 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); return 0; } -static struct seq_operations kgn_mdd_sops = { +static const struct seq_operations kgn_mdd_sops = { .start = kgnilnd_mdd_seq_start, .stop = kgnilnd_mdd_seq_stop, .next = kgnilnd_mdd_seq_next, @@ -485,12 +523,12 @@ kgnilnd_mdd_seq_open(struct inode *inode, struct file *file) return rc; } -static struct file_operations kgn_mdd_fops = { - .owner = THIS_MODULE, - .open = kgnilnd_mdd_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, +static const struct file_operations kgn_mdd_fops = { + .owner = THIS_MODULE, + .open = kgnilnd_mdd_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, }; typedef struct { @@ -608,11 +646,11 @@ kgnilnd_smsg_seq_next(struct seq_file *s, void *iter, loff_t *pos) loff_t next = *pos + 1; rc = kgnilnd_smsg_seq_seek(gseq, next); + *pos = next; if (rc != 0) { LIBCFS_FREE(gseq, sizeof(*gseq)); return NULL; } - *pos = next; return gseq; } @@ -660,7 +698,7 @@ kgnilnd_smsg_seq_show(struct seq_file *s, void *iter) 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); @@ -674,7 +712,7 @@ kgnilnd_smsg_seq_show(struct seq_file *s, void *iter) return 0; } -static struct seq_operations kgn_smsg_sops = { +static const struct seq_operations kgn_smsg_sops = { .start = kgnilnd_smsg_seq_start, .stop = kgnilnd_smsg_seq_stop, .next = kgnilnd_smsg_seq_next, @@ -685,25 +723,24 @@ static struct seq_operations kgn_smsg_sops = { 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; } -static struct file_operations kgn_smsg_fops = { - .owner = THIS_MODULE, - .open = kgnilnd_smsg_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, +static const struct file_operations kgn_smsg_fops = { + .owner = THIS_MODULE, + .open = kgnilnd_smsg_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, }; typedef struct { @@ -825,11 +862,11 @@ kgnilnd_conn_seq_next(struct seq_file *s, void *iter, loff_t *pos) loff_t next = *pos + 1; rc = kgnilnd_conn_seq_seek(gseq, next); + *pos = next; if (rc != 0) { LIBCFS_FREE(gseq, sizeof(*gseq)); return NULL; } - *pos = next; return gseq; } @@ -869,16 +906,16 @@ kgnilnd_conn_seq_show(struct seq_file *s, void *iter) "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), @@ -898,7 +935,7 @@ kgnilnd_conn_seq_show(struct seq_file *s, void *iter) return 0; } -static struct seq_operations kgn_conn_sops = { +static const struct seq_operations kgn_conn_sops = { .start = kgnilnd_conn_seq_start, .stop = kgnilnd_conn_seq_stop, .next = kgnilnd_conn_seq_next, @@ -909,9 +946,9 @@ static struct seq_operations kgn_conn_sops = { #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; @@ -953,98 +990,110 @@ kgnilnd_proc_peer_conns_write(struct file *file, const char *ubuffer, */ 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; if (kgnilnd_debug_peer_nid == KGN_DEBUG_PEER_NID_DEFAULT) { - rc = sprintf(page, "peer_conns not initialized\n"); - return rc; + seq_printf(sf, "peer_conns not initialized\n"); + return 0; } /* sample date/time stamp - print time in UTC * 2012-12-11T16:06:16.966751 123@gni ... */ getnstimeofday(&now); - time_to_tm(now.tv_sec, 0, &ctm); + time64_to_tm(now.tv_sec, 0, &ctm); jifs = jiffies; write_lock(&kgnilnd_data.kgn_peer_conn_lock); peer = kgnilnd_find_peer_locked(kgnilnd_debug_peer_nid); if (peer == NULL) { - rc = sprintf(page, "peer not found for this nid %d\n", + 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; + return 0; } list_for_each_entry(conn, &peer->gnp_conns, gnc_list) { - len += scnprintf(page, count - len, - "%04ld-%02d-%02dT%02d:%02d:%02d.%06ld %s " - "mbox adr %p " - "dg type %s " - "%s " - "purg %d " - "close s/r %d/%d " - "err %d peer err %d " - "tx sq %u %dms/%dms " - "rx sq %u %dms/%dms/%dms " - "tx retran %lld\n", - ctm.tm_year+1900, ctm.tm_mon+1, ctm.tm_mday, - ctm.tm_hour, ctm.tm_min, ctm.tm_sec, now.tv_nsec, - libcfs_nid2str(peer->gnp_nid), - conn->remote_mbox_addr, - kgnilnd_conn_dgram_type2str(conn->gnc_dgram_type), - kgnilnd_conn_state2str(conn), - conn->gnc_in_purgatory, - conn->gnc_close_sent, - conn->gnc_close_recvd, - conn->gnc_error, - conn->gnc_peer_error, - 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, - 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), - conn->gnc_tx_retrans); + seq_printf(sf, + "%04ld-%02d-%02dT%02d:%02d:%02d.%06ld %s " + "mbox adr %p " + "dg type %s " + "%s " + "purg %d " + "close s/r %d/%d " + "err %d peer err %d " + "tx sq %u %dms/%dms " + "rx sq %u %dms/%dms/%dms " + "tx retran %lld\n", + ctm.tm_year+1900, ctm.tm_mon+1, ctm.tm_mday, + ctm.tm_hour, ctm.tm_min, ctm.tm_sec, now.tv_nsec, + libcfs_nid2str(peer->gnp_nid), + conn->remote_mbox_addr, + kgnilnd_conn_dgram_type2str(conn->gnc_dgram_type), + kgnilnd_conn_state2str(conn), + conn->gnc_in_purgatory, + conn->gnc_close_sent, + conn->gnc_close_recvd, + conn->gnc_error, + conn->gnc_peer_error, + atomic_read(&conn->gnc_tx_seq), + jiffies_to_msecs(jifs - conn->gnc_last_tx), + jiffies_to_msecs(jifs - conn->gnc_last_tx_cq), + 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), + conn->gnc_tx_retrans); } write_unlock(&kgnilnd_data.kgn_peer_conn_lock); - return len; + return 0; +} + +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; } -static struct file_operations kgn_conn_fops = { - .owner = THIS_MODULE, - .open = kgnilnd_conn_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, +static const struct file_operations kgn_conn_fops = { + .owner = THIS_MODULE, + .open = kgnilnd_conn_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, }; typedef struct { @@ -1166,11 +1215,11 @@ kgnilnd_peer_seq_next(struct seq_file *s, void *iter, loff_t *pos) loff_t next = *pos + 1; rc = kgnilnd_peer_seq_seek(gseq, next); + *pos = next; if (rc != 0) { LIBCFS_FREE(gseq, sizeof(*gseq)); return NULL; } - *pos = next; return gseq; } @@ -1216,18 +1265,17 @@ kgnilnd_peer_seq_show(struct seq_file *s, void *iter) 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@%lldms 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, purg_count, peer->gnp_last_errno, - jiffies_to_msecs(jiffies - peer->gnp_last_alive), + (ktime_get_seconds() - peer->gnp_last_alive) * MSEC_PER_SEC, peer->gnp_last_dgram_errno, jiffies_to_msecs(jiffies - peer->gnp_last_dgram_time), peer->gnp_reconnect_interval != 0 @@ -1240,7 +1288,7 @@ kgnilnd_peer_seq_show(struct seq_file *s, void *iter) return 0; } -static struct seq_operations kgn_peer_sops = { +static const struct seq_operations kgn_peer_sops = { .start = kgnilnd_peer_seq_start, .stop = kgnilnd_peer_seq_stop, .next = kgnilnd_peer_seq_next, @@ -1250,25 +1298,24 @@ static struct seq_operations kgn_peer_sops = { 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; } -static struct file_operations kgn_peer_fops = { - .owner = THIS_MODULE, - .open = kgnilnd_peer_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, +static const struct file_operations kgn_peer_fops = { + .owner = THIS_MODULE, + .open = kgnilnd_peer_seq_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, }; static struct proc_dir_entry *kgn_proc_root; @@ -1289,83 +1336,59 @@ kgnilnd_proc_init(void) } /* 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); - rc = -ENOENT; - GOTO(remove_dir, rc); + 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); - rc = -ENOENT; - GOTO(remove_test, rc); + 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); - rc = -ENOENT; - GOTO(remove_stats, rc); + 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); - rc = -ENOENT; - GOTO(remove_mdd, rc); + 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); - rc = -ENOENT; - GOTO(remove_smsg, rc); + 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); - rc = -ENOENT; - GOTO(remove_conn, rc); + 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); - rc = -ENOENT; - GOTO(remove_pc, rc); + GOTO(remove_pc, rc = -ENOENT); } - - pde->data = NULL; - pde->proc_fops = &kgn_peer_fops; RETURN_EXIT; remove_pc: @@ -1381,7 +1404,7 @@ remove_stats: 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; } @@ -1396,5 +1419,5 @@ kgnilnd_proc_fini(void) 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); }