| From c055ba982bbecb8359e8c5c15e1859241546ff79 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 6 Jan 2021 20:59:00 -0600 |
| Subject: powerpc/pseries/dlpar: handle ibm, configure-connector delay status |
| |
| From: Nathan Lynch <nathanl@linux.ibm.com> |
| |
| [ Upstream commit 768d70e19ba525debd571b36e6d0ab19956c63d7 ] |
| |
| dlpar_configure_connector() has two problems in its handling of |
| ibm,configure-connector's return status: |
| |
| 1. When the status is -2 (busy, call again), we call |
| ibm,configure-connector again immediately without checking whether |
| to schedule, which can result in monopolizing the CPU. |
| 2. Extended delay status (9900..9905) goes completely unhandled, |
| causing the configuration to unnecessarily terminate. |
| |
| Fix both of these issues by using rtas_busy_delay(). |
| |
| Fixes: ab519a011caa ("powerpc/pseries: Kernel DLPAR Infrastructure") |
| Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com> |
| Reviewed-by: Tyrel Datwyler <tyreld@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20210107025900.410369-1-nathanl@linux.ibm.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/platforms/pseries/dlpar.c | 7 +++---- |
| 1 file changed, 3 insertions(+), 4 deletions(-) |
| |
| diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c |
| index 551ba5b35df9d..91a667d8b1e90 100644 |
| --- a/arch/powerpc/platforms/pseries/dlpar.c |
| +++ b/arch/powerpc/platforms/pseries/dlpar.c |
| @@ -131,7 +131,6 @@ void dlpar_free_cc_nodes(struct device_node *dn) |
| #define NEXT_PROPERTY 3 |
| #define PREV_PARENT 4 |
| #define MORE_MEMORY 5 |
| -#define CALL_AGAIN -2 |
| #define ERR_CFG_USE -9003 |
| |
| struct device_node *dlpar_configure_connector(__be32 drc_index, |
| @@ -173,6 +172,9 @@ struct device_node *dlpar_configure_connector(__be32 drc_index, |
| |
| spin_unlock(&rtas_data_buf_lock); |
| |
| + if (rtas_busy_delay(rc)) |
| + continue; |
| + |
| switch (rc) { |
| case COMPLETE: |
| break; |
| @@ -225,9 +227,6 @@ struct device_node *dlpar_configure_connector(__be32 drc_index, |
| parent_path = last_dn->parent->full_name; |
| break; |
| |
| - case CALL_AGAIN: |
| - break; |
| - |
| case MORE_MEMORY: |
| case ERR_CFG_USE: |
| default: |
| -- |
| 2.27.0 |
| |