diff options
Diffstat (limited to 'drivers/crypto/intel/iaa')
| -rw-r--r-- | drivers/crypto/intel/iaa/iaa_crypto.h | 16 | ||||
| -rw-r--r-- | drivers/crypto/intel/iaa/iaa_crypto_main.c | 23 | ||||
| -rw-r--r-- | drivers/crypto/intel/iaa/iaa_crypto_stats.c | 183 | ||||
| -rw-r--r-- | drivers/crypto/intel/iaa/iaa_crypto_stats.h | 8 | 
4 files changed, 100 insertions, 130 deletions
diff --git a/drivers/crypto/intel/iaa/iaa_crypto.h b/drivers/crypto/intel/iaa/iaa_crypto.h index 2524091a5f70..56985e395263 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto.h +++ b/drivers/crypto/intel/iaa/iaa_crypto.h @@ -49,10 +49,10 @@ struct iaa_wq {  	struct iaa_device	*iaa_device; -	u64			comp_calls; -	u64			comp_bytes; -	u64			decomp_calls; -	u64			decomp_bytes; +	atomic64_t		comp_calls; +	atomic64_t		comp_bytes; +	atomic64_t		decomp_calls; +	atomic64_t		decomp_bytes;  };  struct iaa_device_compression_mode { @@ -73,10 +73,10 @@ struct iaa_device {  	int				n_wq;  	struct list_head		wqs; -	u64				comp_calls; -	u64				comp_bytes; -	u64				decomp_calls; -	u64				decomp_bytes; +	atomic64_t			comp_calls; +	atomic64_t			comp_bytes; +	atomic64_t			decomp_calls; +	atomic64_t			decomp_bytes;  };  struct wq_table_entry { diff --git a/drivers/crypto/intel/iaa/iaa_crypto_main.c b/drivers/crypto/intel/iaa/iaa_crypto_main.c index b2191ade9011..e810d286ee8c 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto_main.c +++ b/drivers/crypto/intel/iaa/iaa_crypto_main.c @@ -347,18 +347,16 @@ int add_iaa_compression_mode(const char *name,  		goto free;  	if (ll_table) { -		mode->ll_table = kzalloc(ll_table_size, GFP_KERNEL); +		mode->ll_table = kmemdup(ll_table, ll_table_size, GFP_KERNEL);  		if (!mode->ll_table)  			goto free; -		memcpy(mode->ll_table, ll_table, ll_table_size);  		mode->ll_table_size = ll_table_size;  	}  	if (d_table) { -		mode->d_table = kzalloc(d_table_size, GFP_KERNEL); +		mode->d_table = kmemdup(d_table, d_table_size, GFP_KERNEL);  		if (!mode->d_table)  			goto free; -		memcpy(mode->d_table, d_table, d_table_size);  		mode->d_table_size = d_table_size;  	} @@ -922,7 +920,7 @@ static void rebalance_wq_table(void)  	for_each_node_with_cpus(node) {  		node_cpus = cpumask_of_node(node); -		for (cpu = 0; cpu < nr_cpus_per_node; cpu++) { +		for (cpu = 0; cpu <  cpumask_weight(node_cpus); cpu++) {  			int node_cpu = cpumask_nth(cpu, node_cpus);  			if (WARN_ON(node_cpu >= nr_cpu_ids)) { @@ -1079,8 +1077,8 @@ static void iaa_desc_complete(struct idxd_desc *idxd_desc,  		update_total_comp_bytes_out(ctx->req->dlen);  		update_wq_comp_bytes(iaa_wq->wq, ctx->req->dlen);  	} else { -		update_total_decomp_bytes_in(ctx->req->dlen); -		update_wq_decomp_bytes(iaa_wq->wq, ctx->req->dlen); +		update_total_decomp_bytes_in(ctx->req->slen); +		update_wq_decomp_bytes(iaa_wq->wq, ctx->req->slen);  	}  	if (ctx->compress && compression_ctx->verify_compress) { @@ -1498,7 +1496,6 @@ static int iaa_comp_acompress(struct acomp_req *req)  	u32 compression_crc;  	struct idxd_wq *wq;  	struct device *dev; -	u64 start_time_ns;  	int order = -1;  	compression_ctx = crypto_tfm_ctx(tfm); @@ -1572,10 +1569,8 @@ static int iaa_comp_acompress(struct acomp_req *req)  		" req->dlen %d, sg_dma_len(sg) %d\n", dst_addr, nr_sgs,  		req->dst, req->dlen, sg_dma_len(req->dst)); -	start_time_ns = iaa_get_ts();  	ret = iaa_compress(tfm, req, wq, src_addr, req->slen, dst_addr,  			   &req->dlen, &compression_crc, disable_async); -	update_max_comp_delay_ns(start_time_ns);  	if (ret == -EINPROGRESS)  		return ret; @@ -1622,7 +1617,6 @@ static int iaa_comp_adecompress_alloc_dest(struct acomp_req *req)  	struct iaa_wq *iaa_wq;  	struct device *dev;  	struct idxd_wq *wq; -	u64 start_time_ns;  	int order = -1;  	cpu = get_cpu(); @@ -1679,10 +1673,8 @@ alloc_dest:  	dev_dbg(dev, "dma_map_sg, dst_addr %llx, nr_sgs %d, req->dst %p,"  		" req->dlen %d, sg_dma_len(sg) %d\n", dst_addr, nr_sgs,  		req->dst, req->dlen, sg_dma_len(req->dst)); -	start_time_ns = iaa_get_ts();  	ret = iaa_decompress(tfm, req, wq, src_addr, req->slen,  			     dst_addr, &req->dlen, true); -	update_max_decomp_delay_ns(start_time_ns);  	if (ret == -EOVERFLOW) {  		dma_unmap_sg(dev, req->dst, sg_nents(req->dst), DMA_FROM_DEVICE);  		req->dlen *= 2; @@ -1713,7 +1705,6 @@ static int iaa_comp_adecompress(struct acomp_req *req)  	int nr_sgs, cpu, ret = 0;  	struct iaa_wq *iaa_wq;  	struct device *dev; -	u64 start_time_ns;  	struct idxd_wq *wq;  	if (!iaa_crypto_enabled) { @@ -1773,10 +1764,8 @@ static int iaa_comp_adecompress(struct acomp_req *req)  		" req->dlen %d, sg_dma_len(sg) %d\n", dst_addr, nr_sgs,  		req->dst, req->dlen, sg_dma_len(req->dst)); -	start_time_ns = iaa_get_ts();  	ret = iaa_decompress(tfm, req, wq, src_addr, req->slen,  			     dst_addr, &req->dlen, false); -	update_max_decomp_delay_ns(start_time_ns);  	if (ret == -EINPROGRESS)  		return ret; @@ -2014,7 +2003,7 @@ static int __init iaa_crypto_init_module(void)  	int ret = 0;  	int node; -	nr_cpus = num_online_cpus(); +	nr_cpus = num_possible_cpus();  	for_each_node_with_cpus(node)  		nr_nodes++;  	if (!nr_nodes) { diff --git a/drivers/crypto/intel/iaa/iaa_crypto_stats.c b/drivers/crypto/intel/iaa/iaa_crypto_stats.c index c9f83af4b307..f5cc3d29ca19 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto_stats.c +++ b/drivers/crypto/intel/iaa/iaa_crypto_stats.c @@ -17,141 +17,117 @@  #include "iaa_crypto.h"  #include "iaa_crypto_stats.h" -static u64 total_comp_calls; -static u64 total_decomp_calls; -static u64 total_sw_decomp_calls; -static u64 max_comp_delay_ns; -static u64 max_decomp_delay_ns; -static u64 total_comp_bytes_out; -static u64 total_decomp_bytes_in; -static u64 total_completion_einval_errors; -static u64 total_completion_timeout_errors; -static u64 total_completion_comp_buf_overflow_errors; +static atomic64_t total_comp_calls; +static atomic64_t total_decomp_calls; +static atomic64_t total_sw_decomp_calls; +static atomic64_t total_comp_bytes_out; +static atomic64_t total_decomp_bytes_in; +static atomic64_t total_completion_einval_errors; +static atomic64_t total_completion_timeout_errors; +static atomic64_t total_completion_comp_buf_overflow_errors;  static struct dentry *iaa_crypto_debugfs_root;  void update_total_comp_calls(void)  { -	total_comp_calls++; +	atomic64_inc(&total_comp_calls);  }  void update_total_comp_bytes_out(int n)  { -	total_comp_bytes_out += n; +	atomic64_add(n, &total_comp_bytes_out);  }  void update_total_decomp_calls(void)  { -	total_decomp_calls++; +	atomic64_inc(&total_decomp_calls);  }  void update_total_sw_decomp_calls(void)  { -	total_sw_decomp_calls++; +	atomic64_inc(&total_sw_decomp_calls);  }  void update_total_decomp_bytes_in(int n)  { -	total_decomp_bytes_in += n; +	atomic64_add(n, &total_decomp_bytes_in);  }  void update_completion_einval_errs(void)  { -	total_completion_einval_errors++; +	atomic64_inc(&total_completion_einval_errors);  }  void update_completion_timeout_errs(void)  { -	total_completion_timeout_errors++; +	atomic64_inc(&total_completion_timeout_errors);  }  void update_completion_comp_buf_overflow_errs(void)  { -	total_completion_comp_buf_overflow_errors++; -} - -void update_max_comp_delay_ns(u64 start_time_ns) -{ -	u64 time_diff; - -	time_diff = ktime_get_ns() - start_time_ns; - -	if (time_diff > max_comp_delay_ns) -		max_comp_delay_ns = time_diff; -} - -void update_max_decomp_delay_ns(u64 start_time_ns) -{ -	u64 time_diff; - -	time_diff = ktime_get_ns() - start_time_ns; - -	if (time_diff > max_decomp_delay_ns) -		max_decomp_delay_ns = time_diff; +	atomic64_inc(&total_completion_comp_buf_overflow_errors);  }  void update_wq_comp_calls(struct idxd_wq *idxd_wq)  {  	struct iaa_wq *wq = idxd_wq_get_private(idxd_wq); -	wq->comp_calls++; -	wq->iaa_device->comp_calls++; +	atomic64_inc(&wq->comp_calls); +	atomic64_inc(&wq->iaa_device->comp_calls);  }  void update_wq_comp_bytes(struct idxd_wq *idxd_wq, int n)  {  	struct iaa_wq *wq = idxd_wq_get_private(idxd_wq); -	wq->comp_bytes += n; -	wq->iaa_device->comp_bytes += n; +	atomic64_add(n, &wq->comp_bytes); +	atomic64_add(n, &wq->iaa_device->comp_bytes);  }  void update_wq_decomp_calls(struct idxd_wq *idxd_wq)  {  	struct iaa_wq *wq = idxd_wq_get_private(idxd_wq); -	wq->decomp_calls++; -	wq->iaa_device->decomp_calls++; +	atomic64_inc(&wq->decomp_calls); +	atomic64_inc(&wq->iaa_device->decomp_calls);  }  void update_wq_decomp_bytes(struct idxd_wq *idxd_wq, int n)  {  	struct iaa_wq *wq = idxd_wq_get_private(idxd_wq); -	wq->decomp_bytes += n; -	wq->iaa_device->decomp_bytes += n; +	atomic64_add(n, &wq->decomp_bytes); +	atomic64_add(n, &wq->iaa_device->decomp_bytes);  }  static void reset_iaa_crypto_stats(void)  { -	total_comp_calls = 0; -	total_decomp_calls = 0; -	total_sw_decomp_calls = 0; -	max_comp_delay_ns = 0; -	max_decomp_delay_ns = 0; -	total_comp_bytes_out = 0; -	total_decomp_bytes_in = 0; -	total_completion_einval_errors = 0; -	total_completion_timeout_errors = 0; -	total_completion_comp_buf_overflow_errors = 0; +	atomic64_set(&total_comp_calls, 0); +	atomic64_set(&total_decomp_calls, 0); +	atomic64_set(&total_sw_decomp_calls, 0); +	atomic64_set(&total_comp_bytes_out, 0); +	atomic64_set(&total_decomp_bytes_in, 0); +	atomic64_set(&total_completion_einval_errors, 0); +	atomic64_set(&total_completion_timeout_errors, 0); +	atomic64_set(&total_completion_comp_buf_overflow_errors, 0);  }  static void reset_wq_stats(struct iaa_wq *wq)  { -	wq->comp_calls = 0; -	wq->comp_bytes = 0; -	wq->decomp_calls = 0; -	wq->decomp_bytes = 0; +	atomic64_set(&wq->comp_calls, 0); +	atomic64_set(&wq->comp_bytes, 0); +	atomic64_set(&wq->decomp_calls, 0); +	atomic64_set(&wq->decomp_bytes, 0);  }  static void reset_device_stats(struct iaa_device *iaa_device)  {  	struct iaa_wq *iaa_wq; -	iaa_device->comp_calls = 0; -	iaa_device->comp_bytes = 0; -	iaa_device->decomp_calls = 0; -	iaa_device->decomp_bytes = 0; +	atomic64_set(&iaa_device->comp_calls, 0); +	atomic64_set(&iaa_device->comp_bytes, 0); +	atomic64_set(&iaa_device->decomp_calls, 0); +	atomic64_set(&iaa_device->decomp_bytes, 0);  	list_for_each_entry(iaa_wq, &iaa_device->wqs, list)  		reset_wq_stats(iaa_wq); @@ -160,10 +136,14 @@ static void reset_device_stats(struct iaa_device *iaa_device)  static void wq_show(struct seq_file *m, struct iaa_wq *iaa_wq)  {  	seq_printf(m, "    name: %s\n", iaa_wq->wq->name); -	seq_printf(m, "    comp_calls: %llu\n", iaa_wq->comp_calls); -	seq_printf(m, "    comp_bytes: %llu\n", iaa_wq->comp_bytes); -	seq_printf(m, "    decomp_calls: %llu\n", iaa_wq->decomp_calls); -	seq_printf(m, "    decomp_bytes: %llu\n\n", iaa_wq->decomp_bytes); +	seq_printf(m, "    comp_calls: %llu\n", +		   atomic64_read(&iaa_wq->comp_calls)); +	seq_printf(m, "    comp_bytes: %llu\n", +		   atomic64_read(&iaa_wq->comp_bytes)); +	seq_printf(m, "    decomp_calls: %llu\n", +		   atomic64_read(&iaa_wq->decomp_calls)); +	seq_printf(m, "    decomp_bytes: %llu\n\n", +		   atomic64_read(&iaa_wq->decomp_bytes));  }  static void device_stats_show(struct seq_file *m, struct iaa_device *iaa_device) @@ -173,30 +153,41 @@ static void device_stats_show(struct seq_file *m, struct iaa_device *iaa_device)  	seq_puts(m, "iaa device:\n");  	seq_printf(m, "  id: %d\n", iaa_device->idxd->id);  	seq_printf(m, "  n_wqs: %d\n", iaa_device->n_wq); -	seq_printf(m, "  comp_calls: %llu\n", iaa_device->comp_calls); -	seq_printf(m, "  comp_bytes: %llu\n", iaa_device->comp_bytes); -	seq_printf(m, "  decomp_calls: %llu\n", iaa_device->decomp_calls); -	seq_printf(m, "  decomp_bytes: %llu\n", iaa_device->decomp_bytes); +	seq_printf(m, "  comp_calls: %llu\n", +		   atomic64_read(&iaa_device->comp_calls)); +	seq_printf(m, "  comp_bytes: %llu\n", +		   atomic64_read(&iaa_device->comp_bytes)); +	seq_printf(m, "  decomp_calls: %llu\n", +		   atomic64_read(&iaa_device->decomp_calls)); +	seq_printf(m, "  decomp_bytes: %llu\n", +		   atomic64_read(&iaa_device->decomp_bytes));  	seq_puts(m, "  wqs:\n");  	list_for_each_entry(iaa_wq, &iaa_device->wqs, list)  		wq_show(m, iaa_wq);  } -static void global_stats_show(struct seq_file *m) +static int global_stats_show(struct seq_file *m, void *v)  {  	seq_puts(m, "global stats:\n"); -	seq_printf(m, "  total_comp_calls: %llu\n", total_comp_calls); -	seq_printf(m, "  total_decomp_calls: %llu\n", total_decomp_calls); -	seq_printf(m, "  total_sw_decomp_calls: %llu\n", total_sw_decomp_calls); -	seq_printf(m, "  total_comp_bytes_out: %llu\n", total_comp_bytes_out); -	seq_printf(m, "  total_decomp_bytes_in: %llu\n", total_decomp_bytes_in); +	seq_printf(m, "  total_comp_calls: %llu\n", +		   atomic64_read(&total_comp_calls)); +	seq_printf(m, "  total_decomp_calls: %llu\n", +		   atomic64_read(&total_decomp_calls)); +	seq_printf(m, "  total_sw_decomp_calls: %llu\n", +		   atomic64_read(&total_sw_decomp_calls)); +	seq_printf(m, "  total_comp_bytes_out: %llu\n", +		   atomic64_read(&total_comp_bytes_out)); +	seq_printf(m, "  total_decomp_bytes_in: %llu\n", +		   atomic64_read(&total_decomp_bytes_in));  	seq_printf(m, "  total_completion_einval_errors: %llu\n", -		   total_completion_einval_errors); +		   atomic64_read(&total_completion_einval_errors));  	seq_printf(m, "  total_completion_timeout_errors: %llu\n", -		   total_completion_timeout_errors); +		   atomic64_read(&total_completion_timeout_errors));  	seq_printf(m, "  total_completion_comp_buf_overflow_errors: %llu\n\n", -		   total_completion_comp_buf_overflow_errors); +		   atomic64_read(&total_completion_comp_buf_overflow_errors)); + +	return 0;  }  static int wq_stats_show(struct seq_file *m, void *v) @@ -205,8 +196,6 @@ static int wq_stats_show(struct seq_file *m, void *v)  	mutex_lock(&iaa_devices_lock); -	global_stats_show(m); -  	list_for_each_entry(iaa_device, &iaa_devices, list)  		device_stats_show(m, iaa_device); @@ -243,6 +232,18 @@ static const struct file_operations wq_stats_fops = {  	.release = single_release,  }; +static int global_stats_open(struct inode *inode, struct file *file) +{ +	return single_open(file, global_stats_show, file); +} + +static const struct file_operations global_stats_fops = { +	.open = global_stats_open, +	.read = seq_read, +	.llseek = seq_lseek, +	.release = single_release, +}; +  DEFINE_DEBUGFS_ATTRIBUTE(wq_stats_reset_fops, NULL, iaa_crypto_stats_reset, "%llu\n");  int __init iaa_crypto_debugfs_init(void) @@ -252,20 +253,8 @@ int __init iaa_crypto_debugfs_init(void)  	iaa_crypto_debugfs_root = debugfs_create_dir("iaa_crypto", NULL); -	debugfs_create_u64("max_comp_delay_ns", 0644, -			   iaa_crypto_debugfs_root, &max_comp_delay_ns); -	debugfs_create_u64("max_decomp_delay_ns", 0644, -			   iaa_crypto_debugfs_root, &max_decomp_delay_ns); -	debugfs_create_u64("total_comp_calls", 0644, -			   iaa_crypto_debugfs_root, &total_comp_calls); -	debugfs_create_u64("total_decomp_calls", 0644, -			   iaa_crypto_debugfs_root, &total_decomp_calls); -	debugfs_create_u64("total_sw_decomp_calls", 0644, -			   iaa_crypto_debugfs_root, &total_sw_decomp_calls); -	debugfs_create_u64("total_comp_bytes_out", 0644, -			   iaa_crypto_debugfs_root, &total_comp_bytes_out); -	debugfs_create_u64("total_decomp_bytes_in", 0644, -			   iaa_crypto_debugfs_root, &total_decomp_bytes_in); +	debugfs_create_file("global_stats", 0644, iaa_crypto_debugfs_root, NULL, +			    &global_stats_fops);  	debugfs_create_file("wq_stats", 0644, iaa_crypto_debugfs_root, NULL,  			    &wq_stats_fops);  	debugfs_create_file("stats_reset", 0644, iaa_crypto_debugfs_root, NULL, diff --git a/drivers/crypto/intel/iaa/iaa_crypto_stats.h b/drivers/crypto/intel/iaa/iaa_crypto_stats.h index c916ca83f070..3787a5f507eb 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto_stats.h +++ b/drivers/crypto/intel/iaa/iaa_crypto_stats.h @@ -13,8 +13,6 @@ void	update_total_comp_bytes_out(int n);  void	update_total_decomp_calls(void);  void	update_total_sw_decomp_calls(void);  void	update_total_decomp_bytes_in(int n); -void	update_max_comp_delay_ns(u64 start_time_ns); -void	update_max_decomp_delay_ns(u64 start_time_ns);  void	update_completion_einval_errs(void);  void	update_completion_timeout_errs(void);  void	update_completion_comp_buf_overflow_errs(void); @@ -24,8 +22,6 @@ void	update_wq_comp_bytes(struct idxd_wq *idxd_wq, int n);  void	update_wq_decomp_calls(struct idxd_wq *idxd_wq);  void	update_wq_decomp_bytes(struct idxd_wq *idxd_wq, int n); -static inline u64	iaa_get_ts(void) { return ktime_get_ns(); } -  #else  static inline int	iaa_crypto_debugfs_init(void) { return 0; }  static inline void	iaa_crypto_debugfs_cleanup(void) {} @@ -35,8 +31,6 @@ static inline void	update_total_comp_bytes_out(int n) {}  static inline void	update_total_decomp_calls(void) {}  static inline void	update_total_sw_decomp_calls(void) {}  static inline void	update_total_decomp_bytes_in(int n) {} -static inline void	update_max_comp_delay_ns(u64 start_time_ns) {} -static inline void	update_max_decomp_delay_ns(u64 start_time_ns) {}  static inline void	update_completion_einval_errs(void) {}  static inline void	update_completion_timeout_errs(void) {}  static inline void	update_completion_comp_buf_overflow_errs(void) {} @@ -46,8 +40,6 @@ static inline void	update_wq_comp_bytes(struct idxd_wq *idxd_wq, int n) {}  static inline void	update_wq_decomp_calls(struct idxd_wq *idxd_wq) {}  static inline void	update_wq_decomp_bytes(struct idxd_wq *idxd_wq, int n) {} -static inline u64	iaa_get_ts(void) { return 0; } -  #endif // CONFIG_CRYPTO_DEV_IAA_CRYPTO_STATS  #endif  |