Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

NTB: ntb_transport: Use seq_file for QP stats debugfs

The ./qp*/stats debugfs file for each NTB transport QP is currently
implemented with a hand-crafted kmalloc() buffer and a series of
scnprintf() calls. This is a pre-seq_file style pattern and makes future
extensions easy to truncate.

Convert the stats file to use the seq_file helpers via
DEFINE_SHOW_ATTRIBUTE(), which simplifies the code and lets the seq_file
core handle buffering and partial reads.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Koichiro Den <den@valinux.co.jp>
Signed-off-by: Jon Mason <jdmason@kudzu.us>

authored by

Koichiro Den and committed by
Jon Mason
8c1f92ca 6a4b5058

+35 -89
+35 -89
drivers/ntb/ntb_transport.c
··· 58 58 #include <linux/module.h> 59 59 #include <linux/pci.h> 60 60 #include <linux/slab.h> 61 + #include <linux/seq_file.h> 61 62 #include <linux/types.h> 62 63 #include <linux/uaccess.h> 63 64 #include <linux/mutex.h> ··· 483 482 } 484 483 EXPORT_SYMBOL_GPL(ntb_transport_unregister_client); 485 484 486 - static ssize_t debugfs_read(struct file *filp, char __user *ubuf, size_t count, 487 - loff_t *offp) 485 + static int ntb_qp_debugfs_stats_show(struct seq_file *s, void *v) 488 486 { 489 - struct ntb_transport_qp *qp; 490 - char *buf; 491 - ssize_t ret, out_offset, out_count; 492 - 493 - qp = filp->private_data; 487 + struct ntb_transport_qp *qp = s->private; 494 488 495 489 if (!qp || !qp->link_is_up) 496 490 return 0; 497 491 498 - out_count = 1000; 492 + seq_puts(s, "\nNTB QP stats:\n\n"); 499 493 500 - buf = kmalloc(out_count, GFP_KERNEL); 501 - if (!buf) 502 - return -ENOMEM; 494 + seq_printf(s, "rx_bytes - \t%llu\n", qp->rx_bytes); 495 + seq_printf(s, "rx_pkts - \t%llu\n", qp->rx_pkts); 496 + seq_printf(s, "rx_memcpy - \t%llu\n", qp->rx_memcpy); 497 + seq_printf(s, "rx_async - \t%llu\n", qp->rx_async); 498 + seq_printf(s, "rx_ring_empty - %llu\n", qp->rx_ring_empty); 499 + seq_printf(s, "rx_err_no_buf - %llu\n", qp->rx_err_no_buf); 500 + seq_printf(s, "rx_err_oflow - \t%llu\n", qp->rx_err_oflow); 501 + seq_printf(s, "rx_err_ver - \t%llu\n", qp->rx_err_ver); 502 + seq_printf(s, "rx_buff - \t0x%p\n", qp->rx_buff); 503 + seq_printf(s, "rx_index - \t%u\n", qp->rx_index); 504 + seq_printf(s, "rx_max_entry - \t%u\n", qp->rx_max_entry); 505 + seq_printf(s, "rx_alloc_entry - \t%u\n\n", qp->rx_alloc_entry); 503 506 504 - out_offset = 0; 505 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 506 - "\nNTB QP stats:\n\n"); 507 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 508 - "rx_bytes - \t%llu\n", qp->rx_bytes); 509 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 510 - "rx_pkts - \t%llu\n", qp->rx_pkts); 511 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 512 - "rx_memcpy - \t%llu\n", qp->rx_memcpy); 513 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 514 - "rx_async - \t%llu\n", qp->rx_async); 515 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 516 - "rx_ring_empty - %llu\n", qp->rx_ring_empty); 517 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 518 - "rx_err_no_buf - %llu\n", qp->rx_err_no_buf); 519 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 520 - "rx_err_oflow - \t%llu\n", qp->rx_err_oflow); 521 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 522 - "rx_err_ver - \t%llu\n", qp->rx_err_ver); 523 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 524 - "rx_buff - \t0x%p\n", qp->rx_buff); 525 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 526 - "rx_index - \t%u\n", qp->rx_index); 527 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 528 - "rx_max_entry - \t%u\n", qp->rx_max_entry); 529 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 530 - "rx_alloc_entry - \t%u\n\n", qp->rx_alloc_entry); 507 + seq_printf(s, "tx_bytes - \t%llu\n", qp->tx_bytes); 508 + seq_printf(s, "tx_pkts - \t%llu\n", qp->tx_pkts); 509 + seq_printf(s, "tx_memcpy - \t%llu\n", qp->tx_memcpy); 510 + seq_printf(s, "tx_async - \t%llu\n", qp->tx_async); 511 + seq_printf(s, "tx_ring_full - \t%llu\n", qp->tx_ring_full); 512 + seq_printf(s, "tx_err_no_buf - %llu\n", qp->tx_err_no_buf); 513 + seq_printf(s, "tx_mw - \t0x%p\n", qp->tx_mw); 514 + seq_printf(s, "tx_index (H) - \t%u\n", qp->tx_index); 515 + seq_printf(s, "RRI (T) - \t%u\n", qp->remote_rx_info->entry); 516 + seq_printf(s, "tx_max_entry - \t%u\n", qp->tx_max_entry); 517 + seq_printf(s, "free tx - \t%u\n", ntb_transport_tx_free_entry(qp)); 518 + seq_putc(s, '\n'); 531 519 532 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 533 - "tx_bytes - \t%llu\n", qp->tx_bytes); 534 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 535 - "tx_pkts - \t%llu\n", qp->tx_pkts); 536 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 537 - "tx_memcpy - \t%llu\n", qp->tx_memcpy); 538 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 539 - "tx_async - \t%llu\n", qp->tx_async); 540 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 541 - "tx_ring_full - \t%llu\n", qp->tx_ring_full); 542 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 543 - "tx_err_no_buf - %llu\n", qp->tx_err_no_buf); 544 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 545 - "tx_mw - \t0x%p\n", qp->tx_mw); 546 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 547 - "tx_index (H) - \t%u\n", qp->tx_index); 548 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 549 - "RRI (T) - \t%u\n", 550 - qp->remote_rx_info->entry); 551 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 552 - "tx_max_entry - \t%u\n", qp->tx_max_entry); 553 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 554 - "free tx - \t%u\n", 555 - ntb_transport_tx_free_entry(qp)); 520 + seq_printf(s, "Using TX DMA - \t%s\n", qp->tx_dma_chan ? "Yes" : "No"); 521 + seq_printf(s, "Using RX DMA - \t%s\n", qp->rx_dma_chan ? "Yes" : "No"); 522 + seq_printf(s, "QP Link - \t%s\n", qp->link_is_up ? "Up" : "Down"); 523 + seq_putc(s, '\n'); 556 524 557 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 558 - "\n"); 559 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 560 - "Using TX DMA - \t%s\n", 561 - qp->tx_dma_chan ? "Yes" : "No"); 562 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 563 - "Using RX DMA - \t%s\n", 564 - qp->rx_dma_chan ? "Yes" : "No"); 565 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 566 - "QP Link - \t%s\n", 567 - qp->link_is_up ? "Up" : "Down"); 568 - out_offset += scnprintf(buf + out_offset, out_count - out_offset, 569 - "\n"); 570 - 571 - if (out_offset > out_count) 572 - out_offset = out_count; 573 - 574 - ret = simple_read_from_buffer(ubuf, count, offp, buf, out_offset); 575 - kfree(buf); 576 - return ret; 525 + return 0; 577 526 } 578 - 579 - static const struct file_operations ntb_qp_debugfs_stats = { 580 - .owner = THIS_MODULE, 581 - .open = simple_open, 582 - .read = debugfs_read, 583 - }; 527 + DEFINE_SHOW_ATTRIBUTE(ntb_qp_debugfs_stats); 584 528 585 529 static void ntb_list_add(spinlock_t *lock, struct list_head *entry, 586 530 struct list_head *list) ··· 1206 1260 1207 1261 qp->debugfs_stats = debugfs_create_file("stats", S_IRUSR, 1208 1262 qp->debugfs_dir, qp, 1209 - &ntb_qp_debugfs_stats); 1263 + &ntb_qp_debugfs_stats_fops); 1210 1264 } else { 1211 1265 qp->debugfs_dir = NULL; 1212 1266 qp->debugfs_stats = NULL;