Michal Suchanek f3b0c6
From 2147783d6bf0b7ca14c72a25527dc5135bd17f65 Mon Sep 17 00:00:00 2001
Michal Suchanek f3b0c6
From: Haren Myneni <haren@linux.ibm.com>
Michal Suchanek f3b0c6
Date: Thu, 6 Oct 2022 22:29:59 -0700
Michal Suchanek f3b0c6
Subject: [PATCH] powerpc/pseries: Use lparcfg to reconfig VAS windows for
Michal Suchanek f3b0c6
 DLPAR CPU
Michal Suchanek f3b0c6
Michal Suchanek f3b0c6
References: bsc#1204433 ltc#200179
Michal Suchanek f3b0c6
Patch-mainline: v6.1-rc3
Michal Suchanek f3b0c6
Git-commit: 2147783d6bf0b7ca14c72a25527dc5135bd17f65
Michal Suchanek f3b0c6
Michal Suchanek f3b0c6
The hypervisor assigns VAS (Virtual Accelerator Switchboard)
Michal Suchanek f3b0c6
windows depends on cores configured in LPAR. The kernel uses
Michal Suchanek f3b0c6
OF reconfig notifier to reconfig VAS windows for DLPAR CPU event.
Michal Suchanek f3b0c6
In the case of shared CPU mode partition, the hypervisor assigns
Michal Suchanek f3b0c6
VAS windows depends on CPU entitled capacity, not based on vcpus.
Michal Suchanek f3b0c6
When the user changes CPU entitled capacity for the partition,
Michal Suchanek f3b0c6
drmgr uses /proc/ppc64/lparcfg interface to notify the kernel.
Michal Suchanek f3b0c6
Michal Suchanek f3b0c6
This patch adds the following changes to update VAS resources
Michal Suchanek f3b0c6
for shared mode:
Michal Suchanek f3b0c6
- Call vas reconfig windows from lparcfg_write()
Michal Suchanek f3b0c6
- Ignore reconfig changes in the VAS notifier
Michal Suchanek f3b0c6
Michal Suchanek f3b0c6
Signed-off-by: Haren Myneni <haren@linux.ibm.com>
Michal Suchanek f3b0c6
[mpe: Rework error handling, report any errors as EIO]
Michal Suchanek f3b0c6
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek f3b0c6
Link: https://lore.kernel.org/r/efa9c16e4a78dda4567a16f13dabfd73cb4674a2.camel@linux.ibm.com
Michal Suchanek f3b0c6
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek f3b0c6
---
Michal Suchanek f3b0c6
 arch/powerpc/platforms/pseries/lparcfg.c | 11 ++++++
Michal Suchanek f3b0c6
 arch/powerpc/platforms/pseries/vas.c     | 43 ++++++++++++++++--------
Michal Suchanek f3b0c6
 arch/powerpc/platforms/pseries/vas.h     |  5 +++
Michal Suchanek f3b0c6
 3 files changed, 45 insertions(+), 14 deletions(-)
Michal Suchanek f3b0c6
Michal Suchanek f3b0c6
diff --git a/arch/powerpc/platforms/pseries/lparcfg.c b/arch/powerpc/platforms/pseries/lparcfg.c
Michal Suchanek f3b0c6
index 507dc0b5987d0..63fd925ccbb83 100644
Michal Suchanek f3b0c6
--- a/arch/powerpc/platforms/pseries/lparcfg.c
Michal Suchanek f3b0c6
+++ b/arch/powerpc/platforms/pseries/lparcfg.c
Michal Suchanek f3b0c6
@@ -35,6 +35,7 @@
Michal Suchanek f3b0c6
 #include <asm/drmem.h>
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
 #include "pseries.h"
