NAK: [PATCH][focal/linux-azure] PCI: hv: Avoid a kmemleak false positive caused by the hbus buffer

Tim Gardner tim.gardner at canonical.com
Tue May 17 14:13:14 UTC 2022


I'll follow up with a proper SRU justification. Plus I forgot to attach 
the second patch.

On 5/17/22 07:20, Tim Gardner wrote:
> From: Dexuan Cui <decui at microsoft.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1973758
> 
> With the recent 59bb47985c1d ("mm, sl[aou]b: guarantee natural
> alignment for kmalloc(power-of-two)"), kzalloc() is able to allocate
> a 4KB buffer that is guaranteed to be 4KB-aligned. Here the size and
> alignment of hbus is important because hbus's field
> retarget_msi_interrupt_params must not cross a 4KB page boundary.
> 
> Here we prefer kzalloc to get_zeroed_page(), because a buffer
> allocated by the latter is not tracked and scanned by kmemleak, and
> hence kmemleak reports the pointer contained in the hbus buffer
> (i.e. the hpdev struct, which is created in new_pcichild_device() and
> is tracked by hbus->children) as memory leak (false positive).
> 
> If the kernel doesn't have 59bb47985c1d, get_zeroed_page() *must* be
> used to allocate the hbus buffer and we can avoid the kmemleak false
> positive by using kmemleak_alloc() and kmemleak_free() to ask
> kmemleak to track and scan the hbus buffer.
> 
> Reported-by: Lili Deng <v-lide at microsoft.com>
> Signed-off-by: Dexuan Cui <decui at microsoft.com>
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
> Reviewed-by: Michael Kelley <mikelley at microsoft.com>
> (backported from commit 877b911a5ba0733f62239055ee869f2e117b57da)
> [rtg - context adjustment]
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
>   drivers/pci/controller/pci-hyperv.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
> index 6272e7dda1fe..ea5aded65ec1 100644
> --- a/drivers/pci/controller/pci-hyperv.c
> +++ b/drivers/pci/controller/pci-hyperv.c
> @@ -3388,7 +3388,7 @@ static int hv_pci_probe(struct hv_device *hdev,
>   	 * hv_pcibus_device contains the hypercall arguments for retargeting in
>   	 * hv_irq_unmask(). Those must not cross a page boundary.
>   	 */
> -	BUILD_BUG_ON(sizeof(*hbus) > PAGE_SIZE);
> +	BUILD_BUG_ON(sizeof(*hbus) > HV_HYP_PAGE_SIZE);
>   
>   	bridge = devm_pci_alloc_host_bridge(&hdev->device, 0);
>   	if (!bridge)
> @@ -3412,7 +3412,7 @@ static int hv_pci_probe(struct hv_device *hdev,
>   	 * positive by using kmemleak_alloc() and kmemleak_free() to ask
>   	 * kmemleak to track and scan the hbus buffer.
>   	 */
> -	hbus = kzalloc(HV_HYP_PAGE_SIZE, GFP_KERNEL);
> +	hbus = (struct hv_pcibus_device *)kzalloc(HV_HYP_PAGE_SIZE, GFP_KERNEL);
>   	if (!hbus)
>   		return -ENOMEM;
>   
> @@ -3670,7 +3670,7 @@ static int hv_pci_remove(struct hv_device *hdev)
>   
>   	hv_put_dom_num(hbus->bridge->domain_nr);
>   
> -	free_page((unsigned long)hbus);
> +	kfree(hbus);
>   	return ret;
>   }
>   

-- 
-----------
Tim Gardner
Canonical, Inc



More information about the kernel-team mailing list