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

Re: [RESEND PATCH v12 2/3] vpci/msi: Implement cleanup function for MSI


  • To: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • From: "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>
  • Date: Wed, 21 Jan 2026 09:17:41 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=uocHU4LzLMLoUS9x6jLgMdGbCEpafNB+1BukWes3N9A=; b=bnwmZP/jr2OCb98+CaK/I/ICv24ezDEeHQNORfrGEz84w9HrBRY+rYG1LlZLSOk4kMl73QQVFWQWxemH2w3phT9NnHRcaCYPnPZINrrc6W1j0NKtRBvWMItj1irODWsZ/FaXsKYrzfiyncSUIuVfjy5ypyu4td1WHN7dWzB3atsArlLYiNt6htz9m/Nt+pXG0Bcsb7nCV/W818h7SLwyC/ZNkmJmwaBvXLuSRoaNDSm/TBoh0j5L35m/a+57Sbkeq8NHTD7kDBfF9IeWLs8a4FelYutMRkWVf449lq5KOx4M8RwXgsox4LNER9JREbcD5M2FecpxJMyccZUk/onK3w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OVNyafOquDZ6r3wqR6eAq2ZgQxslIcyzeGrOKBifFjn9LnEyMgLnaDjTbAiS5M+Q5gFLqb7P8gVuHlvgdh89SbeqLFum0h3hLWbXpPcZDW1OWUYAPnaBCCPvi2OYMVCATJpfU6GJJQqlqpWMwT2cNeSh5Gb/tlFKdtzAtw8teHjQjV8kUihwpVkZYmSukvVx2pkMH551hDwn9ImIhK3JDGgCCbwXI2VrhccEF+Kb5NnXy6x7+Pcm8qG95St0OI7lV/srS1QPMLGyo7zje3Y1LjHc+mth1+uHIEGpDhPFowmOi4G5FHc9QU6Lk+UhsJMFf9EarzCkPPj8cU7BfRUz7Q==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>, "Huang, Ray" <Ray.Huang@xxxxxxx>
  • Delivery-date: Wed, 21 Jan 2026 09:17:50 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHcaBtBN3StFxVxMUK3Tlwpczk4lLVcl12AgACLCwA=
  • Thread-topic: [RESEND PATCH v12 2/3] vpci/msi: Implement cleanup function for MSI

