All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiang Liu <jiang.liu@linux.intel.com>
To: Yinghai Lu <yinghai@kernel.org>, "H. Peter Anvin" <hpa@zytor.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Borislav Petkov <bp@alien8.de>,
	Randy Dunlap <rdunlap@infradead.org>,
	Ingo Molnar <mingo@kernel.org>, Joerg Roedel <joro@8bytes.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Tony Luck <tony.luck@intel.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>
Cc: "linux-tip-commits@vger.kernel.org"  <linux-tip-commits@vger.kernel.org>
Subject: Re: [tip:x86/apic] x86, PCI, ACPI: Kill private function resource_to_addr() in arch/x86/pci/acpi.c
Date: Wed, 10 Dec 2014 21:36:53 +0800	[thread overview]
Message-ID: <54884C75.6050406@linux.intel.com> (raw)
In-Reply-To: <CAE9FiQWaL1Qu1eP-fQV784ucy+r-65AZ95VyiUrefn0dNtfLDw@mail.gmail.com>

Hi Yinghai,
	I have one comment about the attached patch related to
following piece of code. I'm not sure whether we should check
"addr.maximum - addr.minimum + 1 != addr.address_length"
instead of "!addr.address_length". Otherwise:

Reviewed-by: Jiang Liu <jiang.liu@linux.intel.com>
Regards!
Gerry

Index: linux-2.6/drivers/acpi/resource.c
===================================================================
--- linux-2.6.orig/drivers/acpi/resource.c
+++ linux-2.6/drivers/acpi/resource.c
@@ -199,7 +199,7 @@ bool acpi_dev_resource_address_space(str
 	}

 	status = acpi_resource_to_address64(ares, &addr);
-	if (ACPI_FAILURE(status))
+	if (ACPI_FAILURE(status) || !addr.address_length)
 		return false;

 	res->start = addr.minimum;	

