crypto: engine - support for parallel requests based on retry mechanism
Added support for executing multiple requests, in parallel, for crypto engine based on a retry mechanism. If hardware was unable to execute a backlog request, enqueue it back in front of crypto-engine queue, to keep the order of requests. A new variable is added, retry_support (this is to keep the backward compatibility of crypto-engine) , which keeps track whether the hardware has support for retry mechanism and, also, if can run multiple requests. If do_one_request() returns: >= 0: hardware executed the request successfully; < 0: this is the old error path. If hardware has support for retry mechanism, the request is put back in front of crypto-engine queue. For backwards compatibility, if the retry support is not available, the crypto-engine will work as before. If hardware queue is full (-ENOSPC), requeue request regardless of MAY_BACKLOG flag. If hardware throws any other error code (like -EIO, -EINVAL, -ENOMEM, etc.) only MAY_BACKLOG requests are enqueued back into crypto-engine's queue, since the others can be dropped. The new crypto_engine_alloc_init_and_set function, initializes crypto-engine, sets the maximum size for crypto-engine software queue (not hardcoded anymore) and the retry_support variable is set, by default, to false. On crypto_pump_requests(), if do_one_request() returns >= 0, a new request is send to hardware, until there is no space in hardware and do_one_request() returns < 0. By default, retry_support is false and crypto-engine will work as before - will send requests to hardware, one-by-one, on crypto_pump_requests(), and complete it, on crypto_finalize_request(), and so on. To support multiple requests, in each driver, retry_support must be set on true, and if do_one_request() returns an error the request must not be freed, since it will be enqueued back into crypto-engine's queue. When all drivers, that use crypto-engine now, will be updated for retry mechanism, the retry_support variable can be removed. Signed-off-by: Iuliana Prodan <iuliana.prodan@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:

committed by
Herbert Xu

parent
ec6e2bf33b
commit
6a89f492f8
@@ -24,7 +24,9 @@
|
||||
* @idling: the engine is entering idle state
|
||||
* @busy: request pump is busy
|
||||
* @running: the engine is on working
|
||||
* @cur_req_prepared: current request is prepared
|
||||
* @retry_support: indication that the hardware allows re-execution
|
||||
* of a failed backlog request
|
||||
* crypto-engine, in head position to keep order
|
||||
* @list: link with the global crypto engine list
|
||||
* @queue_lock: spinlock to syncronise access to request queue
|
||||
* @queue: the crypto queue of the engine
|
||||
@@ -45,7 +47,8 @@ struct crypto_engine {
|
||||
bool idling;
|
||||
bool busy;
|
||||
bool running;
|
||||
bool cur_req_prepared;
|
||||
|
||||
bool retry_support;
|
||||
|
||||
struct list_head list;
|
||||
spinlock_t queue_lock;
|
||||
@@ -102,6 +105,9 @@ void crypto_finalize_skcipher_request(struct crypto_engine *engine,
|
||||
int crypto_engine_start(struct crypto_engine *engine);
|
||||
int crypto_engine_stop(struct crypto_engine *engine);
|
||||
struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt);
|
||||
struct crypto_engine *crypto_engine_alloc_init_and_set(struct device *dev,
|
||||
bool retry_support,
|
||||
bool rt, int qlen);
|
||||
int crypto_engine_exit(struct crypto_engine *engine);
|
||||
|
||||
#endif /* _CRYPTO_ENGINE_H */
|
||||
|
Reference in New Issue
Block a user