Linux PCI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Nirmal Patel" <nirmal.patel@intel.com>
Cc: linux-pci@vger.kernel.org
Subject: Re: [PATCH v3] PCI: vmd: Only assign OSC features in bare metal OS
Date: Mon, 13 Jul 2026 22:18:30 +0000	[thread overview]
Message-ID: <20260713221831.28BAA1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260713220844.561357-1-nirmal.patel@intel.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [High] Flawed VM detection heuristic breaks intended OSC flag assignment in edge cases.

Pre-existing issues:
- [Medium] Memory leak of dynamically allocated SRCU structures on error paths.
- [Medium] Leak of dynamically allocated resource entries and IRQ domain on early return.
--

--- Patch [1]: [PATCH v3] PCI: vmd: Only assign OSC features in bare metal OS ---
commit 7b1a0a2085cd70ccc13f43497ed84956b2e0637c
Author: Nirmal Patel <nirmal.patel@intel.com>

PCI: vmd: Only assign OSC features in bare metal OS

Copy valid OSC flags from root bridge only when OS can provide correct
values. In virtual machine, all of the control features are disabled as
hypervisor will not passthrough root bridge information to VM.

> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> --- a/drivers/pci/controller/vmd.c
> +++ b/drivers/pci/controller/vmd.c

[ ... ]

> @@ -862,14 +863,16 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  		.parent = res,
>  	};
>  
> +	/* Non-zero offset means guest/direct assign view. */
> +	vmd_in_guest = offset[0] || offset[1];
> +

[Severity: High]
Does this heuristic correctly account for bare-metal BAR reassignment or 
identity-mapped VMs?

If the Linux PCI subsystem reassigns the VMD device's BARs on bare metal,
for example due to resource conflicts, the offsets would become non-zero.
This would cause the driver to incorrectly identify the system as a guest 
and skip copying OSC control flags on bare metal.

Conversely, if a VM uses 1:1 identity-mapped direct assignment where the
guest physical address equals the host physical address, the offset would 
be zero. The driver would then treat the VM as bare metal, copying the 
disabled or invalid OSC flags from the virtual host bridge.

>  	/*
>  	 * Currently MSI remapping must be enabled in guest passthrough mode
>  	 * due to some missing interrupt remapping plumbing. This is probably
>  	 * acceptable because the guest is usually CPU-limited and MSI
>  	 * remapping doesn't become a performance bottleneck.
>  	 */
> -	if (!(features & VMD_FEAT_CAN_BYPASS_MSI_REMAP) ||
> -	    offset[0] || offset[1]) {
> +	if (!(features & VMD_FEAT_CAN_BYPASS_MSI_REMAP) || vmd_in_guest) {
>  		ret = vmd_alloc_irqs(vmd);

[Severity: Medium]
This is a pre-existing issue, but does vmd_alloc_irqs() leak dynamically
allocated SRCU structures on error paths?

If devm_request_irq() fails inside vmd_alloc_irqs(), the function returns
the error directly without calling cleanup_srcu_struct() on the SRCU
structures initialized in previous loop iterations or the current one.

Additionally, if vmd_enable_domain() fails and propagates an error back to
vmd_probe(), the out_release_instance error path in vmd_probe() does not
call vmd_cleanup_srcu(), which seems to leak the SRCU per-CPU data.

>  		if (ret)
>  			return ret;

[ ... ]

> @@ -910,8 +913,10 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  		return -ENODEV;
>  	}
>  
> -	vmd_copy_host_bridge_flags(pci_find_host_bridge(vmd->dev->bus),
> -				   to_pci_host_bridge(vmd->bus->bridge));
> +	/* Don't copy _OSC control flags in VM, it disables features. */
> +	if (!vmd_in_guest)
> +		vmd_copy_host_bridge_flags(pci_find_host_bridge(vmd->dev->bus),
> +					 to_pci_host_bridge(vmd->bus->bridge));

[Severity: Medium]
This is a pre-existing issue, but does vmd_enable_domain() leak dynamically
allocated resource entries and the IRQ domain on early return?

When pci_bus_find_emul_domain_nr() is called a few lines before this hunk
in vmd_enable_domain():

        sd->domain = pci_bus_find_emul_domain_nr(0, 0x10000, INT_MAX);
        if (sd->domain < 0)
                return sd->domain;

If this fails, it returns early without calling pci_free_resource_list() 
or vmd_remove_irq_domain(), stranding the memory allocated for the 
resources list and the IRQ domain created earlier in the function.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260713220844.561357-1-nirmal.patel@intel.com?part=1

  reply	other threads:[~2026-07-13 22:18 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-13 22:08 [PATCH v3] PCI: vmd: Only assign OSC features in bare metal OS Nirmal Patel
2026-07-13 22:18 ` sashiko-bot [this message]
2026-07-20 21:22 ` Nirmal Patel

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=20260713221831.28BAA1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=nirmal.patel@intel.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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