static ssize_t qperf_seq_write(struct file *file, const char __user *ubuf, size_t count, loff_t *off) { struct seq_file *seq = file->private_data; struct qdio_irq *irq_ptr = seq->private; struct qdio_q *q; unsigned long val; int ret, i; if (!irq_ptr) return 0; ret = kstrtoul_from_user(ubuf, count, 10, &val); if (ret) return ret; switch (val) { case 0: irq_ptr->perf_stat_enabled = 0; memset(&irq_ptr->perf_stat, 0, sizeof(irq_ptr->perf_stat)); for_each_input_queue(irq_ptr, q, i) memset(&q->q_stats, 0, sizeof(q->q_stats)); for_each_output_queue(irq_ptr, q, i) memset(&q->q_stats, 0, sizeof(q->q_stats)); break; case 1: irq_ptr->perf_stat_enabled = 1; break; } return count; }
void qdio_shutdown_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) { struct qdio_q *q; int i; for_each_input_queue(irq_ptr, q, i) debugfs_remove(q->debugfs_q); for_each_output_queue(irq_ptr, q, i) debugfs_remove(q->debugfs_q); debugfs_remove(irq_ptr->debugfs_perf); debugfs_remove(irq_ptr->debugfs_dev); }
void qdio_shutdown_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) { struct qdio_q *q; int i; mutex_lock(&debugfs_mutex); for_each_input_queue(irq_ptr, q, i) remove_debugfs_entry(q); for_each_output_queue(irq_ptr, q, i) remove_debugfs_entry(q); mutex_unlock(&debugfs_mutex); }
void qdio_setup_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) { struct qdio_q *q; int i; irq_ptr->debugfs_dev = debugfs_create_dir(dev_name(&cdev->dev), debugfs_root); if (IS_ERR(irq_ptr->debugfs_dev)) irq_ptr->debugfs_dev = NULL; irq_ptr->debugfs_perf = debugfs_create_file("statistics", S_IFREG | S_IRUGO | S_IWUSR, irq_ptr->debugfs_dev, irq_ptr, &debugfs_perf_fops); if (IS_ERR(irq_ptr->debugfs_perf)) irq_ptr->debugfs_perf = NULL; for_each_input_queue(irq_ptr, q, i) setup_debugfs_entry(q, cdev); for_each_output_queue(irq_ptr, q, i) setup_debugfs_entry(q, cdev); }