Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: qce - convert tasklet to workqueue

There's nothing about the qce driver that requires running from a
tasklet. Switch to using the system workqueue.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Bartosz Golaszewski and committed by
Herbert Xu
eb7986e5 ce8fd050

+10 -16
+6 -14
drivers/crypto/qce/core.c
··· 122 122 err = qce_handle_request(async_req); 123 123 if (err) { 124 124 qce->result = err; 125 - tasklet_schedule(&qce->done_tasklet); 125 + schedule_work(&qce->done_work); 126 126 } 127 127 128 128 return ret; 129 129 } 130 130 131 - static void qce_tasklet_req_done(unsigned long data) 131 + static void qce_req_done_work(struct work_struct *work) 132 132 { 133 - struct qce_device *qce = (struct qce_device *)data; 133 + struct qce_device *qce = container_of(work, struct qce_device, 134 + done_work); 134 135 struct crypto_async_request *req; 135 136 unsigned long flags; 136 137 ··· 155 154 static void qce_async_request_done(struct qce_device *qce, int ret) 156 155 { 157 156 qce->result = ret; 158 - tasklet_schedule(&qce->done_tasklet); 157 + schedule_work(&qce->done_work); 159 158 } 160 159 161 160 static int qce_check_version(struct qce_device *qce) ··· 244 243 return ret; 245 244 246 245 spin_lock_init(&qce->lock); 247 - tasklet_init(&qce->done_tasklet, qce_tasklet_req_done, 248 - (unsigned long)qce); 246 + INIT_WORK(&qce->done_work, qce_req_done_work); 249 247 crypto_init_queue(&qce->queue, QCE_QUEUE_LENGTH); 250 248 251 249 qce->async_req_enqueue = qce_async_request_enqueue; 252 250 qce->async_req_done = qce_async_request_done; 253 251 254 252 return devm_qce_register_algs(qce); 255 - } 256 - 257 - static void qce_crypto_remove(struct platform_device *pdev) 258 - { 259 - struct qce_device *qce = platform_get_drvdata(pdev); 260 - 261 - tasklet_kill(&qce->done_tasklet); 262 253 } 263 254 264 255 static const struct of_device_id qce_crypto_of_match[] = { ··· 263 270 264 271 static struct platform_driver qce_crypto_driver = { 265 272 .probe = qce_crypto_probe, 266 - .remove = qce_crypto_remove, 267 273 .driver = { 268 274 .name = KBUILD_MODNAME, 269 275 .of_match_table = qce_crypto_of_match,
+4 -2
drivers/crypto/qce/core.h
··· 6 6 #ifndef _CORE_H_ 7 7 #define _CORE_H_ 8 8 9 + #include <linux/workqueue.h> 10 + 9 11 #include "dma.h" 10 12 11 13 /** 12 14 * struct qce_device - crypto engine device structure 13 15 * @queue: crypto request queue 14 16 * @lock: the lock protects queue and req 15 - * @done_tasklet: done tasklet object 17 + * @done_work: workqueue context 16 18 * @req: current active request 17 19 * @result: result of current transform 18 20 * @base: virtual IO base ··· 31 29 struct qce_device { 32 30 struct crypto_queue queue; 33 31 spinlock_t lock; 34 - struct tasklet_struct done_tasklet; 32 + struct work_struct done_work; 35 33 struct crypto_async_request *req; 36 34 int result; 37 35 void __iomem *base;