* [PATCH 0/3] powerpc/pseries/vas: VAS/NXGZIP support with LPM
@ 2022-01-29 1:18 Haren Myneni
2022-01-29 1:19 ` [PATCH 1/3] powerpc/pseries/vas: Modify reconfig open/close functions for migration Haren Myneni
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Haren Myneni @ 2022-01-29 1:18 UTC (permalink / raw)
To: mpe, linuxppc-dev, npiggin, nathanl; +Cc: haren
Virtual Accelerator Switchboard (VAS) is an engine stays on the
chip. So all windows opened on a specific engine belongs to VAS
the chip. The hypervisor expects the partition to close all
active windows on the sources system and reopen them after
migration on the destination machine.
This patch series adds VAS support with the partition migration.
When the migration initiates, the VAS migration handler will be
invoked before pseries_suspend() to close all active windows and
mark them in-active with VAS_WIN_MIGRATE_CLOSE status. Whereas
this migration handler is called after migration to reopen all
windows which has VAS_WIN_MIGRATE_CLOSE status and make them
active again. The user space gets paste instruction failure
when it sends requests on these in-active windows.
These patches depend on VAS/DLPAR support patch series
Haren Myneni (3):
powerpc/pseries/vas: Modify reconfig open/close functions for
migration
powerpc/pseries/vas: Add VAS migration handler
powerpc/pseries/vas: Disable window open during migration
arch/powerpc/include/asm/vas.h | 2 +
arch/powerpc/platforms/pseries/mobility.c | 5 +
arch/powerpc/platforms/pseries/vas.c | 187 +++++++++++++++++++---
arch/powerpc/platforms/pseries/vas.h | 6 +
4 files changed, 181 insertions(+), 19 deletions(-)
--
2.27.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/3] powerpc/pseries/vas: Modify reconfig open/close functions for migration 2022-01-29 1:18 [PATCH 0/3] powerpc/pseries/vas: VAS/NXGZIP support with LPM Haren Myneni @ 2022-01-29 1:19 ` Haren Myneni 2022-01-29 1:20 ` [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler Haren Myneni 2022-01-29 1:21 ` [PATCH 3/3] powerpc/pseries/vas: Disable window open during migration Haren Myneni 2 siblings, 0 replies; 7+ messages in thread From: Haren Myneni @ 2022-01-29 1:19 UTC (permalink / raw) To: mpe, linuxppc-dev, npiggin, nathanl VAS is a hardware engine stays on the chip. So when the partition migrates, all VAS windows on the source system have to be closed and reopen them on the destination after migration. This patch make changes to the current reconfig_open/close_windows functions to support migration: - Set VAS_WIN_MIGRATE_CLOSE to the window status when closes and reopen windows with the same status during resume. - Continue to close all windows even if deallocate HCALL failed (should not happen) since no way to stop migration with the current LPM implementation. - If the DLPAR CPU event happens while migration is in progress, set VAS_WIN_NO_CRED_CLOSE to the window status. Close window happens with the first event (migration or DLPAR) and Reopen window happens only with the last event (migration or DLPAR). Signed-off-by: Haren Myneni <haren@linux.ibm.com> --- arch/powerpc/include/asm/vas.h | 2 + arch/powerpc/platforms/pseries/vas.c | 88 ++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 17 deletions(-) diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h index ddc05a8fc2e3..f21e76f47175 100644 --- a/arch/powerpc/include/asm/vas.h +++ b/arch/powerpc/include/asm/vas.h @@ -42,6 +42,8 @@ /* Linux status bits */ #define VAS_WIN_NO_CRED_CLOSE 0x00000004 /* Window is closed due to */ /* lost credit */ +#define VAS_WIN_MIGRATE_CLOSE 0x00000008 /* Window is closed due to */ + /* migration */ /* * Get/Set bit fields */ diff --git a/arch/powerpc/platforms/pseries/vas.c b/arch/powerpc/platforms/pseries/vas.c index 3400f4fc6609..e4797fc73553 100644 --- a/arch/powerpc/platforms/pseries/vas.c +++ b/arch/powerpc/platforms/pseries/vas.c @@ -456,11 +456,12 @@ static int vas_deallocate_window(struct vas_window *vwin) mutex_lock(&vas_pseries_mutex); /* * VAS window is already closed in the hypervisor when - * lost the credit. So just remove the entry from - * the list, remove task references and free vas_window + * lost the credit or with migration. So just remove the entry + * from the list, remove task references and free vas_window * struct. */ - if (win->vas_win.status & VAS_WIN_NO_CRED_CLOSE) { + if (!(win->vas_win.status & VAS_WIN_NO_CRED_CLOSE) && + !(win->vas_win.status & VAS_WIN_MIGRATE_CLOSE)) { rc = deallocate_free_window(win); if (rc) { mutex_unlock(&vas_pseries_mutex); @@ -577,12 +578,14 @@ static int __init get_vas_capabilities(u8 feat, enum vas_cop_feat_type type, * by setting the remapping to new paste address if the window is * active. */ -static int reconfig_open_windows(struct vas_caps *vcaps, int creds) +static int reconfig_open_windows(struct vas_caps *vcaps, int creds, + bool migrate) { long domain[PLPAR_HCALL9_BUFSIZE] = {VAS_DEFAULT_DOMAIN_ID}; struct vas_cop_feat_caps *caps = &vcaps->caps; struct pseries_vas_window *win = NULL, *tmp; int rc, mv_ents = 0; + int flag; /* * Nothing to do if there are no closed windows. @@ -601,8 +604,10 @@ static int reconfig_open_windows(struct vas_caps *vcaps, int creds) * (dedicated). If 1 core is added, this LPAR can have 20 more * credits. It means the kernel can reopen 20 windows. So move * 20 entries in the VAS windows lost and reopen next 20 windows. + * For partition migration, reopen all windows that are closed + * during resume. */ - if (vcaps->close_wins > creds) + if ((vcaps->close_wins > creds) && !migrate) mv_ents = vcaps->close_wins - creds; list_for_each_entry_safe(win, tmp, &vcaps->list, win_list) { @@ -612,12 +617,35 @@ static int reconfig_open_windows(struct vas_caps *vcaps, int creds) mv_ents--; } + /* + * Open windows if they are closed only with migration or + * DLPAR (lost credit) before. + */ + if (migrate) + flag = VAS_WIN_MIGRATE_CLOSE; + else + flag = VAS_WIN_NO_CRED_CLOSE; + list_for_each_entry_safe_from(win, tmp, &vcaps->list, win_list) { + /* + * This window is closed with DLPAR and migration events. + * So reopen the window with the last event. + * The user space is not suspended with the current + * migration notifier. So the user space can issue DLPAR + * CPU hotplug while migration in progress. In this case + * this window will be opened with the last event. + */ + if ((win->vas_win.status & VAS_WIN_NO_CRED_CLOSE) && + (win->vas_win.status & VAS_WIN_MIGRATE_CLOSE)) { + win->vas_win.status &= ~flag; + continue; + } + /* * Nothing to do on this window if it is not closed - * with VAS_WIN_NO_CRED_CLOSE + * with this flag */ - if (!(win->vas_win.status & VAS_WIN_NO_CRED_CLOSE)) + if (!(win->vas_win.status & flag)) continue; rc = allocate_setup_window(win, (u64 *)&domain[0], @@ -633,7 +661,7 @@ static int reconfig_open_windows(struct vas_caps *vcaps, int creds) /* * Set window status to active */ - win->vas_win.status &= ~VAS_WIN_NO_CRED_CLOSE; + win->vas_win.status &= ~flag; mutex_unlock(&win->vas_win.task_ref.mmap_mutex); win->win_type = caps->win_type; if (!--vcaps->close_wins) @@ -660,20 +688,32 @@ static int reconfig_open_windows(struct vas_caps *vcaps, int creds) * the user space to fall back to SW compression and manage with the * existing windows. */ -static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds) +static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds, + bool migrate) { struct pseries_vas_window *win, *tmp; struct vas_user_win_ref *task_ref; struct vm_area_struct *vma; - int rc = 0; + int rc = 0, flag; + + if (migrate) + flag = VAS_WIN_MIGRATE_CLOSE; + else + flag = VAS_WIN_NO_CRED_CLOSE; list_for_each_entry_safe(win, tmp, &vcap->list, win_list) { /* * This window is already closed due to lost credit - * before. Go for next window. + * or for migration before. Go for next window. + * For migration, nothing to do since this window + * closed for DLPAR and will be reopened even on + * the destination system with other DLPAR operation. */ - if (win->vas_win.status & VAS_WIN_NO_CRED_CLOSE) + if ((win->vas_win.status & VAS_WIN_MIGRATE_CLOSE) || + (win->vas_win.status & VAS_WIN_NO_CRED_CLOSE)) { + win->vas_win.status |= flag; continue; + } task_ref = &win->vas_win.task_ref; mutex_lock(&task_ref->mmap_mutex); @@ -682,7 +722,7 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds) * Number of available credits are reduced, So select * and close windows. */ - win->vas_win.status |= VAS_WIN_NO_CRED_CLOSE; + win->vas_win.status |= flag; mmap_write_lock(task_ref->mm); /* @@ -705,12 +745,24 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds) * later when the process issued with close(FD). */ rc = deallocate_free_window(win); - if (rc) + /* + * This failure is from the hypervisor. + * No way to stop migration for these failures. + * So ignore error and continue closing other windows. + */ + if (rc && !migrate) return rc; vcap->close_wins++; - if (!--excess_creds) + /* + * For migration, do not depend on lpar_creds in case if + * mismatch with the hypervisor value (should not happen). + * So close all active windows in the list and will be + * reopened windows based on the new lpar_creds on the + * destination system during resume. + */ + if (!migrate && !--excess_creds) break; } @@ -765,7 +817,8 @@ int vas_reconfig_capabilties(u8 type) * target, reopen windows if they are closed due to * the previous DLPAR (core removal). */ - rc = reconfig_open_windows(vcaps, new_creds - lpar_creds); + rc = reconfig_open_windows(vcaps, new_creds - lpar_creds, + false); } else { /* * # active windows is more than new LPAR available @@ -773,7 +826,8 @@ int vas_reconfig_capabilties(u8 type) */ active_wins = vcaps->num_wins - vcaps->close_wins; if (active_wins > new_creds) - rc = reconfig_close_windows(vcaps, active_wins - new_creds); + rc = reconfig_close_windows(vcaps, active_wins - new_creds, + false); } out: -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler 2022-01-29 1:18 [PATCH 0/3] powerpc/pseries/vas: VAS/NXGZIP support with LPM Haren Myneni 2022-01-29 1:19 ` [PATCH 1/3] powerpc/pseries/vas: Modify reconfig open/close functions for migration Haren Myneni @ 2022-01-29 1:20 ` Haren Myneni 2022-01-31 16:37 ` Nathan Lynch 2022-01-29 1:21 ` [PATCH 3/3] powerpc/pseries/vas: Disable window open during migration Haren Myneni 2 siblings, 1 reply; 7+ messages in thread From: Haren Myneni @ 2022-01-29 1:20 UTC (permalink / raw) To: mpe, linuxppc-dev, npiggin, nathanl Since the VAS windows belong to the VAS hardware resource, the hypervisor expects the partition to close them on source partition and reopen them after the partition migrated on the destination machine. This handler is called before pseries_suspend() to close these windows and again invoked after migration. All active windows for both default and QoS types will be closed and mark them in-active and reopened after migration with this handler. During the migration, the user space receives paste instruction failure if it issues copy/paste on these in-active windows. Signed-off-by: Haren Myneni <haren@linux.ibm.com> --- arch/powerpc/platforms/pseries/mobility.c | 5 ++ arch/powerpc/platforms/pseries/vas.c | 86 +++++++++++++++++++++++ arch/powerpc/platforms/pseries/vas.h | 6 ++ 3 files changed, 97 insertions(+) diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c index 85033f392c78..70004243e25e 100644 --- a/arch/powerpc/platforms/pseries/mobility.c +++ b/arch/powerpc/platforms/pseries/mobility.c @@ -26,6 +26,7 @@ #include <asm/machdep.h> #include <asm/rtas.h> #include "pseries.h" +#include "vas.h" /* vas_migration_handler() */ #include "../../kernel/cacheinfo.h" static struct kobject *mobility_kobj; @@ -669,12 +670,16 @@ static int pseries_migrate_partition(u64 handle) if (ret) return ret; + vas_migration_handler(VAS_SUSPEND); + ret = pseries_suspend(handle); if (ret == 0) post_mobility_fixup(); else pseries_cancel_migration(handle, ret); + vas_migration_handler(VAS_RESUME); + return ret; } diff --git a/arch/powerpc/platforms/pseries/vas.c b/arch/powerpc/platforms/pseries/vas.c index e4797fc73553..b53e3fe02971 100644 --- a/arch/powerpc/platforms/pseries/vas.c +++ b/arch/powerpc/platforms/pseries/vas.c @@ -873,6 +873,92 @@ static struct notifier_block pseries_vas_nb = { .notifier_call = pseries_vas_notifier, }; +/* + * For LPM, all windows have to be closed on the source partition + * before migration and reopen them on the destination partition + * after migration. So closing windows during suspend and + * reopen them during resume. + */ +int vas_migration_handler(int action) +{ + struct hv_vas_cop_feat_caps *hv_caps; + struct vas_cop_feat_caps *caps; + int lpar_creds, new_creds = 0; + struct vas_caps *vcaps; + int i, rc = 0; + + hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL); + if (!hv_caps) + return -ENOMEM; + + mutex_lock(&vas_pseries_mutex); + + for (i = 0; i < VAS_MAX_FEAT_TYPE; i++) { + vcaps = &vascaps[i]; + caps = &vcaps->caps; + lpar_creds = atomic_read(&caps->target_creds); + + rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES, + vcaps->feat, + (u64)virt_to_phys(hv_caps)); + if (!rc) { + new_creds = be16_to_cpu(hv_caps->target_lpar_creds); + /* + * Should not happen. But incase print messages, close + * all windows in the list during suspend and reopen + * windows based on new lpar_creds on the destination + * system. + */ + if (lpar_creds != new_creds) { + pr_err("state(%d): lpar creds: %d HV lpar creds: %d\n", + action, lpar_creds, new_creds); + pr_err("Used creds: %d, Active creds: %d\n", + atomic_read(&caps->used_creds), + vcaps->num_wins - vcaps->close_wins); + } + } else { + pr_err("state(%d): Get VAS capabilities failed with %d\n", + action, rc); + /* + * We can not stop migration with the current lpm + * implementation. So continue closing all windows in + * the list (during suspend) and return without + * opening windows (during resume) if VAS capabilities + * HCALL failed. + */ + if (action == VAS_RESUME) + goto out; + } + + switch (action) { + case VAS_SUSPEND: + rc = reconfig_close_windows(vcaps, vcaps->num_wins, + true); + break; + case VAS_RESUME: + atomic_set(&caps->target_creds, new_creds); + rc = reconfig_open_windows(vcaps, new_creds, true); + break; + default: + /* should not happen */ + pr_err("Invalid migration action %d\n", action); + rc = -EINVAL; + goto out; + } + + /* + * Ignore errors during suspend and return for resume. + */ + if (rc && (action == VAS_RESUME)) + goto out; + } + +out: + mutex_unlock(&vas_pseries_mutex); + kfree(hv_caps); + return rc; +} + static int __init pseries_vas_init(void) { struct hv_vas_cop_feat_caps *hv_cop_caps; diff --git a/arch/powerpc/platforms/pseries/vas.h b/arch/powerpc/platforms/pseries/vas.h index 4cf1d0ef66a5..36dd140af01b 100644 --- a/arch/powerpc/platforms/pseries/vas.h +++ b/arch/powerpc/platforms/pseries/vas.h @@ -27,6 +27,11 @@ #define VAS_GZIP_QOS_CAPABILITIES 0x56516F73477A6970 #define VAS_GZIP_DEFAULT_CAPABILITIES 0x56446566477A6970 +enum vas_migrate_action { + VAS_SUSPEND, + VAS_RESUME, +}; + /* * Co-processor feature - GZIP QoS windows or GZIP default windows */ @@ -127,4 +132,5 @@ struct pseries_vas_window { int sysfs_add_vas_caps(struct vas_cop_feat_caps *caps); int vas_reconfig_capabilties(u8 type); int __init sysfs_pseries_vas_init(struct vas_all_caps *vas_caps); +int vas_migration_handler(int action); #endif /* _VAS_H */ -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler 2022-01-29 1:20 ` [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler Haren Myneni @ 2022-01-31 16:37 ` Nathan Lynch 2022-02-01 4:59 ` Haren Myneni 0 siblings, 1 reply; 7+ messages in thread From: Nathan Lynch @ 2022-01-31 16:37 UTC (permalink / raw) To: Haren Myneni, mpe, linuxppc-dev, npiggin Hi Haren, Mostly this seems OK to me. Some questions: Haren Myneni <haren@linux.ibm.com> writes: > Since the VAS windows belong to the VAS hardware resource, the > hypervisor expects the partition to close them on source partition > and reopen them after the partition migrated on the destination > machine. Not clear to me what "expects" really means here. Would it be accurate to say "requires" instead? If the OS fails to close the windows before suspend, what happens? > This handler is called before pseries_suspend() to close these > windows and again invoked after migration. All active windows > for both default and QoS types will be closed and mark them > in-active and reopened after migration with this handler. > During the migration, the user space receives paste instruction > failure if it issues copy/paste on these in-active windows. OK, I assume that's tolerable to existing users, is that correct? I.e. users should already be prepared to incur arbitrary paste instruction failures. > > Signed-off-by: Haren Myneni <haren@linux.ibm.com> > --- > arch/powerpc/platforms/pseries/mobility.c | 5 ++ > arch/powerpc/platforms/pseries/vas.c | 86 +++++++++++++++++++++++ > arch/powerpc/platforms/pseries/vas.h | 6 ++ > 3 files changed, 97 insertions(+) > > diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c > index 85033f392c78..70004243e25e 100644 > --- a/arch/powerpc/platforms/pseries/mobility.c > +++ b/arch/powerpc/platforms/pseries/mobility.c > @@ -26,6 +26,7 @@ > #include <asm/machdep.h> > #include <asm/rtas.h> > #include "pseries.h" > +#include "vas.h" /* vas_migration_handler() */ > #include "../../kernel/cacheinfo.h" > > static struct kobject *mobility_kobj; > @@ -669,12 +670,16 @@ static int pseries_migrate_partition(u64 handle) > if (ret) > return ret; > > + vas_migration_handler(VAS_SUSPEND); > + vas_migration_handler() can return an error value. Is that OK to ignore before going into the suspend? > ret = pseries_suspend(handle); > if (ret == 0) > post_mobility_fixup(); > else > pseries_cancel_migration(handle, ret); > > + vas_migration_handler(VAS_RESUME); > + No concerns here though. Nothing to be done about errors encountered in the resume path. > return ret; > } > > diff --git a/arch/powerpc/platforms/pseries/vas.c b/arch/powerpc/platforms/pseries/vas.c > index e4797fc73553..b53e3fe02971 100644 > --- a/arch/powerpc/platforms/pseries/vas.c > +++ b/arch/powerpc/platforms/pseries/vas.c > @@ -873,6 +873,92 @@ static struct notifier_block pseries_vas_nb = { > .notifier_call = pseries_vas_notifier, > }; > > +/* > + * For LPM, all windows have to be closed on the source partition > + * before migration and reopen them on the destination partition > + * after migration. So closing windows during suspend and > + * reopen them during resume. > + */ > +int vas_migration_handler(int action) > +{ > + struct hv_vas_cop_feat_caps *hv_caps; > + struct vas_cop_feat_caps *caps; > + int lpar_creds, new_creds = 0; > + struct vas_caps *vcaps; > + int i, rc = 0; > + > + hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL); > + if (!hv_caps) > + return -ENOMEM; > + > + mutex_lock(&vas_pseries_mutex); > + > + for (i = 0; i < VAS_MAX_FEAT_TYPE; i++) { > + vcaps = &vascaps[i]; > + caps = &vcaps->caps; > + lpar_creds = atomic_read(&caps->target_creds); > + > + rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES, > + vcaps->feat, > + (u64)virt_to_phys(hv_caps)); > + if (!rc) { > + new_creds = be16_to_cpu(hv_caps->target_lpar_creds); > + /* > + * Should not happen. But incase print messages, close > + * all windows in the list during suspend and reopen > + * windows based on new lpar_creds on the destination > + * system. > + */ > + if (lpar_creds != new_creds) { > + pr_err("state(%d): lpar creds: %d HV lpar creds: %d\n", > + action, lpar_creds, new_creds); > + pr_err("Used creds: %d, Active creds: %d\n", > + atomic_read(&caps->used_creds), > + vcaps->num_wins - vcaps->close_wins); > + } > + } else { > + pr_err("state(%d): Get VAS capabilities failed with %d\n", > + action, rc); > + /* > + * We can not stop migration with the current lpm > + * implementation. So continue closing all windows in > + * the list (during suspend) and return without > + * opening windows (during resume) if VAS capabilities > + * HCALL failed. > + */ > + if (action == VAS_RESUME) > + goto out; > + } > + > + switch (action) { > + case VAS_SUSPEND: > + rc = reconfig_close_windows(vcaps, vcaps->num_wins, > + true); > + break; > + case VAS_RESUME: > + atomic_set(&caps->target_creds, new_creds); > + rc = reconfig_open_windows(vcaps, new_creds, true); > + break; > + default: > + /* should not happen */ > + pr_err("Invalid migration action %d\n", action); > + rc = -EINVAL; > + goto out; > + } > + > + /* > + * Ignore errors during suspend and return for resume. > + */ > + if (rc && (action == VAS_RESUME)) > + goto out; > + } > + > +out: > + mutex_unlock(&vas_pseries_mutex); > + kfree(hv_caps); > + return rc; > +} The control flow with respect to releasing the allocation and the mutex looks correct to me. I also verified that H_QUERY_VAS_CAPABILITIES does not return a busy/retry status, so this code appears to handle all the architected statuses for that call. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler 2022-01-31 16:37 ` Nathan Lynch @ 2022-02-01 4:59 ` Haren Myneni 2022-02-01 16:12 ` Nathan Lynch 0 siblings, 1 reply; 7+ messages in thread From: Haren Myneni @ 2022-02-01 4:59 UTC (permalink / raw) To: Nathan Lynch, mpe, linuxppc-dev, npiggin On Mon, 2022-01-31 at 10:37 -0600, Nathan Lynch wrote: > Hi Haren, > > Mostly this seems OK to me. Some questions: Thanks Nathan for your suggestions. > > Haren Myneni <haren@linux.ibm.com> writes: > > Since the VAS windows belong to the VAS hardware resource, the > > hypervisor expects the partition to close them on source partition > > and reopen them after the partition migrated on the destination > > machine. > > Not clear to me what "expects" really means here. Would it be > accurate > to say "requires" instead? If the OS fails to close the windows > before > suspend, what happens? I will change it to 'requires' - These VAS windows have to be closed before migration so that these windows / credits will be available to other LPARs on the source machine. We should see failures only with HCALL to close windows. Since the migration can not be stopped, continue to close all windows (print error messages and ignore HCALL failures). These windows belong to VAS engine on source system, so can not be used them on the destination machine. > > > > This handler is called before pseries_suspend() to close these > > windows and again invoked after migration. All active windows > > for both default and QoS types will be closed and mark them > > in-active and reopened after migration with this handler. > > During the migration, the user space receives paste instruction > > failure if it issues copy/paste on these in-active windows. > > OK, I assume that's tolerable to existing users, is that correct? > I.e. > users should already be prepared to incur arbitrary paste instruction > failures. Yes, the user space or the nxz library has to fall back to SW solution (if the library supports) or manage with existing windows like closing the not frequently used ones. We expect the library to make the necessary modifications. > > > Signed-off-by: Haren Myneni <haren@linux.ibm.com> > > --- > > arch/powerpc/platforms/pseries/mobility.c | 5 ++ > > arch/powerpc/platforms/pseries/vas.c | 86 > > +++++++++++++++++++++++ > > arch/powerpc/platforms/pseries/vas.h | 6 ++ > > 3 files changed, 97 insertions(+) > > > > diff --git a/arch/powerpc/platforms/pseries/mobility.c > > b/arch/powerpc/platforms/pseries/mobility.c > > index 85033f392c78..70004243e25e 100644 > > --- a/arch/powerpc/platforms/pseries/mobility.c > > +++ b/arch/powerpc/platforms/pseries/mobility.c > > @@ -26,6 +26,7 @@ > > #include <asm/machdep.h> > > #include <asm/rtas.h> > > #include "pseries.h" > > +#include "vas.h" /* vas_migration_handler() */ > > #include "../../kernel/cacheinfo.h" > > > > static struct kobject *mobility_kobj; > > @@ -669,12 +670,16 @@ static int pseries_migrate_partition(u64 > > handle) > > if (ret) > > return ret; > > > > + vas_migration_handler(VAS_SUSPEND); > > + > > vas_migration_handler() can return an error value. Is that OK to > ignore > before going into the suspend? The migration continues even with these failures. So ignoring the failures from vas_migration_handler. Suspend operation: - we should expect failure with close HCALL or if the total credits does not match with the hypervisor (should not happen) - continue to close all windows even with HCALL failures with few windows since these HW resources are specific to machine. - Display error messages for HCALL failures (for debugging) Resume operation: - May see failures from HCALL to open/modify window HCALLs, but should not expect unless a bug in hypervisor or HW. - Stop opening windows if sees failure from HCALLs and print error messages - It does not stop migration, but the nxz library can see continue failures for many in-active windows. > > > ret = pseries_suspend(handle); > > if (ret == 0) > > post_mobility_fixup(); > > else > > pseries_cancel_migration(handle, ret); > > > > + vas_migration_handler(VAS_RESUME); > > + > > No concerns here though. Nothing to be done about errors encountered > in > the resume path. Correct as mentioned above ignoring error from VAS migration hanlder. Thanks Haren > > > return ret; > > } > > > > diff --git a/arch/powerpc/platforms/pseries/vas.c > > b/arch/powerpc/platforms/pseries/vas.c > > index e4797fc73553..b53e3fe02971 100644 > > --- a/arch/powerpc/platforms/pseries/vas.c > > +++ b/arch/powerpc/platforms/pseries/vas.c > > @@ -873,6 +873,92 @@ static struct notifier_block pseries_vas_nb = > > { > > .notifier_call = pseries_vas_notifier, > > }; > > > > +/* > > + * For LPM, all windows have to be closed on the source partition > > + * before migration and reopen them on the destination partition > > + * after migration. So closing windows during suspend and > > + * reopen them during resume. > > + */ > > +int vas_migration_handler(int action) > > +{ > > + struct hv_vas_cop_feat_caps *hv_caps; > > + struct vas_cop_feat_caps *caps; > > + int lpar_creds, new_creds = 0; > > + struct vas_caps *vcaps; > > + int i, rc = 0; > > + > > + hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL); > > + if (!hv_caps) > > + return -ENOMEM; > > + > > + mutex_lock(&vas_pseries_mutex); > > + > > + for (i = 0; i < VAS_MAX_FEAT_TYPE; i++) { > > + vcaps = &vascaps[i]; > > + caps = &vcaps->caps; > > + lpar_creds = atomic_read(&caps->target_creds); > > + > > + rc = h_query_vas_capabilities(H_QUERY_VAS_CAPABILITIES, > > + vcaps->feat, > > + (u64)virt_to_phys(hv_caps > > )); > > + if (!rc) { > > + new_creds = be16_to_cpu(hv_caps- > > >target_lpar_creds); > > + /* > > + * Should not happen. But incase print > > messages, close > > + * all windows in the list during suspend and > > reopen > > + * windows based on new lpar_creds on the > > destination > > + * system. > > + */ > > + if (lpar_creds != new_creds) { > > + pr_err("state(%d): lpar creds: %d HV > > lpar creds: %d\n", > > + action, lpar_creds, new_creds); > > + pr_err("Used creds: %d, Active creds: > > %d\n", > > + atomic_read(&caps->used_creds), > > + vcaps->num_wins - vcaps- > > >close_wins); > > + } > > + } else { > > + pr_err("state(%d): Get VAS capabilities failed > > with %d\n", > > + action, rc); > > + /* > > + * We can not stop migration with the current > > lpm > > + * implementation. So continue closing all > > windows in > > + * the list (during suspend) and return without > > + * opening windows (during resume) if VAS > > capabilities > > + * HCALL failed. > > + */ > > + if (action == VAS_RESUME) > > + goto out; > > + } > > + > > + switch (action) { > > + case VAS_SUSPEND: > > + rc = reconfig_close_windows(vcaps, vcaps- > > >num_wins, > > + true); > > + break; > > + case VAS_RESUME: > > + atomic_set(&caps->target_creds, new_creds); > > + rc = reconfig_open_windows(vcaps, new_creds, > > true); > > + break; > > + default: > > + /* should not happen */ > > + pr_err("Invalid migration action %d\n", > > action); > > + rc = -EINVAL; > > + goto out; > > + } > > + > > + /* > > + * Ignore errors during suspend and return for resume. > > + */ > > + if (rc && (action == VAS_RESUME)) > > + goto out; > > + } > > + > > +out: > > + mutex_unlock(&vas_pseries_mutex); > > + kfree(hv_caps); > > + return rc; > > +} > > The control flow with respect to releasing the allocation and the > mutex > looks correct to me. I also verified that H_QUERY_VAS_CAPABILITIES > does > not return a busy/retry status, so this code appears to handle all > the > architected statuses for that call. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler 2022-02-01 4:59 ` Haren Myneni @ 2022-02-01 16:12 ` Nathan Lynch 0 siblings, 0 replies; 7+ messages in thread From: Nathan Lynch @ 2022-02-01 16:12 UTC (permalink / raw) To: Haren Myneni, mpe, linuxppc-dev, npiggin Haren Myneni <haren@linux.ibm.com> writes: > On Mon, 2022-01-31 at 10:37 -0600, Nathan Lynch wrote: >> Haren Myneni <haren@linux.ibm.com> writes: >> > Since the VAS windows belong to the VAS hardware resource, the >> > hypervisor expects the partition to close them on source partition >> > and reopen them after the partition migrated on the destination >> > machine. >> >> Not clear to me what "expects" really means here. Would it be >> accurate to say "requires" instead? If the OS fails to close the >> windows before suspend, what happens? > > I will change it to 'requires' - These VAS windows have to be closed > before migration so that these windows / credits will be available to > other LPARs on the source machine. I'll rephrase. I want to know whether the architecture (PAPR or whichever doc) imposes a requirement on the OS (i.e. using words like "must") to close the windows, or does it merely make a recommendation ("should"), or is it silent on the subject? In your testing, if Linux has windows open at the time of calling ibm,suspend-me, does the call fail or succeed? ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] powerpc/pseries/vas: Disable window open during migration 2022-01-29 1:18 [PATCH 0/3] powerpc/pseries/vas: VAS/NXGZIP support with LPM Haren Myneni 2022-01-29 1:19 ` [PATCH 1/3] powerpc/pseries/vas: Modify reconfig open/close functions for migration Haren Myneni 2022-01-29 1:20 ` [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler Haren Myneni @ 2022-01-29 1:21 ` Haren Myneni 2 siblings, 0 replies; 7+ messages in thread From: Haren Myneni @ 2022-01-29 1:21 UTC (permalink / raw) To: mpe, linuxppc-dev, npiggin, nathanl The current partition migration implementation does not freeze the user space and the user space can continue open VAS windows. So when migration_in_progress flag is enabled, VAS open window API returns -EBUSY. Signed-off-by: Haren Myneni <haren@linux.ibm.com> --- arch/powerpc/platforms/pseries/vas.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/platforms/pseries/vas.c b/arch/powerpc/platforms/pseries/vas.c index b53e3fe02971..63316c401abb 100644 --- a/arch/powerpc/platforms/pseries/vas.c +++ b/arch/powerpc/platforms/pseries/vas.c @@ -29,6 +29,7 @@ static bool copypaste_feat; static struct vas_caps vascaps[VAS_MAX_FEAT_TYPE]; static DEFINE_MUTEX(vas_pseries_mutex); +static bool migration_in_progress; static long hcall_return_busy_check(long rc) { @@ -355,8 +356,11 @@ static struct vas_window *vas_allocate_window(int vas_id, u64 flags, * same fault IRQ is not freed by the OS before. */ mutex_lock(&vas_pseries_mutex); - rc = allocate_setup_window(txwin, (u64 *)&domain[0], - cop_feat_caps->win_type); + if (migration_in_progress) + rc = -EBUSY; + else + rc = allocate_setup_window(txwin, (u64 *)&domain[0], + cop_feat_caps->win_type); mutex_unlock(&vas_pseries_mutex); if (rc) goto out; @@ -893,6 +897,11 @@ int vas_migration_handler(int action) mutex_lock(&vas_pseries_mutex); + if (action == VAS_SUSPEND) + migration_in_progress = true; + else + migration_in_progress = false; + for (i = 0; i < VAS_MAX_FEAT_TYPE; i++) { vcaps = &vascaps[i]; caps = &vcaps->caps; -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-02-01 16:13 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-01-29 1:18 [PATCH 0/3] powerpc/pseries/vas: VAS/NXGZIP support with LPM Haren Myneni 2022-01-29 1:19 ` [PATCH 1/3] powerpc/pseries/vas: Modify reconfig open/close functions for migration Haren Myneni 2022-01-29 1:20 ` [PATCH 2/3] powerpc/pseries/vas: Add VAS migration handler Haren Myneni 2022-01-31 16:37 ` Nathan Lynch 2022-02-01 4:59 ` Haren Myneni 2022-02-01 16:12 ` Nathan Lynch 2022-01-29 1:21 ` [PATCH 3/3] powerpc/pseries/vas: Disable window open during migration Haren Myneni
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).