forked from mirrors/linux
		
	This patch introduces the multi-buffer crypto daemon which is responsible for submitting crypto jobs in a work queue to the responsible multi-buffer crypto algorithm. The idea of the multi-buffer algorihtm is to put data streams from multiple jobs in a wide (AVX2) register and then take advantage of SIMD instructions to do crypto computation on several buffers simultaneously. The multi-buffer crypto daemon is also responsbile for flushing the remaining buffers to complete the computation if no new buffers arrive for a while. Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Software async multibuffer crypto daemon headers
 | 
						|
 *
 | 
						|
 *    Author:
 | 
						|
 *             Tim Chen <tim.c.chen@linux.intel.com>
 | 
						|
 *
 | 
						|
 *    Copyright (c) 2014, Intel Corporation.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _CRYPTO_MCRYPT_H
 | 
						|
#define _CRYPTO_MCRYPT_H
 | 
						|
 | 
						|
#include <linux/crypto.h>
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <crypto/hash.h>
 | 
						|
 | 
						|
struct mcryptd_ahash {
 | 
						|
	struct crypto_ahash base;
 | 
						|
};
 | 
						|
 | 
						|
static inline struct mcryptd_ahash *__mcryptd_ahash_cast(
 | 
						|
	struct crypto_ahash *tfm)
 | 
						|
{
 | 
						|
	return (struct mcryptd_ahash *)tfm;
 | 
						|
}
 | 
						|
 | 
						|
struct mcryptd_cpu_queue {
 | 
						|
	struct crypto_queue queue;
 | 
						|
	struct work_struct work;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_queue {
 | 
						|
	struct mcryptd_cpu_queue __percpu *cpu_queue;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_instance_ctx {
 | 
						|
	struct crypto_spawn spawn;
 | 
						|
	struct mcryptd_queue *queue;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_hash_ctx {
 | 
						|
	struct crypto_shash *child;
 | 
						|
	struct mcryptd_alg_state *alg_state;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_tag {
 | 
						|
	/* seq number of request */
 | 
						|
	unsigned seq_num;
 | 
						|
	/* arrival time of request */
 | 
						|
	unsigned long arrival;
 | 
						|
	unsigned long expire;
 | 
						|
	int	cpu;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_hash_request_ctx {
 | 
						|
	struct list_head waiter;
 | 
						|
	crypto_completion_t complete;
 | 
						|
	struct mcryptd_tag tag;
 | 
						|
	struct crypto_hash_walk walk;
 | 
						|
	u8 *out;
 | 
						|
	int flag;
 | 
						|
	struct shash_desc desc;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
 | 
						|
					u32 type, u32 mask);
 | 
						|
struct crypto_shash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
 | 
						|
struct shash_desc *mcryptd_shash_desc(struct ahash_request *req);
 | 
						|
void mcryptd_free_ahash(struct mcryptd_ahash *tfm);
 | 
						|
void mcryptd_flusher(struct work_struct *work);
 | 
						|
 | 
						|
enum mcryptd_req_type {
 | 
						|
	MCRYPTD_NONE,
 | 
						|
	MCRYPTD_UPDATE,
 | 
						|
	MCRYPTD_FINUP,
 | 
						|
	MCRYPTD_DIGEST,
 | 
						|
	MCRYPTD_FINAL
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_alg_cstate {
 | 
						|
	unsigned long next_flush;
 | 
						|
	unsigned next_seq_num;
 | 
						|
	bool	flusher_engaged;
 | 
						|
	struct  delayed_work flush;
 | 
						|
	int	cpu;
 | 
						|
	struct  mcryptd_alg_state *alg_state;
 | 
						|
	void	*mgr;
 | 
						|
	spinlock_t work_lock;
 | 
						|
	struct list_head work_list;
 | 
						|
	struct list_head flush_list;
 | 
						|
};
 | 
						|
 | 
						|
struct mcryptd_alg_state {
 | 
						|
	struct mcryptd_alg_cstate __percpu *alg_cstate;
 | 
						|
	unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate);
 | 
						|
};
 | 
						|
 | 
						|
/* return delay in jiffies from current time */
 | 
						|
static inline unsigned long get_delay(unsigned long t)
 | 
						|
{
 | 
						|
	long delay;
 | 
						|
 | 
						|
	delay = (long) t - (long) jiffies;
 | 
						|
	if (delay <= 0)
 | 
						|
		return 0;
 | 
						|
	else
 | 
						|
		return (unsigned long) delay;
 | 
						|
}
 | 
						|
 | 
						|
void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay);
 | 
						|
 | 
						|
#endif
 |