powerpc/rtas: arch-wide function token lookup conversions
With the tokens for all implemented RTAS functions now available via rtas_function_token(), which is optimal and safe for arbitrary contexts, there is no need to use rtas_token() or cache its result. Most conversions are trivial, but a few are worth describing in more detail: * Error injection token comparisons for lockdown purposes are consolidated into a simple predicate: token_is_restricted_errinjct(). * A couple of special cases in block_rtas_call() do not use rtas_token() but perform string comparisons against names in the function table. These are converted to compare against token values instead, which is logically equivalent but less expensive. * The lookup for the ibm,os-term token can be deferred until needed, instead of caching it at boot to avoid device tree traversal during panic. * Since rtas_function_token() accesses a read-only data structure without taking any locks, xmon's lookup of set-indicator can be performed as needed instead of cached at startup. Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-20-26929c8cce78@linux.ibm.com
This commit is contained in:
committed by
Michael Ellerman
parent
716bfc97bd
commit
08273c9f61
@@ -76,9 +76,6 @@ static cpumask_t xmon_batch_cpus = CPU_MASK_NONE;
|
||||
#define xmon_owner 0
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
|
||||
#endif
|
||||
static unsigned long in_xmon __read_mostly = 0;
|
||||
static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
|
||||
static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
|
||||
@@ -398,6 +395,7 @@ static inline void disable_surveillance(void)
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
/* Since this can't be a module, args should end up below 4GB. */
|
||||
static struct rtas_args args;
|
||||
const s32 token = rtas_function_token(RTAS_FN_SET_INDICATOR);
|
||||
|
||||
/*
|
||||
* At this point we have got all the cpus we can into
|
||||
@@ -406,10 +404,10 @@ static inline void disable_surveillance(void)
|
||||
* If we did try to take rtas.lock there would be a
|
||||
* real possibility of deadlock.
|
||||
*/
|
||||
if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
|
||||
if (token == RTAS_UNKNOWN_SERVICE)
|
||||
return;
|
||||
|
||||
rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
|
||||
rtas_call_unlocked(&args, token, 3, 1, NULL,
|
||||
SURVEILLANCE_TOKEN, 0, 0);
|
||||
|
||||
#endif /* CONFIG_PPC_PSERIES */
|
||||
@@ -3976,14 +3974,6 @@ static void xmon_init(int enable)
|
||||
__debugger_iabr_match = xmon_iabr_match;
|
||||
__debugger_break_match = xmon_break_match;
|
||||
__debugger_fault_handler = xmon_fault_handler;
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
/*
|
||||
* Get the token here to avoid trying to get a lock
|
||||
* during the crash, causing a deadlock.
|
||||
*/
|
||||
set_indicator_token = rtas_token("set-indicator");
|
||||
#endif
|
||||
} else {
|
||||
__debugger = NULL;
|
||||
__debugger_ipi = NULL;
|
||||
|
||||
Reference in New Issue
Block a user