@@ -663,8 +663,9 @@ static struct zswap_pool *zswap_pool_create(char *type, char *compressor)
663
663
return NULL ;
664
664
}
665
665
666
- static __init struct zswap_pool * __zswap_pool_create_fallback (void )
666
+ static bool zswap_try_pool_create (void )
667
667
{
668
+ struct zswap_pool * pool ;
668
669
bool has_comp , has_zpool ;
669
670
670
671
has_comp = crypto_has_acomp (zswap_compressor , 0 , 0 );
@@ -700,9 +701,21 @@ static __init struct zswap_pool *__zswap_pool_create_fallback(void)
700
701
}
701
702
702
703
if (!has_comp || !has_zpool )
703
- return NULL ;
704
+ return false;
705
+
706
+ pool = zswap_pool_create (zswap_zpool_type , zswap_compressor );
704
707
705
- return zswap_pool_create (zswap_zpool_type , zswap_compressor );
708
+ if (pool ) {
709
+ pr_info ("loaded using pool %s/%s\n" , pool -> tfm_name ,
710
+ zpool_get_type (pool -> zpool ));
711
+ list_add (& pool -> list , & zswap_pools );
712
+ zswap_has_pool = true;
713
+ } else {
714
+ pr_err ("pool creation failed\n" );
715
+ zswap_enabled = false;
716
+ }
717
+
718
+ return zswap_enabled ;
706
719
}
707
720
708
721
static void zswap_pool_destroy (struct zswap_pool * pool )
@@ -875,16 +888,19 @@ static int zswap_zpool_param_set(const char *val,
875
888
static int zswap_enabled_param_set (const char * val ,
876
889
const struct kernel_param * kp )
877
890
{
891
+ int ret ;
892
+
878
893
if (zswap_init_failed ) {
879
894
pr_err ("can't enable, initialization failed\n" );
880
895
return - ENODEV ;
881
896
}
882
- if (!zswap_has_pool && zswap_init_started ) {
883
- pr_err ("can't enable, no pool configured\n" );
884
- return - ENODEV ;
885
- }
886
897
887
- return param_set_bool (val , kp );
898
+ ret = param_set_bool (val , kp );
899
+ if (!ret && zswap_enabled && zswap_init_started && !zswap_has_pool )
900
+ if (!zswap_try_pool_create ())
901
+ ret = - ENODEV ;
902
+
903
+ return ret ;
888
904
}
889
905
890
906
/*********************************
@@ -1499,7 +1515,6 @@ static int __init zswap_debugfs_init(void)
1499
1515
**********************************/
1500
1516
static int __init init_zswap (void )
1501
1517
{
1502
- struct zswap_pool * pool ;
1503
1518
int ret ;
1504
1519
1505
1520
zswap_init_started = true;
@@ -1523,33 +1538,23 @@ static int __init init_zswap(void)
1523
1538
if (ret )
1524
1539
goto hp_fail ;
1525
1540
1526
- pool = __zswap_pool_create_fallback ();
1527
- if (pool ) {
1528
- pr_info ("loaded using pool %s/%s\n" , pool -> tfm_name ,
1529
- zpool_get_type (pool -> zpool ));
1530
- list_add (& pool -> list , & zswap_pools );
1531
- zswap_has_pool = true;
1532
- } else {
1533
- pr_err ("pool creation failed\n" );
1534
- zswap_enabled = false;
1535
- }
1536
-
1537
1541
shrink_wq = create_workqueue ("zswap-shrink" );
1538
1542
if (!shrink_wq )
1539
- goto fallback_fail ;
1543
+ goto hp_fail ;
1540
1544
1541
1545
ret = frontswap_register_ops (& zswap_frontswap_ops );
1542
1546
if (ret )
1543
1547
goto destroy_wq ;
1544
1548
if (zswap_debugfs_init ())
1545
1549
pr_warn ("debugfs initialization failed\n" );
1550
+
1551
+ if (zswap_enabled )
1552
+ zswap_try_pool_create ();
1553
+
1546
1554
return 0 ;
1547
1555
1548
1556
destroy_wq :
1549
1557
destroy_workqueue (shrink_wq );
1550
- fallback_fail :
1551
- if (pool )
1552
- zswap_pool_destroy (pool );
1553
1558
hp_fail :
1554
1559
cpuhp_remove_state (CPUHP_MM_ZSWP_MEM_PREPARE );
1555
1560
dstmem_fail :
0 commit comments