On 2026/1/21 16:56, Roger Pau Monné wrote:
> On Mon, Dec 08, 2025 at 04:18:14PM +0800, Jiqian Chen wrote:
>> When MSI initialization fails, vPCI hides the capability, but
>> removing handlers and datas won't be performed until the device is
>> deassigned. So, implement MSI cleanup hook that will be called to
>> cleanup MSI related handlers and free it's associated data when
>> initialization fails.
>>
>> Since cleanup function of MSI is implemented, delete the open-code
>> in vpci_deassign_device().
>>
>> Signed-off-by: Jiqian Chen <Jiqian.Chen@xxxxxxx>
>> ---
>> cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>
>> ---
>> v11->v12 changes:
>> * In cleanup_msi(), move "if ( !hide )" above vpci_remove_registers()
>>   since deassign device will do removing registers itself.
>> * Read address64 and mask info from hardware since they are not reliable
>>   when init_msi fails.
>>
>> v10->v11 changes:
>> * Add hide paratemer to cleanup_msi().
>> * Check hide, if false return directly instead of letting ctrl RO.
>> * Delete xfree(pdev->vpci->msi); in vpci_deassign_device().
>> * Remove Roger's Reviewed-by since patch change.
>>
>> v9->v10 changes:
>> No.
>>
>> v8->v9 changes:
>> * Add Roger's Reviewed-by.
>>
>> v7->v8 changes:
>> * Add a comment to describe why "-2" in cleanup_msi().
>> * Given the code in vpci_remove_registers() an error in the removal of
>>   registers would likely imply memory corruption, at which point it's
>>   best to fully disable the device. So, Rollback the last two modifications 
>> of v7.
>>
>> v6->v7 changes:
>> * Change the pointer parameter of cleanup_msi() to be const.
>> * When vpci_remove_registers() in cleanup_msi() fails, not to return
>>   directly, instead try to free msi and re-add ctrl handler.
>> * Pass pdev->vpci into vpci_add_register() instead of pdev->vpci->msi in
>>   init_msi() since we need that every handler realize that msi is NULL
>>   when msi is free but handlers are still in there.
>>
>> v5->v6 changes:
>> No.
>>
>> v4->v5 changes:
>> * Change definition "static void cleanup_msi" to "static int cf_check 
>> cleanup_msi"
>>   since cleanup hook is changed to be int.
>> * Add a read-only register for MSI Control Register in the end of 
>> cleanup_msi.
>>
>> v3->v4 changes:
>> * Change function name from fini_msi() to cleanup_msi().
>> * Remove unnecessary comment.
>> * Change to use XFREE to free vpci->msi.
>>
>> v2->v3 changes:
>> * Remove all fail path, and use fini_msi() hook instead.
>> * Change the method to calculating the size of msi registers.
>>
>> v1->v2 changes:
>> * Added a new function fini_msi to free all MSI resources instead of using 
>> an array
>>   to record registered registers.
>>
>> Best regards,
>> Jiqian Chen.
>> ---
>>  xen/drivers/vpci/msi.c  | 55 ++++++++++++++++++++++++++++++++++++++++-
>>  xen/drivers/vpci/vpci.c |  1 -
>>  2 files changed, 54 insertions(+), 2 deletions(-)
>>
>> diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c
>> index c3eba4e14870..181ec902dffb 100644
>> --- a/xen/drivers/vpci/msi.c
>> +++ b/xen/drivers/vpci/msi.c
>> @@ -193,6 +193,59 @@ static void cf_check mask_write(
>>      msi->mask = val;
>>  }
>>  
>> +static int cf_check cleanup_msi(const struct pci_dev *pdev, bool hide)
>> +{
>> +    int rc;
>> +    unsigned int end;
> 
> Nit: I think you could narrow the scope of end and define it inside
> the if ( vpci->msi ) { ... } block?
Will change.

> 
>> +    struct vpci *vpci = pdev->vpci;
>> +    const unsigned int msi_pos = pdev->msi_pos;
>> +    const unsigned int ctrl = msi_control_reg(msi_pos);
>> +
>> +    if ( !hide )
>> +    {
>> +        XFREE(vpci->msi);
>> +        return 0;
>> +    }
>> +
>> +    if ( vpci->msi )
>> +    {
>> +        uint16_t control = pci_conf_read16(pdev->sbdf, ctrl);
>> +        bool address64 = is_64bit_address(control);
>> +
>> +        if ( is_mask_bit_support(control) )
>> +            end = msi_pending_bits_reg(msi_pos, address64);
>> +        else
>> +            /*
>> +            * "-2" here is to cut the reserved 2 bytes of Message Data when
>> +            * there is no masking support.
>> +            */
>> +            end = msi_mask_bits_reg(msi_pos, address64) - 2;
>> +
>> +        rc = vpci_remove_registers(vpci, ctrl, end - ctrl);
>> +        if ( rc )
>> +        {
>> +            printk(XENLOG_ERR "%pd %pp: fail to remove MSI handlers 
>> rc=%d\n",
>> +                pdev->domain, &pdev->sbdf, rc);
>> +            ASSERT_UNREACHABLE();
>> +            return rc;
>> +        }
>> +
>> +        XFREE(vpci->msi);
>> +    }
>> +
>> +    /*
>> +     * The driver may not traverse the capability list and think device
>> +     * supports MSI by default. So here let the control register of MSI
>> +     * be Read-Only is to ensure MSI disabled.
>> +     */
>> +    rc = vpci_add_register(vpci, vpci_hw_read16, NULL, ctrl, 2, NULL);
>> +    if ( rc )
>> +        printk(XENLOG_ERR "%pd %pp: fail to add MSI ctrl handler rc=%d\n",
>> +               pdev->domain, &pdev->sbdf, rc);
> 
> Strictly speaking (also in the previous patch), we only need to do
Extended capabilities are not expose for domUs currently, and all the places 
call cleanup_rebar already check "!is_hardware_domain(pdev->domain)", so rebar 
may not need this ?
msix.c needs this too, I think.

> this hiding for the hardware domain.  For domUs access to the control
> register would be ignored by default.
> 
> Would you be OK to add an:
> 
> if ( !is_hardware_domain(pdev->domain) )
>     return 0;
> 
> Ahead of the call to add the vpci_hw_read16 trap register?
OK, will change in next version.

> 
> Thanks, Roger.

-- 
Best regards,
Jiqian Chen.


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.