On 2014/12/10 12:08, Yinghai Lu wrote:
> On Mon, Nov 3, 2014 at 2:57 AM, tip-bot for Jiang Liu <tipbot@zytor.com> wrote:
>> Commit-ID:  e22ce93870deae0e9a54e1539f0088538f187780
>> Gitweb:     http://git.kernel.org/tip/e22ce93870deae0e9a54e1539f0088538f187780
>> Author:     Jiang Liu <jiang.liu@linux.intel.com>
>> AuthorDate: Mon, 27 Oct 2014 13:21:34 +0800
>> Committer:  Thomas Gleixner <tglx@linutronix.de>
>> CommitDate: Mon, 3 Nov 2014 11:56:07 +0100
>>
>> x86, PCI, ACPI: Kill private function resource_to_addr() in arch/x86/pci/acpi.c
>>
>> Private function resource_to_addr() is used to parse ACPI resources
>> for PCI host bridge. There are public interfaces available for that
>> purpose, so replace resource_to_addr() with public interfaces.
>>
>> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
>> Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
>> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> Cc: Tony Luck <tony.luck@intel.com>
>> Cc: Joerg Roedel <joro@8bytes.org>
>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
>> Cc: Randy Dunlap <rdunlap@infradead.org>
>> Cc: Yinghai Lu <yinghai@kernel.org>
>> Cc: Borislav Petkov <bp@alien8.de>
>> Link: http://lkml.kernel.org/r/1414387308-27148-5-git-send-email-jiang.liu@linux.intel.com
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>> ---
>>  arch/x86/pci/acpi.c | 144 +++++++++++++++++++---------------------------------
>>  1 file changed, 53 insertions(+), 91 deletions(-)
>>
>> diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
>> index cfd1b13..3f72d93 100644
>> --- a/arch/x86/pci/acpi.c
>> +++ b/arch/x86/pci/acpi.c
>> @@ -218,114 +218,76 @@ static void teardown_mcfg_map(struct pci_root_info *info)
>>  }
>>  #endif
>>
>> -static acpi_status resource_to_addr(struct acpi_resource *resource,
>> -                                   struct acpi_resource_address64 *addr)
>> -{
>> -       acpi_status status;
>> -       struct acpi_resource_memory24 *memory24;
>> -       struct acpi_resource_memory32 *memory32;
>> -       struct acpi_resource_fixed_memory32 *fixed_memory32;
>> -
>> -       memset(addr, 0, sizeof(*addr));
>> -       switch (resource->type) {
>> -       case ACPI_RESOURCE_TYPE_MEMORY24:
>> -               memory24 = &resource->data.memory24;
>> -               addr->resource_type = ACPI_MEMORY_RANGE;
>> -               addr->minimum = memory24->minimum;
>> -               addr->address_length = memory24->address_length;
>> -               addr->maximum = addr->minimum + addr->address_length - 1;
>> -               return AE_OK;
>> -       case ACPI_RESOURCE_TYPE_MEMORY32:
>> -               memory32 = &resource->data.memory32;
>> -               addr->resource_type = ACPI_MEMORY_RANGE;
>> -               addr->minimum = memory32->minimum;
>> -               addr->address_length = memory32->address_length;
>> -               addr->maximum = addr->minimum + addr->address_length - 1;
>> -               return AE_OK;
>> -       case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
>> -               fixed_memory32 = &resource->data.fixed_memory32;
>> -               addr->resource_type = ACPI_MEMORY_RANGE;
>> -               addr->minimum = fixed_memory32->address;
>> -               addr->address_length = fixed_memory32->address_length;
>> -               addr->maximum = addr->minimum + addr->address_length - 1;
>> -               return AE_OK;
>> -       case ACPI_RESOURCE_TYPE_ADDRESS16:
>> -       case ACPI_RESOURCE_TYPE_ADDRESS32:
>> -       case ACPI_RESOURCE_TYPE_ADDRESS64:
>> -               status = acpi_resource_to_address64(resource, addr);
>> -               if (ACPI_SUCCESS(status) &&
>> -                   (addr->resource_type == ACPI_MEMORY_RANGE ||
>> -                   addr->resource_type == ACPI_IO_RANGE) &&
>> -                   addr->address_length > 0) {
>> -                       return AE_OK;
>> -               }
>> -               break;
>> -       }
>> -       return AE_ERROR;
>> -}
>> -
>>  static acpi_status count_resource(struct acpi_resource *acpi_res, void *data)
>>  {
>>         struct pci_root_info *info = data;
>> -       struct acpi_resource_address64 addr;
>> -       acpi_status status;
>> +       struct resource r = {
>> +               .flags = 0
>> +       };
>>
>> -       status = resource_to_addr(acpi_res, &addr);
>> -       if (ACPI_SUCCESS(status))
>> +       if (!acpi_dev_resource_memory(acpi_res, &r) &&
>> +           !acpi_dev_resource_address_space(acpi_res, &r))
>> +               return AE_OK;
>> +
>> +       if ((r.flags & (IORESOURCE_IO | IORESOURCE_MEM)) && resource_size(&r))
>>                 info->res_num++;
>> +
>>         return AE_OK;
>>  }
>>
>>  static acpi_status setup_resource(struct acpi_resource *acpi_res, void *data)
>>  {
>>         struct pci_root_info *info = data;
>> -       struct resource *res;
>> -       struct acpi_resource_address64 addr;
>> -       acpi_status status;
>> -       unsigned long flags;
>> -       u64 start, orig_end, end;
>> +       u64 translation_offset = 0;
>> +       struct resource r = {
>> +               .flags = 0
>> +       };
>> +
>> +       if (acpi_dev_resource_memory(acpi_res, &r)) {
>> +               r.flags &= IORESOURCE_MEM | IORESOURCE_IO;
>> +       } else if (acpi_dev_resource_address_space(acpi_res, &r)) {
>> +               u64 orig_end;
>> +               struct acpi_resource_address64 addr;
>> +
>> +               r.flags &= IORESOURCE_MEM | IORESOURCE_IO;
>> +               if (r.flags == 0)
>> +                       return AE_OK;
>>
>> -       status = resource_to_addr(acpi_res, &addr);
>> -       if (!ACPI_SUCCESS(status))
>> -               return AE_OK;
>> +               if (ACPI_FAILURE(acpi_resource_to_address64(acpi_res, &addr)))
>> +                       return AE_OK;
>>
>> -       if (addr.resource_type == ACPI_MEMORY_RANGE) {
>> -               flags = IORESOURCE_MEM;
>> -               if (addr.info.mem.caching == ACPI_PREFETCHABLE_MEMORY)
>> -                       flags |= IORESOURCE_PREFETCH;
>> -       } else if (addr.resource_type == ACPI_IO_RANGE) {
>> -               flags = IORESOURCE_IO;
>> -       } else
>> -               return AE_OK;
>> +               if (addr.resource_type == ACPI_MEMORY_RANGE &&
>> +                   addr.info.mem.caching == ACPI_PREFETCHABLE_MEMORY)
>> +                       r.flags |= IORESOURCE_PREFETCH;
>>
>> -       start = addr.minimum + addr.translation_offset;
>> -       orig_end = end = addr.maximum + addr.translation_offset;
>> +               translation_offset = addr.translation_offset;
>> +               orig_end = r.end;
>> +               r.start += translation_offset;
>> +               r.end += translation_offset;
>>
>> -       /* Exclude non-addressable range or non-addressable portion of range */
>> -       end = min(end, (u64)iomem_resource.end);
>> -       if (end <= start) {
>> -               dev_info(&info->bridge->dev,
>> -                       "host bridge window [%#llx-%#llx] "
>> -                       "(ignored, not CPU addressable)\n", start, orig_end);
>> -               return AE_OK;
>> -       } else if (orig_end != end) {
>> -               dev_info(&info->bridge->dev,
>> -                       "host bridge window [%#llx-%#llx] "
>> -                       "([%#llx-%#llx] ignored, not CPU addressable)\n",
>> -                       start, orig_end, end + 1, orig_end);
>> +               /* Exclude non-addressable range or non-addressable portion of range */
>> +               r.end = min(r.end, iomem_resource.end);
>> +               if (r.end <= r.start) {
>> +                       dev_info(&info->bridge->dev,
>> +                               "host bridge window [%#llx-%#llx] (ignored, not CPU addressable)\n",
>> +                                r.start, orig_end);
>> +                       return AE_OK;
>> +               } else if (orig_end != r.end) {
>> +                       dev_info(&info->bridge->dev,
>> +                               "host bridge window [%#llx-%#llx] ([%#llx-%#llx] ignored, not CPU addressable)\n",
>> +                               r.start, orig_end, r.end + 1, orig_end);
>> +               }
>>         }
>>
>> -       res = &info->res[info->res_num];
>> -       res->name = info->name;
>> -       res->flags = flags;
>> -       res->start = start;
>> -       res->end = end;
>> -       info->res_offset[info->res_num] = addr.translation_offset;
>> -       info->res_num++;
>> -
>> -       if (!pci_use_crs)
>> -               dev_printk(KERN_DEBUG, &info->bridge->dev,
>> -                          "host bridge window %pR (ignored)\n", res);
>> +       if (r.flags && resource_size(&r)) {
>> +               r.name = info->name;
>> +               info->res[info->res_num] = r;
>> +               info->res_offset[info->res_num] = translation_offset;
>> +               info->res_num++;
>> +               if (!pci_use_crs)
>> +                       dev_printk(KERN_DEBUG, &info->bridge->dev,
>> +                                  "host bridge window %pR (ignored)\n", &r);
>> +       }
>>
>>         return AE_OK;
>>  }
> 
> This one cause one system with Nehalem and one with Westmere failing.
> 
> [   32.353347] acpi PNP0A08:00: host bridge window expanded to [mem
> 0x00000000-0xffffffff]; [mem 0x000a0000-0x000bffff] ignored
> [   32.362897] acpi PNP0A08:00: host bridge window expanded to [mem
> 0x00000000-0xffffffff]; [mem 0x000d0000-0x000dffff] ignored
> [   32.382862] acpi PNP0A08:00: host bridge window expanded to [mem
> 0x00000000-0xffffffff]; [mem 0x00000000-0xffffffff] ignored
> [   32.402889] acpi PNP0A08:00: host bridge window expanded to [mem
> 0x00000000-0xffffffff]; [??? 0x00000000-0xffffffff flags 0x0] ignored
> [   32.423000] acpi PNP0A08:00: host bridge window expanded to [mem
> 0x00000000-0xffffffff]; [mem 0x00000000-0xffffffff] ignored
> [   32.602921] PCI host bridge to bus 0000:00
> [   32.603158] pci_bus 0000:00: root bus resource [bus 00-3f]
> [   32.622782] pci_bus 0000:00: root bus resource [io  0x0000-0x5fff]
> [   32.642569] pci_bus 0000:00: root bus resource [mem 0x00000000-0xffffffff]
> [   32.642893] pci_bus 0000:00: root bus resource [mem
> 0xfc000000000-0xfc07fffffff pref]
> 
> Looks like the commit have several problems.
> 
> Attached patch should address them.
> 
> Please fix it before it get into linus tree.
> 
> Thanks
> 
> Yinghai
> 

  reply	other threads:[~2014-12-10 13:37 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-27  5:21 [Patch v7 00/18] Enable support of IOAPIC hotplug on x86 platforms Jiang Liu
2014-10-27  5:21 ` [Patch v7 01/18] ACPI, irq: fix regression casued by 6b9fb7082409 Jiang Liu
2014-10-28 17:44   ` Pavel Machek
2014-10-28 18:13   ` Bjorn Helgaas
2014-10-28 18:45     ` Thomas Gleixner
2014-10-27  5:21 ` [Patch v7 02/18] x86, intel-mid: Create IRQs for APB timers and RTC timers Jiang Liu
2014-10-28 18:54   ` [tip:x86/urgent] " tip-bot for Jiang Liu
2014-10-29  9:10   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 03/18] ACPI, irq, x86: Return IRQ instead of GSI in mp_register_gsi() Jiang Liu
2014-10-28 18:54   ` [tip:x86/urgent] " tip-bot for Jiang Liu
2014-10-29  9:10   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 04/18] x86, PCI, ACPI: Kill private function resource_to_addr() in arch/x86/pci/acpi.c Jiang Liu
2014-11-03 10:57   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-11-03 14:50     ` Borislav Petkov
2014-12-10  4:08     ` Yinghai Lu
2014-12-10 13:36       ` Jiang Liu [this message]
2014-12-10 20:15       ` Thomas Gleixner
2014-12-11  0:31         ` Yinghai Lu
2014-12-11  0:35           ` Borislav Petkov
2014-12-11  1:57             ` Yinghai Lu
2014-12-11  4:13               ` Mike Galbraith
2014-12-11  7:42               ` Richard Cochran
2014-12-11 16:36           ` Thomas Gleixner
2014-12-11 16:57             ` Yinghai Lu
2014-12-11 16:37           ` Bjorn Helgaas
2014-10-27  5:21 ` [Patch v7 05/18] ACPI: Correct return value of acpi_dev_resource_address_space() Jiang Liu
2014-10-27 22:30   ` Rafael J. Wysocki
2014-10-27 22:49   ` Bjorn Helgaas
2014-10-27 23:11     ` Rafael J. Wysocki
2014-10-28  1:13       ` Bjorn Helgaas
2014-11-03 10:57   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:00   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 06/18] ACPI: Fix minor syntax issues in processor_core.c Jiang Liu
2014-11-03 10:58   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:02   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 07/18] ACPI: Add interfaces to parse IOAPIC ID for IOAPIC hotplug Jiang Liu
2014-11-03 10:58   ` [tip:x86/apic] " tip-bot for Yinghai Lu
2014-10-27  5:21 ` [Patch v7 08/18] PCI: Remove PCI ioapic driver Jiang Liu
2014-11-03 10:58   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:02   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 09/18] x86, irq: Split out alloc_ioapic_save_registers() Jiang Liu
2014-11-03 10:58   ` [tip:x86/apic] " tip-bot for Yinghai Lu
2014-12-19 14:03   ` tip-bot for Yinghai Lu
2014-10-27  5:21 ` [Patch v7 10/18] x86, irq: Prefer assigned ID in APIC ID register for x86_64 Jiang Liu
2014-11-03 10:59   ` [tip:x86/apic] " tip-bot for Yinghai Lu
2014-12-19 14:03   ` tip-bot for Yinghai Lu
2014-10-27  5:21 ` [Patch v7 11/18] x86, irq: Remove __init marker for functions will be used by IOAPIC hotplug Jiang Liu
2014-11-03 10:59   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:03   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 12/18] x86, irq: Keep balance of IOAPIC pin reference count Jiang Liu
2014-11-03 10:59   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:04   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 13/18] x86, irq: Refine mp_register_ioapic() to prepare for IOAPIC hotplug Jiang Liu
2014-11-03 11:00   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:04   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 14/18] x86, irq, ACPI: Introduce a rwsem to protect IOAPIC operations from hotplug Jiang Liu
2014-11-01 18:59   ` Thomas Gleixner
2014-11-02  5:24     ` Jiang Liu
2014-10-27  5:21 ` [Patch v7 15/18] x86, irq, ACPI: Implement interface to support ACPI based IOAPIC hot-addition Jiang Liu
2014-11-03 11:00   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:04   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 16/18] x86, irq, ACPI: Implement interfaces to support ACPI based IOAPIC hot-removal Jiang Liu
2014-11-03 11:00   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:05   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 17/18] x86, irq: Introduce helper to check whether an IOAPIC has been registered Jiang Liu
2014-10-28 17:47   ` Pavel Machek
2014-11-03 11:01   ` [tip:x86/apic] " tip-bot for Jiang Liu
2014-12-19 14:05   ` tip-bot for Jiang Liu
2014-10-27  5:21 ` [Patch v7 18/18] x86, irq, ACPI: Implement ACPI driver to support IOAPIC hotplug Jiang Liu
2014-11-03 11:01   ` [tip:x86/apic] " tip-bot for Jiang Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54884C75.6050406@linux.intel.com \
    --to=jiang.liu@linux.intel.com \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=bp@alien8.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=hpa@zytor.com \
    --cc=joro@8bytes.org \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rjw@rjwysocki.net \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=torvalds@linux-foundation.org \
    --cc=yinghai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.