Michal Suchanek f3b0c6
+#include "vas.h"	/* pseries_vas_dlpar_cpu() */
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
 /*
Michal Suchanek f3b0c6
  * This isn't a module but we expose that to userspace
Michal Suchanek f3b0c6
@@ -748,6 +749,16 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
Michal Suchanek f3b0c6
 			return -EINVAL;
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
 		retval = update_ppp(new_entitled_ptr, NULL);
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
+		if (retval == H_SUCCESS || retval == H_CONSTRAINED) {
Michal Suchanek f3b0c6
+			/*
Michal Suchanek f3b0c6
+			 * The hypervisor assigns VAS resources based
Michal Suchanek f3b0c6
+			 * on entitled capacity for shared mode.
Michal Suchanek f3b0c6
+			 * Reconfig VAS windows based on DLPAR CPU events.
Michal Suchanek f3b0c6
+			 */
Michal Suchanek f3b0c6
+			if (pseries_vas_dlpar_cpu() != 0)
Michal Suchanek f3b0c6
+				retval = H_HARDWARE;
Michal Suchanek f3b0c6
+		}
Michal Suchanek f3b0c6
 	} else if (!strcmp(kbuf, "capacity_weight")) {
Michal Suchanek f3b0c6
 		char *endp;
Michal Suchanek f3b0c6
 		*new_weight_ptr = (u8) simple_strtoul(tmp, &endp, 10);
Michal Suchanek f3b0c6
diff --git a/arch/powerpc/platforms/pseries/vas.c b/arch/powerpc/platforms/pseries/vas.c
Michal Suchanek f3b0c6
index 53b36381489ed..4ad6e510d405f 100644
Michal Suchanek f3b0c6
--- a/arch/powerpc/platforms/pseries/vas.c
Michal Suchanek f3b0c6
+++ b/arch/powerpc/platforms/pseries/vas.c
Michal Suchanek f3b0c6
@@ -852,6 +852,25 @@ int vas_reconfig_capabilties(u8 type, int new_nr_creds)
Michal Suchanek f3b0c6
 	mutex_unlock(&vas_pseries_mutex);
Michal Suchanek f3b0c6
 	return rc;
Michal Suchanek f3b0c6
 }
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
+int pseries_vas_dlpar_cpu(void)
Michal Suchanek f3b0c6
+{
Michal Suchanek f3b0c6
+	int new_nr_creds, rc;
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
+	rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES,
Michal Suchanek f3b0c6
+				      vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
Michal Suchanek f3b0c6
+				      (u64)virt_to_phys(&hv_cop_caps));
Michal Suchanek f3b0c6
+	if (!rc) {
Michal Suchanek f3b0c6
+		new_nr_creds = be16_to_cpu(hv_cop_caps.target_lpar_creds);
Michal Suchanek f3b0c6
+		rc = vas_reconfig_capabilties(VAS_GZIP_DEF_FEAT_TYPE, new_nr_creds);
Michal Suchanek f3b0c6
+	}
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
+	if (rc)
Michal Suchanek f3b0c6
+		pr_err("Failed reconfig VAS capabilities with DLPAR\n");
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
+	return rc;
Michal Suchanek f3b0c6
+}
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
 /*
Michal Suchanek f3b0c6
  * Total number of default credits available (target_credits)
Michal Suchanek f3b0c6
  * in LPAR depends on number of cores configured. It varies based on
Michal Suchanek f3b0c6
@@ -866,7 +885,15 @@ static int pseries_vas_notifier(struct notifier_block *nb,
Michal Suchanek f3b0c6
 	struct of_reconfig_data *rd = data;
Michal Suchanek f3b0c6
 	struct device_node *dn = rd->dn;
Michal Suchanek f3b0c6
 	const __be32 *intserv = NULL;
Michal Suchanek f3b0c6
-	int new_nr_creds, len, rc = 0;
Michal Suchanek f3b0c6
+	int len;
Michal Suchanek f3b0c6
+
Michal Suchanek f3b0c6
+	/*
Michal Suchanek f3b0c6
+	 * For shared CPU partition, the hypervisor assigns total credits
Michal Suchanek f3b0c6
+	 * based on entitled core capacity. So updating VAS windows will
Michal Suchanek f3b0c6
+	 * be called from lparcfg_write().
Michal Suchanek f3b0c6
+	 */
Michal Suchanek f3b0c6
+	if (is_shared_processor())
Michal Suchanek f3b0c6
+		return NOTIFY_OK;
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
 	if ((action == OF_RECONFIG_ATTACH_NODE) ||
Michal Suchanek f3b0c6
 		(action == OF_RECONFIG_DETACH_NODE))
Michal Suchanek f3b0c6
@@ -878,19 +905,7 @@ static int pseries_vas_notifier(struct notifier_block *nb,
Michal Suchanek f3b0c6
 	if (!intserv)
Michal Suchanek f3b0c6
 		return NOTIFY_OK;
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
-	rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES,
Michal Suchanek f3b0c6
-					vascaps[VAS_GZIP_DEF_FEAT_TYPE].feat,
Michal Suchanek f3b0c6
-					(u64)virt_to_phys(&hv_cop_caps));
Michal Suchanek f3b0c6
-	if (!rc) {
Michal Suchanek f3b0c6
-		new_nr_creds = be16_to_cpu(hv_cop_caps.target_lpar_creds);
Michal Suchanek f3b0c6
-		rc = vas_reconfig_capabilties(VAS_GZIP_DEF_FEAT_TYPE,
Michal Suchanek f3b0c6
-						new_nr_creds);
Michal Suchanek f3b0c6
-	}
Michal Suchanek f3b0c6
-
Michal Suchanek f3b0c6
-	if (rc)
Michal Suchanek f3b0c6
-		pr_err("Failed reconfig VAS capabilities with DLPAR\n");
Michal Suchanek f3b0c6
-
Michal Suchanek f3b0c6
-	return rc;
Michal Suchanek f3b0c6
+	return pseries_vas_dlpar_cpu();
Michal Suchanek f3b0c6
 }
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
 static struct notifier_block pseries_vas_nb = {
Michal Suchanek f3b0c6
diff --git a/arch/powerpc/platforms/pseries/vas.h b/arch/powerpc/platforms/pseries/vas.h
Michal Suchanek f3b0c6
index a2cb12a31c178..7115043ec4883 100644
Michal Suchanek f3b0c6
--- a/arch/powerpc/platforms/pseries/vas.h
Michal Suchanek f3b0c6
+++ b/arch/powerpc/platforms/pseries/vas.h
Michal Suchanek f3b0c6
@@ -141,10 +141,15 @@ int __init sysfs_pseries_vas_init(struct vas_all_caps *vas_caps);
Michal Suchanek f3b0c6
 
Michal Suchanek f3b0c6
 #ifdef CONFIG_PPC_VAS
Michal Suchanek f3b0c6
 int vas_migration_handler(int action);
Michal Suchanek f3b0c6
+int pseries_vas_dlpar_cpu(void);
Michal Suchanek f3b0c6
 #else
Michal Suchanek f3b0c6
 static inline int vas_migration_handler(int action)
Michal Suchanek f3b0c6
 {
Michal Suchanek f3b0c6
 	return 0;
Michal Suchanek f3b0c6
 }
Michal Suchanek f3b0c6
+static inline int pseries_vas_dlpar_cpu(void)
Michal Suchanek f3b0c6
+{
Michal Suchanek f3b0c6
+	return 0;
Michal Suchanek f3b0c6
+}
Michal Suchanek f3b0c6
 #endif
Michal Suchanek f3b0c6
 #endif /* _VAS_H */
Michal Suchanek f3b0c6
-- 
Michal Suchanek f3b0c6
2.35.3
Michal Suchanek f3b0c6