Avoid expensive indirect calls for the recovery routines as well.

Signed-off-by: Christoph Hellwig <[email protected]>
---
 lib/raid/raid6/algos.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/lib/raid/raid6/algos.c b/lib/raid/raid6/algos.c
index 65b75236ecf8..d333318e3301 100644
--- a/lib/raid/raid6/algos.c
+++ b/lib/raid/raid6/algos.c
@@ -26,6 +26,8 @@ static const struct raid6_recov_calls *raid6_recov_algo;
 /* Selected algorithm */
 DEFINE_STATIC_CALL_NULL(raid6_gen_syndrome_impl, *raid6_intx1.gen_syndrome);
 DEFINE_STATIC_CALL_NULL(raid6_xor_syndrome_impl, *raid6_intx1.xor_syndrome);
+DEFINE_STATIC_CALL_NULL(raid6_recov_2data_impl, *raid6_recov_intx1.data2);
+DEFINE_STATIC_CALL_NULL(raid6_recov_datap_impl, *raid6_recov_intx1.datap);
 
 /**
  * raid6_gen_syndrome - generate RAID6 P/Q parity
@@ -126,7 +128,7 @@ void raid6_recov_2data(int disks, size_t bytes, int faila, 
int failb,
        WARN_ON_ONCE(bytes > PAGE_SIZE);
        WARN_ON_ONCE(failb <= faila);
 
-       raid6_recov_algo->data2(disks, bytes, faila, failb, ptrs);
+       static_call(raid6_recov_2data_impl)(disks, bytes, faila, failb, ptrs);
 }
 EXPORT_SYMBOL_GPL(raid6_recov_2data);
 
@@ -151,7 +153,7 @@ void raid6_recov_datap(int disks, size_t bytes, int faila, 
void **ptrs)
        WARN_ON_ONCE(bytes & 511);
        WARN_ON_ONCE(bytes > PAGE_SIZE);
 
-       raid6_recov_algo->datap(disks, bytes, faila, ptrs);
+       static_call(raid6_recov_datap_impl)(disks, bytes, faila, ptrs);
 }
 EXPORT_SYMBOL_GPL(raid6_recov_datap);
 
@@ -324,6 +326,8 @@ static int __init raid6_init(void)
         */
        if (!raid6_recov_algo)
                raid6_recov_algo = &raid6_recov_intx1;
+       static_call_update(raid6_recov_2data_impl, raid6_recov_algo->data2);
+       static_call_update(raid6_recov_datap_impl, raid6_recov_algo->datap);
        pr_info("raid6: using %s recovery algorithm\n", raid6_recov_algo->name);
 
 #ifdef MODULE
-- 
2.53.0


Reply via email to