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.niest...@grinn-global.com>
---
 drivers/crypto/caam/jr.c | 20 +++++---------------
 1 file changed, 5 insertions(+), 15 deletions(-)

diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c
index f4f258075b89..1352a4875d5a 100644
--- a/drivers/crypto/caam/jr.c
+++ b/drivers/crypto/caam/jr.c
@@ -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");
-- 
2.18.0

Reply via email to