Path: blob/master/drivers/crypto/intel/iaa/iaa_crypto_stats.c
29278 views
// SPDX-License-Identifier: GPL-2.01/* Copyright(c) 2021 Intel Corporation. All rights rsvd. */23#include <linux/module.h>4#include <linux/kernel.h>5#include <linux/highmem.h>6#include <linux/mm.h>7#include <linux/slab.h>8#include <linux/delay.h>9#include <linux/smp.h>10#include <uapi/linux/idxd.h>11#include <linux/idxd.h>12#include <linux/dmaengine.h>13#include "../../dma/idxd/idxd.h"14#include <linux/debugfs.h>15#include <crypto/internal/acompress.h>16#include "iaa_crypto.h"17#include "iaa_crypto_stats.h"1819static atomic64_t total_comp_calls;20static atomic64_t total_decomp_calls;21static atomic64_t total_sw_decomp_calls;22static atomic64_t total_comp_bytes_out;23static atomic64_t total_decomp_bytes_in;24static atomic64_t total_completion_einval_errors;25static atomic64_t total_completion_timeout_errors;26static atomic64_t total_completion_comp_buf_overflow_errors;2728static struct dentry *iaa_crypto_debugfs_root;2930void update_total_comp_calls(void)31{32atomic64_inc(&total_comp_calls);33}3435void update_total_comp_bytes_out(int n)36{37atomic64_add(n, &total_comp_bytes_out);38}3940void update_total_decomp_calls(void)41{42atomic64_inc(&total_decomp_calls);43}4445void update_total_sw_decomp_calls(void)46{47atomic64_inc(&total_sw_decomp_calls);48}4950void update_total_decomp_bytes_in(int n)51{52atomic64_add(n, &total_decomp_bytes_in);53}5455void update_completion_einval_errs(void)56{57atomic64_inc(&total_completion_einval_errors);58}5960void update_completion_timeout_errs(void)61{62atomic64_inc(&total_completion_timeout_errors);63}6465void update_completion_comp_buf_overflow_errs(void)66{67atomic64_inc(&total_completion_comp_buf_overflow_errors);68}6970void update_wq_comp_calls(struct idxd_wq *idxd_wq)71{72struct iaa_wq *wq = idxd_wq_get_private(idxd_wq);7374atomic64_inc(&wq->comp_calls);75atomic64_inc(&wq->iaa_device->comp_calls);76}7778void update_wq_comp_bytes(struct idxd_wq *idxd_wq, int n)79{80struct iaa_wq *wq = idxd_wq_get_private(idxd_wq);8182atomic64_add(n, &wq->comp_bytes);83atomic64_add(n, &wq->iaa_device->comp_bytes);84}8586void update_wq_decomp_calls(struct idxd_wq *idxd_wq)87{88struct iaa_wq *wq = idxd_wq_get_private(idxd_wq);8990atomic64_inc(&wq->decomp_calls);91atomic64_inc(&wq->iaa_device->decomp_calls);92}9394void update_wq_decomp_bytes(struct idxd_wq *idxd_wq, int n)95{96struct iaa_wq *wq = idxd_wq_get_private(idxd_wq);9798atomic64_add(n, &wq->decomp_bytes);99atomic64_add(n, &wq->iaa_device->decomp_bytes);100}101102static void reset_iaa_crypto_stats(void)103{104atomic64_set(&total_comp_calls, 0);105atomic64_set(&total_decomp_calls, 0);106atomic64_set(&total_sw_decomp_calls, 0);107atomic64_set(&total_comp_bytes_out, 0);108atomic64_set(&total_decomp_bytes_in, 0);109atomic64_set(&total_completion_einval_errors, 0);110atomic64_set(&total_completion_timeout_errors, 0);111atomic64_set(&total_completion_comp_buf_overflow_errors, 0);112}113114static void reset_wq_stats(struct iaa_wq *wq)115{116atomic64_set(&wq->comp_calls, 0);117atomic64_set(&wq->comp_bytes, 0);118atomic64_set(&wq->decomp_calls, 0);119atomic64_set(&wq->decomp_bytes, 0);120}121122static void reset_device_stats(struct iaa_device *iaa_device)123{124struct iaa_wq *iaa_wq;125126atomic64_set(&iaa_device->comp_calls, 0);127atomic64_set(&iaa_device->comp_bytes, 0);128atomic64_set(&iaa_device->decomp_calls, 0);129atomic64_set(&iaa_device->decomp_bytes, 0);130131list_for_each_entry(iaa_wq, &iaa_device->wqs, list)132reset_wq_stats(iaa_wq);133}134135static void wq_show(struct seq_file *m, struct iaa_wq *iaa_wq)136{137seq_printf(m, " name: %s\n", iaa_wq->wq->name);138seq_printf(m, " comp_calls: %llu\n",139atomic64_read(&iaa_wq->comp_calls));140seq_printf(m, " comp_bytes: %llu\n",141atomic64_read(&iaa_wq->comp_bytes));142seq_printf(m, " decomp_calls: %llu\n",143atomic64_read(&iaa_wq->decomp_calls));144seq_printf(m, " decomp_bytes: %llu\n\n",145atomic64_read(&iaa_wq->decomp_bytes));146}147148static void device_stats_show(struct seq_file *m, struct iaa_device *iaa_device)149{150struct iaa_wq *iaa_wq;151152seq_puts(m, "iaa device:\n");153seq_printf(m, " id: %d\n", iaa_device->idxd->id);154seq_printf(m, " n_wqs: %d\n", iaa_device->n_wq);155seq_printf(m, " comp_calls: %llu\n",156atomic64_read(&iaa_device->comp_calls));157seq_printf(m, " comp_bytes: %llu\n",158atomic64_read(&iaa_device->comp_bytes));159seq_printf(m, " decomp_calls: %llu\n",160atomic64_read(&iaa_device->decomp_calls));161seq_printf(m, " decomp_bytes: %llu\n",162atomic64_read(&iaa_device->decomp_bytes));163seq_puts(m, " wqs:\n");164165list_for_each_entry(iaa_wq, &iaa_device->wqs, list)166wq_show(m, iaa_wq);167}168169static int global_stats_show(struct seq_file *m, void *v)170{171seq_puts(m, "global stats:\n");172seq_printf(m, " total_comp_calls: %llu\n",173atomic64_read(&total_comp_calls));174seq_printf(m, " total_decomp_calls: %llu\n",175atomic64_read(&total_decomp_calls));176seq_printf(m, " total_sw_decomp_calls: %llu\n",177atomic64_read(&total_sw_decomp_calls));178seq_printf(m, " total_comp_bytes_out: %llu\n",179atomic64_read(&total_comp_bytes_out));180seq_printf(m, " total_decomp_bytes_in: %llu\n",181atomic64_read(&total_decomp_bytes_in));182seq_printf(m, " total_completion_einval_errors: %llu\n",183atomic64_read(&total_completion_einval_errors));184seq_printf(m, " total_completion_timeout_errors: %llu\n",185atomic64_read(&total_completion_timeout_errors));186seq_printf(m, " total_completion_comp_buf_overflow_errors: %llu\n\n",187atomic64_read(&total_completion_comp_buf_overflow_errors));188189return 0;190}191192static int wq_stats_show(struct seq_file *m, void *v)193{194struct iaa_device *iaa_device;195196mutex_lock(&iaa_devices_lock);197198list_for_each_entry(iaa_device, &iaa_devices, list)199device_stats_show(m, iaa_device);200201mutex_unlock(&iaa_devices_lock);202203return 0;204}205206static int iaa_crypto_stats_reset(void *data, u64 value)207{208struct iaa_device *iaa_device;209210reset_iaa_crypto_stats();211212mutex_lock(&iaa_devices_lock);213214list_for_each_entry(iaa_device, &iaa_devices, list)215reset_device_stats(iaa_device);216217mutex_unlock(&iaa_devices_lock);218219return 0;220}221222static int wq_stats_open(struct inode *inode, struct file *file)223{224return single_open(file, wq_stats_show, file);225}226227static const struct file_operations wq_stats_fops = {228.open = wq_stats_open,229.read = seq_read,230.llseek = seq_lseek,231.release = single_release,232};233234static int global_stats_open(struct inode *inode, struct file *file)235{236return single_open(file, global_stats_show, file);237}238239static const struct file_operations global_stats_fops = {240.open = global_stats_open,241.read = seq_read,242.llseek = seq_lseek,243.release = single_release,244};245246DEFINE_DEBUGFS_ATTRIBUTE(wq_stats_reset_fops, NULL, iaa_crypto_stats_reset, "%llu\n");247248int __init iaa_crypto_debugfs_init(void)249{250if (!debugfs_initialized())251return -ENODEV;252253iaa_crypto_debugfs_root = debugfs_create_dir("iaa_crypto", NULL);254255debugfs_create_file("global_stats", 0644, iaa_crypto_debugfs_root, NULL,256&global_stats_fops);257debugfs_create_file("wq_stats", 0644, iaa_crypto_debugfs_root, NULL,258&wq_stats_fops);259debugfs_create_file("stats_reset", 0644, iaa_crypto_debugfs_root, NULL,260&wq_stats_reset_fops);261262return 0;263}264265void __exit iaa_crypto_debugfs_cleanup(void)266{267debugfs_remove_recursive(iaa_crypto_debugfs_root);268}269270MODULE_LICENSE("GPL");271272273