From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Yang Zhang <zhangz@hygon.cn>
Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
dave.hansen@linux.intel.com, hpa@zytor.com, bhelgaas@google.com,
x86@kernel.org, LKML <linux-kernel@vger.kernel.org>,
linux-pci@vger.kernel.org
Subject: Re: [PATCH] X86/PCI: Prioritize MMCFG access to hardware registers
Date: Tue, 16 Dec 2025 12:08:48 +0200 (EET) [thread overview]
Message-ID: <07428f84-5fa3-713f-caac-f69c0e92c779@linux.intel.com> (raw)
In-Reply-To: <20251216100332.6610-1-zhangz@hygon.cn>
On Tue, 16 Dec 2025, Yang Zhang wrote:
> As CPU performance demands increase, the configuration of some internal CPU
> registers needs to be dynamically configured in the program, such as
> configuring memory controller strategies within specific time windows.
> These configurations place high demands on the efficiency of the
> configuration instructions themselves, requiring them to retire and
> take effect as quickly as possible.
>
> However, the current kernel code forces the use of the IO Port method for
> PCI accesses with domain=0 and offset less than 256. The IO Port method is
> more like a legacy from historical reasons, and its performance is lower
> than that of the MMCFG method. We conducted comparative tests on AMD and
> Hygon CPUs respectively, even without considering the impact of indirect
> access (IO Ports use 0xCF8 and 0xCFC), simply comparing the performance of
> the following two code:
>
> 1)outl(0x400702,0xCFC);
>
> 2)mmio_config_writel(data_addr,0x400702);
>
> while both codes access the same register. The results shows the MMCFG
> (400+ cycle per access) method outperforms the IO Port (1000+ cycle
> per access) by twice.
>
> Through PMC/PMU event statistics within the AMD/Hygon microarchitecture,
> we found IO Port access causes more stalls within the CPU's internal
> dispatch module, and these stalls are mainly due to the front-end's
> inability to decode the corresponding uops in a timely manner.
> Therefore the main reason for the performance difference between the
> two access methods is that the in/out instructions corresponding to
> the IO Port access belong to microcode, and therefore their decoding
> efficiency is lower than that of mmcfg.
>
> For CPUs that support both MMCFG and IO Port access methods, if a hardware
> register only supports IO Port access, this configuration may lead to
> illegal access. However, we think registers that support I/O Port access
> have corresponding MMCFG addresses. Even we test several AMD/Hygon CPUs
> with this patch and found no problems, we still cannot rule out the
> possibility that all CPUs are problem-free, especially older CPUs. To
> address this risk, we have created a new macro, PREFER MMCONFIG, allowing
> users to choose whether or not to enable this feature.
>
> Signed-off-by: Yang Zhang <zhangz@hygon.cn>
> ---
> arch/x86/Kconfig | 15 +++++++++++++++
> arch/x86/pci/common.c | 14 ++++++++++++++
> 2 files changed, 29 insertions(+)
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 80527299f..037d56690 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -2932,6 +2932,21 @@ config PCI_MMCONFIG
>
> Say Y otherwise.
>
> +config PREFER_MMCONFIG
> + bool "Perfer to use mmconfig over IO Port"
Prefer
--
i.
> + depends on PCI_MMCONFIG
> + help
> + This setting will prioritize the use of mmcfg, which is superior to
> + io port from a performance perspective, mainly for the following reasons:
> + 1) io port is an indirect access; 2) io port instructions are decoded
> + by microcode, which is more likely to cause CPU front-end bound compared
> + to mmcfg using mov instructions.
> +
> + For CPUs that support both MMCFG and IO Port access methods, if a
> + hardware register only supports IO Port access, this configuration
> + may lead to illegal access. Therefore, users must ensure that the
> + configuration will not cause any exceptions before enabling it.
> +
> config PCI_OLPC
> def_bool y
> depends on PCI && OLPC && (PCI_GOOLPC || PCI_GOANY)
> diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
> index ddb798603..8bde5d1df 100644
> --- a/arch/x86/pci/common.c
> +++ b/arch/x86/pci/common.c
> @@ -40,20 +40,34 @@ const struct pci_raw_ops *__read_mostly raw_pci_ext_ops;
> int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn,
> int reg, int len, u32 *val)
> {
> +#ifdef CONFIG_PREFER_MMCONFIG
> + if (raw_pci_ext_ops)
> + return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val);
> + if (domain == 0 && reg < 256 && raw_pci_ops)
> + return raw_pci_ops->read(domain, bus, devfn, reg, len, val);
> +#else
> if (domain == 0 && reg < 256 && raw_pci_ops)
> return raw_pci_ops->read(domain, bus, devfn, reg, len, val);
> if (raw_pci_ext_ops)
> return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val);
> +#endif
> return -EINVAL;
> }
>
> int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn,
> int reg, int len, u32 val)
> {
> +#ifdef CONFIG_PREFER_MMCONFIG
> + if (raw_pci_ext_ops)
> + return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val);
> + if (domain == 0 && reg < 256 && raw_pci_ops)
> + return raw_pci_ops->write(domain, bus, devfn, reg, len, val);
> +#else
> if (domain == 0 && reg < 256 && raw_pci_ops)
> return raw_pci_ops->write(domain, bus, devfn, reg, len, val);
> if (raw_pci_ext_ops)
> return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val);
> +#endif
> return -EINVAL;
> }
>
>
next prev parent reply other threads:[~2025-12-16 10:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-16 10:03 [PATCH] X86/PCI: Prioritize MMCFG access to hardware registers Yang Zhang
2025-12-16 10:08 ` Ilpo Järvinen [this message]
2025-12-16 16:48 ` Thomas Gleixner
-- strict thread matches above, loose matches on Subject: below --
2025-12-16 11:15 Yang Zhang
2025-12-23 16:35 ` Bjorn Helgaas
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=07428f84-5fa3-713f-caac-f69c0e92c779@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=zhangz@hygon.cn \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox