@@ -21,7 +21,10 @@ struct jr_driver_data {
spinlock_t jr_alloc_lock; /* jr_list lock */
} ____cacheline_aligned;
-static struct jr_driver_data driver_data;
+static struct jr_driver_data driver_data = {
+ .jr_list = LIST_HEAD_INIT(driver_data.jr_list),
+ .jr_alloc_lock = __SPIN_LOCK_UNLOCKED(driver_data.jr_alloc_lock),
+};
static int caam_reset_hw_jr(struct device *dev)
{
@@ -561,20 +564,7 @@ static struct platform_driver caam_jr_driver = {
.remove = caam_jr_remove,
};
-static int __init jr_driver_init(void)
-{
- spin_lock_init(&driver_data.jr_alloc_lock);
- INIT_LIST_HEAD(&driver_data.jr_list);
- return platform_driver_register(&caam_jr_driver);
-}
-
-static void __exit jr_driver_exit(void)
-{
- platform_driver_unregister(&caam_jr_driver);
-}
-
-module_init(jr_driver_init);
-module_exit(jr_driver_exit);
+module_platform_driver(caam_jr_driver);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("FSL CAAM JR request backend");
There is a race condition, when driver is not initialized yet (jr_driver_init() was not called yet), but another kernel code calls caam_jr_alloc(). This results in warnings about uninitialized lock and NULL pointer dereference error. Fix that by statically initializing global driver data, so caam_jr_alloc() always works on initialized variables. Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com> --- drivers/crypto/caam/jr.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-)