[PATCH] powerpc/vas: Fix IRQ name allocation
Cédric Le Goater
clg at kaod.org
Tue Dec 15 23:33:03 AEDT 2020
On 12/15/20 11:56 AM, Haren Myneni wrote:
> On Sat, 2020-12-12 at 15:27 +0100, Cédric Le Goater wrote:
>> The VAS device allocates a generic interrupt to handle page faults
>> but
>> the IRQ name doesn't show under /proc. This is because it's on
>> stack. Allocate the name.
>>
>> Signed-off-by: Cédric Le Goater <clg at kaod.org>
>
> Thanks for fixing.
I was wondering where those ^B interrupt numbers were coming from.
/proc/interrupts looks better now:
36: ... 0 XIVE-IRQ 50331732 Edge vas-6
40: ... 0 XIVE-IRQ 33554504 Edge vas-4
72: ... 0 XIVE-IRQ 16777304 Edge vas-2
124: ... 0 XIVE-IRQ 124 Edge vas-0
>
> Acked-by: Haren Myneni <haren at linux.ibm.com>
>
>> ---
>>
>> I didn't understand this part in init_vas_instance() :
>>
>> if (vinst->virq) {
>> rc = vas_irq_fault_window_setup(vinst);
>> /*
>> * Fault window is used only for user space send
>> windows.
>> * So if vinst->virq is NULL, tx_win_open returns
>> -ENODEV
>> * for user space.
>> */
>> if (rc)
>> vinst->virq = 0;
>> }
>>
>> If the IRQ cannot be requested, the device probing should fail but
>> it's not today. The use of 'vinst->virq' is suspicious.
>
> VAS raises an interrupt only when NX sees fault on request buffers and
> faults can happen only for user space requests. So Fault window setup
> is needed for user space requests. For kernel requests, continue even
> if IRQ / fault_window_setup is failed.
>
> When window open request is issued from user space, kernel returns
> -ENODEV if vinst->virq = 0 (means fault window setup is failed).
It looks ok to deactivate a feature (page faulting for user space
requests) if vas_setup_fault_window() fails but if the IRQ layer
routine request_threaded_irq() fails, something is really wrong
in the system and we should stop probing IMO.
We should probably move the IRQ request after allocating/mapping
the XIVE IPI IRQ.
this test is always true :
if (vinst->virq) {
rc = vas_irq_fault_window_setup(vinst);
since above, we did :
vinst->virq = irq_create_mapping(NULL, hwirq);
if (!vinst->virq) {
pr_err("Inst%d: Unable to map global irq %d\n",
vinst->vas_id, hwirq);
return -EINVAL;
}
Cheers,
C.
>
>
>>
>> arch/powerpc/platforms/powernv/vas.h | 1 +
>> arch/powerpc/platforms/powernv/vas.c | 11 ++++++++---
>> 2 files changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/powerpc/platforms/powernv/vas.h
>> b/arch/powerpc/platforms/powernv/vas.h
>> index 70f793e8f6cc..c7db3190baca 100644
>> --- a/arch/powerpc/platforms/powernv/vas.h
>> +++ b/arch/powerpc/platforms/powernv/vas.h
>> @@ -340,6 +340,7 @@ struct vas_instance {
>> struct vas_window *rxwin[VAS_COP_TYPE_MAX];
>> struct vas_window *windows[VAS_WINDOWS_PER_CHIP];
>>
>> + char *name;
>> char *dbgname;
>> struct dentry *dbgdir;
>> };
>> diff --git a/arch/powerpc/platforms/powernv/vas.c
>> b/arch/powerpc/platforms/powernv/vas.c
>> index 598e4cd563fb..b65256a63e87 100644
>> --- a/arch/powerpc/platforms/powernv/vas.c
>> +++ b/arch/powerpc/platforms/powernv/vas.c
>> @@ -28,12 +28,10 @@ static DEFINE_PER_CPU(int, cpu_vas_id);
>>
>> static int vas_irq_fault_window_setup(struct vas_instance *vinst)
>> {
>> - char devname[64];
>> int rc = 0;
>>
>> - snprintf(devname, sizeof(devname), "vas-%d", vinst->vas_id);
>> rc = request_threaded_irq(vinst->virq, vas_fault_handler,
>> - vas_fault_thread_fn, 0, devname,
>> vinst);
>> + vas_fault_thread_fn, 0, vinst->name,
>> vinst);
>>
>> if (rc) {
>> pr_err("VAS[%d]: Request IRQ(%d) failed with %d\n",
>> @@ -80,6 +78,12 @@ static int init_vas_instance(struct
>> platform_device *pdev)
>> if (!vinst)
>> return -ENOMEM;
>>
>> + vinst->name = kasprintf(GFP_KERNEL, "vas-%d", vasid);
>> + if (!vinst->name) {
>> + kfree(vinst);
>> + return -ENOMEM;
>> + }
>> +
>> INIT_LIST_HEAD(&vinst->node);
>> ida_init(&vinst->ida);
>> mutex_init(&vinst->mutex);
>> @@ -162,6 +166,7 @@ static int init_vas_instance(struct
>> platform_device *pdev)
>> return 0;
>>
>> free_vinst:
>> + kfree(vinst->name);
>> kfree(vinst);
>> return -ENODEV;
>>
>
More information about the Linuxppc-dev
mailing list