|
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 |
|