Skip to content

Commit

Permalink
crypto: engine - Handle the kthread worker using the new API
Browse files Browse the repository at this point in the history
Use the new API to create and destroy the crypto engine kthread
worker. The API hides some implementation details.

In particular, kthread_create_worker() allocates and initializes
struct kthread_worker. It runs the kthread the right way
and stores task_struct into the worker structure.

kthread_destroy_worker() flushes all pending works, stops
the kthread and frees the structure.

This patch does not change the existing behavior except for
dynamically allocating struct kthread_worker and storing
only the pointer of this structure.

It is compile tested only because I did not find an easy
way how to run the code. Well, it should be pretty safe
given the nature of the change.

Signed-off-by: Petr Mladek <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
pmladek authored and herbertx committed Oct 25, 2016
1 parent 103600a commit c4ca2b0
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 19 deletions.
26 changes: 11 additions & 15 deletions crypto/crypto_engine.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ static void crypto_pump_requests(struct crypto_engine *engine,

/* If another context is idling then defer */
if (engine->idling) {
kthread_queue_work(&engine->kworker, &engine->pump_requests);
kthread_queue_work(engine->kworker, &engine->pump_requests);
goto out;
}

Expand All @@ -58,7 +58,7 @@ static void crypto_pump_requests(struct crypto_engine *engine,

/* Only do teardown in the thread */
if (!in_kthread) {
kthread_queue_work(&engine->kworker,
kthread_queue_work(engine->kworker,
&engine->pump_requests);
goto out;
}
Expand Down Expand Up @@ -189,7 +189,7 @@ int crypto_transfer_cipher_request(struct crypto_engine *engine,
ret = ablkcipher_enqueue_request(&engine->queue, req);

if (!engine->busy && need_pump)
kthread_queue_work(&engine->kworker, &engine->pump_requests);
kthread_queue_work(engine->kworker, &engine->pump_requests);

spin_unlock_irqrestore(&engine->queue_lock, flags);
return ret;
Expand Down Expand Up @@ -231,7 +231,7 @@ int crypto_transfer_hash_request(struct crypto_engine *engine,
ret = ahash_enqueue_request(&engine->queue, req);

if (!engine->busy && need_pump)
kthread_queue_work(&engine->kworker, &engine->pump_requests);
kthread_queue_work(engine->kworker, &engine->pump_requests);

spin_unlock_irqrestore(&engine->queue_lock, flags);
return ret;
Expand Down Expand Up @@ -284,7 +284,7 @@ void crypto_finalize_cipher_request(struct crypto_engine *engine,

req->base.complete(&req->base, err);

kthread_queue_work(&engine->kworker, &engine->pump_requests);
kthread_queue_work(engine->kworker, &engine->pump_requests);
}
EXPORT_SYMBOL_GPL(crypto_finalize_cipher_request);

Expand Down Expand Up @@ -321,7 +321,7 @@ void crypto_finalize_hash_request(struct crypto_engine *engine,

req->base.complete(&req->base, err);

kthread_queue_work(&engine->kworker, &engine->pump_requests);
kthread_queue_work(engine->kworker, &engine->pump_requests);
}
EXPORT_SYMBOL_GPL(crypto_finalize_hash_request);

Expand All @@ -345,7 +345,7 @@ int crypto_engine_start(struct crypto_engine *engine)
engine->running = true;
spin_unlock_irqrestore(&engine->queue_lock, flags);

kthread_queue_work(&engine->kworker, &engine->pump_requests);
kthread_queue_work(engine->kworker, &engine->pump_requests);

return 0;
}
Expand Down Expand Up @@ -422,19 +422,16 @@ struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt)
crypto_init_queue(&engine->queue, CRYPTO_ENGINE_MAX_QLEN);
spin_lock_init(&engine->queue_lock);

kthread_init_worker(&engine->kworker);
engine->kworker_task = kthread_run(kthread_worker_fn,
&engine->kworker, "%s",
engine->name);
if (IS_ERR(engine->kworker_task)) {
engine->kworker = kthread_create_worker(0, "%s", engine->name);
if (IS_ERR(engine->kworker)) {
dev_err(dev, "failed to create crypto request pump task\n");
return NULL;
}
kthread_init_work(&engine->pump_requests, crypto_pump_work);

if (engine->rt) {
dev_info(dev, "will run requests pump with realtime priority\n");
sched_setscheduler(engine->kworker_task, SCHED_FIFO, &param);
sched_setscheduler(engine->kworker->task, SCHED_FIFO, &param);
}

return engine;
Expand All @@ -455,8 +452,7 @@ int crypto_engine_exit(struct crypto_engine *engine)
if (ret)
return ret;

kthread_flush_worker(&engine->kworker);
kthread_stop(engine->kworker_task);
kthread_destroy_worker(engine->kworker);

return 0;
}
Expand Down
6 changes: 2 additions & 4 deletions include/crypto/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@
* @prepare_hash_request: do some prepare if need before handle the current request
* @unprepare_hash_request: undo any work done by prepare_hash_request()
* @hash_one_request: do hash for current request
* @kworker: thread struct for request pump
* @kworker_task: pointer to task for request pump kworker thread
* @kworker: kthread worker struct for request pump
* @pump_requests: work struct for scheduling work to the request pump
* @priv_data: the engine private data
* @cur_req: the current request which is on processing
Expand Down Expand Up @@ -78,8 +77,7 @@ struct crypto_engine {
int (*hash_one_request)(struct crypto_engine *engine,
struct ahash_request *req);

struct kthread_worker kworker;
struct task_struct *kworker_task;
struct kthread_worker *kworker;
struct kthread_work pump_requests;

void *priv_data;
Expand Down

0 comments on commit c4ca2b0

Please sign in to comment.