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

mtip32xx: Add debugfs entry device_status

This patch adds a new debugfs entry 'device_status' in
/sys/kernel/debug/rssd. The value of this entry shows
devices online and those in the process of removing.

Signed-off-by: Sam Bradshaw <sbradshaw@micron.com>
Signed-off-by: Asai Thambi S P <asamymuthupa@micron.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Asai Thambi S P and committed by
Jens Axboe
0caff003 6b06d35f

+154 -12
+143 -5
drivers/block/mtip32xx/mtip32xx.c
··· 81 81 /* Device instance number, incremented each time a device is probed. */ 82 82 static int instance; 83 83 84 + struct list_head online_list; 85 + struct list_head removing_list; 86 + spinlock_t dev_lock; 87 + 84 88 /* 85 89 * Global variable used to hold the major block device number 86 90 * allocated in mtip_init(). 87 91 */ 88 92 static int mtip_major; 89 93 static struct dentry *dfs_parent; 94 + static struct dentry *dfs_device_status; 90 95 91 96 static u32 cpu_use[NR_CPUS]; 92 97 ··· 2712 2707 2713 2708 static DEVICE_ATTR(status, S_IRUGO, mtip_hw_show_status, NULL); 2714 2709 2710 + /* debugsfs entries */ 2711 + 2712 + static ssize_t show_device_status(struct device_driver *drv, char *buf) 2713 + { 2714 + int size = 0; 2715 + struct driver_data *dd, *tmp; 2716 + unsigned long flags; 2717 + char id_buf[42]; 2718 + u16 status = 0; 2719 + 2720 + spin_lock_irqsave(&dev_lock, flags); 2721 + size += sprintf(&buf[size], "Devices Present:\n"); 2722 + list_for_each_entry_safe(dd, tmp, &online_list, online_list) { 2723 + if (dd && dd->pdev) { 2724 + if (dd->port && 2725 + dd->port->identify && 2726 + dd->port->identify_valid) { 2727 + strlcpy(id_buf, 2728 + (char *) (dd->port->identify + 10), 21); 2729 + status = *(dd->port->identify + 141); 2730 + } else { 2731 + memset(id_buf, 0, 42); 2732 + status = 0; 2733 + } 2734 + 2735 + if (dd->port && 2736 + test_bit(MTIP_PF_REBUILD_BIT, &dd->port->flags)) { 2737 + size += sprintf(&buf[size], 2738 + " device %s %s (ftl rebuild %d %%)\n", 2739 + dev_name(&dd->pdev->dev), 2740 + id_buf, 2741 + status); 2742 + } else { 2743 + size += sprintf(&buf[size], 2744 + " device %s %s\n", 2745 + dev_name(&dd->pdev->dev), 2746 + id_buf); 2747 + } 2748 + } 2749 + } 2750 + 2751 + size += sprintf(&buf[size], "Devices Being Removed:\n"); 2752 + list_for_each_entry_safe(dd, tmp, &removing_list, remove_list) { 2753 + if (dd && dd->pdev) { 2754 + if (dd->port && 2755 + dd->port->identify && 2756 + dd->port->identify_valid) { 2757 + strlcpy(id_buf, 2758 + (char *) (dd->port->identify+10), 21); 2759 + status = *(dd->port->identify + 141); 2760 + } else { 2761 + memset(id_buf, 0, 42); 2762 + status = 0; 2763 + } 2764 + 2765 + if (dd->port && 2766 + test_bit(MTIP_PF_REBUILD_BIT, &dd->port->flags)) { 2767 + size += sprintf(&buf[size], 2768 + " device %s %s (ftl rebuild %d %%)\n", 2769 + dev_name(&dd->pdev->dev), 2770 + id_buf, 2771 + status); 2772 + } else { 2773 + size += sprintf(&buf[size], 2774 + " device %s %s\n", 2775 + dev_name(&dd->pdev->dev), 2776 + id_buf); 2777 + } 2778 + } 2779 + } 2780 + spin_unlock_irqrestore(&dev_lock, flags); 2781 + 2782 + return size; 2783 + } 2784 + 2785 + static ssize_t mtip_hw_read_device_status(struct file *f, char __user *ubuf, 2786 + size_t len, loff_t *offset) 2787 + { 2788 + int size = *offset; 2789 + char buf[MTIP_DFS_MAX_BUF_SIZE]; 2790 + 2791 + if (!len || *offset) 2792 + return 0; 2793 + 2794 + size += show_device_status(NULL, buf); 2795 + 2796 + *offset = size <= len ? size : len; 2797 + size = copy_to_user(ubuf, buf, *offset); 2798 + if (size) 2799 + return -EFAULT; 2800 + 2801 + return *offset; 2802 + } 2803 + 2715 2804 static ssize_t mtip_hw_read_registers(struct file *f, char __user *ubuf, 2716 2805 size_t len, loff_t *offset) 2717 2806 { ··· 2899 2800 2900 2801 return *offset; 2901 2802 } 2803 + 2804 + static const struct file_operations mtip_device_status_fops = { 2805 + .owner = THIS_MODULE, 2806 + .open = simple_open, 2807 + .read = mtip_hw_read_device_status, 2808 + .llseek = no_llseek, 2809 + }; 2902 2810 2903 2811 static const struct file_operations mtip_regs_fops = { 2904 2812 .owner = THIS_MODULE, ··· 4264 4158 const struct cpumask *node_mask; 4265 4159 int cpu, i = 0, j = 0; 4266 4160 int my_node = NUMA_NO_NODE; 4161 + unsigned long flags; 4267 4162 4268 4163 /* Allocate memory for this devices private data. */ 4269 4164 my_node = pcibus_to_node(pdev->bus); ··· 4321 4214 dd->instance = instance; 4322 4215 dd->pdev = pdev; 4323 4216 dd->numa_node = my_node; 4217 + 4218 + INIT_LIST_HEAD(&dd->online_list); 4219 + INIT_LIST_HEAD(&dd->remove_list); 4324 4220 4325 4221 memset(dd->workq_name, 0, 32); 4326 4222 snprintf(dd->workq_name, 31, "mtipq%d", dd->instance); ··· 4414 4304 set_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag); 4415 4305 else 4416 4306 rv = 0; /* device in rebuild state, return 0 from probe */ 4307 + 4308 + /* Add to online list even if in ftl rebuild */ 4309 + spin_lock_irqsave(&dev_lock, flags); 4310 + list_add(&dd->online_list, &online_list); 4311 + spin_unlock_irqrestore(&dev_lock, flags); 4312 + 4417 4313 goto done; 4418 4314 4419 4315 block_initialize_err: ··· 4453 4337 { 4454 4338 struct driver_data *dd = pci_get_drvdata(pdev); 4455 4339 int counter = 0; 4340 + unsigned long flags; 4456 4341 4457 4342 set_bit(MTIP_DDF_REMOVE_PENDING_BIT, &dd->dd_flag); 4343 + 4344 + spin_lock_irqsave(&dev_lock, flags); 4345 + list_del_init(&dd->online_list); 4346 + list_add(&dd->remove_list, &removing_list); 4347 + spin_unlock_irqrestore(&dev_lock, flags); 4458 4348 4459 4349 if (mtip_check_surprise_removal(pdev)) { 4460 4350 while (!test_bit(MTIP_DDF_CLEANUP_BIT, &dd->dd_flag)) { ··· 4486 4364 } 4487 4365 4488 4366 pci_disable_msi(pdev); 4367 + 4368 + spin_lock_irqsave(&dev_lock, flags); 4369 + list_del_init(&dd->remove_list); 4370 + spin_unlock_irqrestore(&dev_lock, flags); 4489 4371 4490 4372 kfree(dd); 4491 4373 pcim_iounmap_regions(pdev, 1 << MTIP_ABAR); ··· 4638 4512 4639 4513 pr_info(MTIP_DRV_NAME " Version " MTIP_DRV_VERSION "\n"); 4640 4514 4515 + spin_lock_init(&dev_lock); 4516 + 4517 + INIT_LIST_HEAD(&online_list); 4518 + INIT_LIST_HEAD(&removing_list); 4519 + 4641 4520 /* Allocate a major block device number to use with this driver. */ 4642 4521 error = register_blkdev(0, MTIP_DRV_NAME); 4643 4522 if (error <= 0) { ··· 4652 4521 } 4653 4522 mtip_major = error; 4654 4523 4655 - if (!dfs_parent) { 4656 - dfs_parent = debugfs_create_dir("rssd", NULL); 4657 - if (IS_ERR_OR_NULL(dfs_parent)) { 4658 - pr_warn("Error creating debugfs parent\n"); 4659 - dfs_parent = NULL; 4524 + dfs_parent = debugfs_create_dir("rssd", NULL); 4525 + if (IS_ERR_OR_NULL(dfs_parent)) { 4526 + pr_warn("Error creating debugfs parent\n"); 4527 + dfs_parent = NULL; 4528 + } 4529 + if (dfs_parent) { 4530 + dfs_device_status = debugfs_create_file("device_status", 4531 + S_IRUGO, dfs_parent, NULL, 4532 + &mtip_device_status_fops); 4533 + if (IS_ERR_OR_NULL(dfs_device_status)) { 4534 + pr_err("Error creating device_status node\n"); 4535 + dfs_device_status = NULL; 4660 4536 } 4661 4537 } 4662 4538
+11 -7
drivers/block/mtip32xx/mtip32xx.h
··· 129 129 MTIP_PF_EH_ACTIVE_BIT = 1, /* error handling */ 130 130 MTIP_PF_SE_ACTIVE_BIT = 2, /* secure erase */ 131 131 MTIP_PF_DM_ACTIVE_BIT = 3, /* download microcde */ 132 - MTIP_PF_PAUSE_IO = ((1 << MTIP_PF_IC_ACTIVE_BIT) | \ 133 - (1 << MTIP_PF_EH_ACTIVE_BIT) | \ 134 - (1 << MTIP_PF_SE_ACTIVE_BIT) | \ 132 + MTIP_PF_PAUSE_IO = ((1 << MTIP_PF_IC_ACTIVE_BIT) | 133 + (1 << MTIP_PF_EH_ACTIVE_BIT) | 134 + (1 << MTIP_PF_SE_ACTIVE_BIT) | 135 135 (1 << MTIP_PF_DM_ACTIVE_BIT)), 136 136 137 137 MTIP_PF_SVC_THD_ACTIVE_BIT = 4, ··· 144 144 MTIP_DDF_REMOVE_PENDING_BIT = 1, 145 145 MTIP_DDF_OVER_TEMP_BIT = 2, 146 146 MTIP_DDF_WRITE_PROTECT_BIT = 3, 147 - MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | \ 148 - (1 << MTIP_DDF_SEC_LOCK_BIT) | \ 149 - (1 << MTIP_DDF_OVER_TEMP_BIT) | \ 147 + MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | 148 + (1 << MTIP_DDF_SEC_LOCK_BIT) | 149 + (1 << MTIP_DDF_OVER_TEMP_BIT) | 150 150 (1 << MTIP_DDF_WRITE_PROTECT_BIT)), 151 151 152 152 MTIP_DDF_CLEANUP_BIT = 5, ··· 180 180 181 181 #define MTIP_TRIM_TIMEOUT_MS 240000 182 182 #define MTIP_MAX_TRIM_ENTRIES 8 183 - #define MTIP_MAX_TRIM_ENTRY_LEN 0xfff8 183 + #define MTIP_MAX_TRIM_ENTRY_LEN 0xfff8 184 184 185 185 struct mtip_trim_entry { 186 186 u32 lba; /* starting lba of region */ ··· 501 501 atomic_t irq_workers_active; 502 502 503 503 int isr_binding; 504 + 505 + struct list_head online_list; /* linkage for online list */ 506 + 507 + struct list_head remove_list; /* linkage for removing list */ 504 508 }; 505 509 506 510 #endif