powerpc/pseries/lparcfg: add missing RTAS retry status handling
[ Upstream commit 5d08633e5f6564b60f1cbe09af3af40a74d66431 ]
The ibm,get-system-parameter RTAS function may return -2 or 990x,
which indicate that the caller should try again.
lparcfg's parse_system_parameter_string() ignores this, making it
possible to intermittently report incorrect SPLPAR characteristics.
Move the RTAS call into a coventional rtas_busy_delay()-based loop.
Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Fixes: 1da177e4c3
("Linux-2.6.12-rc2")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-4-26929c8cce78@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
df995aef64
commit
7afd768784
@@ -322,6 +322,7 @@ static void parse_mpp_x_data(struct seq_file *m)
|
|||||||
*/
|
*/
|
||||||
static void parse_system_parameter_string(struct seq_file *m)
|
static void parse_system_parameter_string(struct seq_file *m)
|
||||||
{
|
{
|
||||||
|
const s32 token = rtas_token("ibm,get-system-parameter");
|
||||||
int call_status;
|
int call_status;
|
||||||
|
|
||||||
unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL);
|
unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL);
|
||||||
@@ -331,16 +332,15 @@ static void parse_system_parameter_string(struct seq_file *m)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
spin_lock(&rtas_data_buf_lock);
|
spin_lock(&rtas_data_buf_lock);
|
||||||
memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH);
|
memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH);
|
||||||
call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
|
call_status = rtas_call(token, 3, 1, NULL, SPLPAR_CHARACTERISTICS_TOKEN,
|
||||||
NULL,
|
__pa(rtas_data_buf), RTAS_DATA_BUF_SIZE);
|
||||||
SPLPAR_CHARACTERISTICS_TOKEN,
|
|
||||||
__pa(rtas_data_buf),
|
|
||||||
RTAS_DATA_BUF_SIZE);
|
|
||||||
memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH);
|
memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH);
|
||||||
local_buffer[SPLPAR_MAXLENGTH - 1] = '\0';
|
local_buffer[SPLPAR_MAXLENGTH - 1] = '\0';
|
||||||
spin_unlock(&rtas_data_buf_lock);
|
spin_unlock(&rtas_data_buf_lock);
|
||||||
|
} while (rtas_busy_delay(call_status));
|
||||||
|
|
||||||
if (call_status != 0) {
|
if (call_status != 0) {
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
|
Reference in New Issue
Block a user