---
 arch/powerpc/platforms/pseries/lpar.c | 51 +++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 20 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/lpar.c 
b/arch/powerpc/platforms/pseries/lpar.c
index 41512aaa8c8e..4ea9224cbeb6 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -632,6 +632,34 @@ static int pSeries_lpar_hpte_removebolted(unsigned long ea,
        return 0;
 }
 
+static int plpar_bluk_remove(unsigned long *param, int index, unsigned long 
slot,
+                            unsigned long vpn, unsigned long psize,
+                            unsigned long ssize, int local)
+{
+       unsigned long rc;
+       if (!firmware_has_feature(FW_FEATURE_BULK_REMOVE)) {
+               /*
+                * lpar doesn't use the passed actual page size
+                */
+               pSeries_lpar_hpte_invalidate(slot, vpn, psize,
+                                            0, ssize, local);
+       } else {
+               param[index] = HBR_REQUEST | HBR_AVPN | slot;
+               param[index+1] = hpte_encode_avpn(vpn, psize,
+                                               ssize);
+               index += 2;
+               if (index == 8) {
+                       rc = plpar_hcall9(H_BULK_REMOVE, param,
+                                         param[0], param[1], param[2],
+                                         param[3], param[4], param[5],
+                                         param[6], param[7]);
+                       BUG_ON(rc != H_SUCCESS);
+                       index = 0;
+               }
+       }
+       return index;
+}
+
 /*
  * Take a spinlock around flushes to avoid bouncing the hypervisor tlbie
  * lock.
@@ -661,29 +689,12 @@ static void pSeries_lpar_flush_hash_range(unsigned long 
number, int local)
                        slot = pSeries_lpar_hpte_find(vpn, psize, ssize);
                        if (slot < 0)
                                continue;
-                       if (!firmware_has_feature(FW_FEATURE_BULK_REMOVE)) {
-                               /*
-                                * lpar doesn't use the passed actual page size
-                                */
-                               pSeries_lpar_hpte_invalidate(slot, vpn, psize,
-                                                            0, ssize, local);
-                       } else {
-                               param[pix] = HBR_REQUEST | HBR_AVPN | slot;
-                               param[pix+1] = hpte_encode_avpn(vpn, psize,
-                                                               ssize);
-                               pix += 2;
-                               if (pix == 8) {
-                                       rc = plpar_hcall9(H_BULK_REMOVE, param,
-                                               param[0], param[1], param[2],
-                                               param[3], param[4], param[5],
-                                               param[6], param[7]);
-                                       BUG_ON(rc != H_SUCCESS);
-                                       pix = 0;
-                               }
-                       }
+                       pix = plpar_bluk_remove(param, pix, slot, vpn,
+                                               psize, ssize, local);
                } pte_iterate_hashed_end();
        }
        if (pix) {
+               /* We have a flush pending */
                param[pix] = HBR_END;
                rc = plpar_hcall9(H_BULK_REMOVE, param, param[0], param[1],
                                  param[2], param[3], param[4], param[5],
-- 
2.13.6

Reply via email to