Re:Re: [PATCH] Fix incorrect return value of pre_map_gar_callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Aili Yao <yaoaili@xxxxxxxxxxxx>

Hi, Thanks for your comments!

> -----Original Message-----
> From: James Morse [mailto:james.morse@xxxxxxx]
> Sent: Thursday, October 29, 2020 3:19 AM
> To: yaoaili126@xxxxxxx
> Cc: rjw@xxxxxxxxxxxxx; lenb@xxxxxxxxxx; tony.luck@xxxxxxxxx; bp@xxxxxxxxx;
> linux-acpi@xxxxxxxxxxxxxxx; YANGFENG1 [杨峰]
> <YANGFENG1@xxxxxxxxxxxx>; yaoaili [么爱利] <yaoaili@xxxxxxxxxxxx>
> Subject: Re: [PATCH] Fix incorrect return value of pre_map_gar_callback
> 
> Hi!
> 
> On 26/10/2020 06:15, yaoaili126@xxxxxxx wrote:
> > From: Aili Yao <yaoaili@xxxxxxxxxxxx>
> >
> > From commit 6915564dc5a8 ("ACPI: OSL: Change the type of
> > acpi_os_map_generic_address() return
> > value"),acpi_os_map_generic_address
> > will return logical address or NULL for error, but
> > pre_map_gar_callback,for ACPI_ADR_SPACE_SYSTEM_IO case, it should
> 
> 'it should' refers to pre_map_gar_callback(), not
> acpi_os_map_generic_address()?
>

yes 

> 
> > be also return 0,as it's a
> > normal case, but now it will return -ENXIO. so check it out for such
> > case to avoid einj module initialization fail.
> 
> apei_map_generic_address() calls acpi_os_map_generic_address() which
> returns NULL for any address space that isn't
> ACPI_ADR_SPACE_SYSTEM_MEMORY.
> That commit now maps this to an error code, where-as before: this code was
> getting away with it.
> 
> The bug is it tries to map a GAR that doesn't need mapping.
> 
> 
> Could we avoid this problem more clearly by returning 0 from
> apei_map_generic_address() for address spaces that don't need mapping?
> (e.g. IO)
> 
> This would also fix any other callers lurking in apei.
> 

yes, you are right, I think we can move the ACPI_ADR_SPACE_SYSTEM_MEMORY check to:

    626 int apei_map_generic_address(struct acpi_generic_address *reg)
    627 {
    628         int rc;
    629         u32 access_bit_width;
    630         u64 address;
    631 
    632         rc = apei_check_gar(reg, &address, &access_bit_width);
    633         if (rc)
    634                 return rc;
    635 
    636         if (!acpi_os_map_generic_address(reg) &&
    637          reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
    638                 return -ENXIO;
    639         
    640         return 0;
    641 }
    642 EXPORT_SYMBOL_GPL(apei_map_generic_address);
> 
> Thanks,
> 
> James
> 
> 
> > diff --git a/drivers/acpi/apei/apei-base.c
> > b/drivers/acpi/apei/apei-base.c index 552fd9ffaca4..042d2dbdb855
> > 100644
> > --- a/drivers/acpi/apei/apei-base.c
> > +++ b/drivers/acpi/apei/apei-base.c
> > @@ -230,7 +230,8 @@ static int pre_map_gar_callback(struct
> > apei_exec_context *ctx,  {
> >  	u8 ins = entry->instruction;
> >
> > -	if (ctx->ins_table[ins].flags & APEI_EXEC_INS_ACCESS_REGISTER)
> > +	if (ctx->ins_table[ins].flags & APEI_EXEC_INS_ACCESS_REGISTER &&
> > +	 entry->register_region.space_id ==
> ACPI_ADR_SPACE_SYSTEM_MEMORY)
> >  		return apei_map_generic_address(&entry->register_region);
> >
> >  	return 0;
> 

Thanks
Aili Yao




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux