From: Stewart Hildebrand <stewart.hildebrand@amd.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"George Dunlap" <george.dunlap@citrix.com>,
"Julien Grall" <julien@xen.org>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Wei Liu" <wl@xen.org>, "Roger Pau Monné" <roger.pau@citrix.com>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v4 6/6] xen/vpci: header: filter PCI capabilities
Date: Fri, 1 Sep 2023 00:14:18 -0400 [thread overview]
Message-ID: <b76fbdab-9e72-996a-2ae3-afd13b086bad@amd.com> (raw)
In-Reply-To: <059d3e2d-26f2-e24a-57fb-5ae10f6c2f5f@suse.com>
On 8/31/23 08:11, Jan Beulich wrote:
> On 28.08.2023 19:56, Stewart Hildebrand wrote:
>> Currently, Xen vPCI only supports virtualizing the MSI and MSI-X capabilities.
>> Hide all other PCI capabilities (including extended capabilities) from domUs for
>> now, even though there may be certain devices/drivers that depend on being able
>> to discover certain capabilities.
>>
>> We parse the physical PCI capabilities linked list and add vPCI register
>> handlers for the next elements, inserting our own next value, thus presenting a
>> modified linked list to the domU.
>>
>> Introduce helper functions vpci_hw_read8 and vpci_read_val. The vpci_read_val
>> helper function returns a fixed value, which may be used for RAZ registers, or
>> registers whose value doesn't change.
>>
>> Introduce pci_find_next_cap_ttl() helper while adapting the logic from
>> pci_find_next_cap() to suit our needs, and implement the existing
>> pci_find_next_cap() in terms of the new helper.
>>
>> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@amd.com>
>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>>
> Nevertheless a couple of remarks:
>
>> --- a/xen/drivers/pci/pci.c
>> +++ b/xen/drivers/pci/pci.c
>> @@ -39,31 +39,44 @@ unsigned int pci_find_cap_offset(pci_sbdf_t sbdf, unsigned int cap)
>> return 0;
>> }
>>
>> -unsigned int pci_find_next_cap(pci_sbdf_t sbdf, unsigned int pos,
>> - unsigned int cap)
>> +unsigned int pci_find_next_cap_ttl(pci_sbdf_t sbdf, unsigned int pos,
>> + bool (*is_match)(unsigned int, unsigned int),
>> + unsigned int userdata, unsigned int *ttl)
>> {
>> - u8 id;
>> - int ttl = 48;
>> + unsigned int id;
>>
>> - while ( ttl-- )
>> + while ( (*ttl)-- )
>> {
>> pos = pci_conf_read8(sbdf, pos);
>> if ( pos < 0x40 )
>> break;
>>
>> - pos &= ~3;
>> - id = pci_conf_read8(sbdf, pos + PCI_CAP_LIST_ID);
>> + id = pci_conf_read8(sbdf, (pos & ~3) + PCI_CAP_LIST_ID);
>>
>> if ( id == 0xff )
>> break;
>> - if ( id == cap )
>> + if ( is_match(id, userdata) )
>> return pos;
>>
>> - pos += PCI_CAP_LIST_NEXT;
>> + pos = (pos & ~3) + PCI_CAP_LIST_NEXT;
>> }
>> +
>> return 0;
>> }
>>
>> +static bool cf_check is_cap_match(unsigned int id1, unsigned int id2)
>> +{
>> + return id1 == id2;
>> +}
>
> Personally I would have preferred to get away without yet another hook
> function here, by ...
>
>> +unsigned int pci_find_next_cap(pci_sbdf_t sbdf, unsigned int pos,
>> + unsigned int cap)
>> +{
>> + unsigned int ttl = 48;
>> +
>> + return pci_find_next_cap_ttl(sbdf, pos, is_cap_match, cap, &ttl) & ~3;
>
> ... passing NULL here and then suitably handling the case in that
> common helper.
Thinking in terms of reducing the amount of dead code, I'll change it
>> @@ -561,6 +573,71 @@ static int cf_check init_bars(struct pci_dev *pdev)
>> if ( rc )
>> return rc;
>>
>> + if ( !is_hardware_domain(pdev->domain) )
>> + {
>> + if ( !(pci_conf_read16(pdev->sbdf, PCI_STATUS) & PCI_STATUS_CAP_LIST) )
>> + {
>> + /* RAZ/WI */
>> + rc = vpci_add_register(pdev->vpci, vpci_read_val, NULL,
>> + PCI_CAPABILITY_LIST, 1, (void *)0);
>> + if ( rc )
>> + return rc;
>> + }
>> + else
>> + {
>> + /* Only expose capabilities to the guest that vPCI can handle. */
>> + uint8_t next;
>
> If this was "unsigned long", ...
>
>> + unsigned int ttl = 48;
>> +
>> + next = pci_find_next_cap_ttl(pdev->sbdf, PCI_CAPABILITY_LIST,
>> + vpci_cap_supported, 0, &ttl);
>> +
>> + rc = vpci_add_register(pdev->vpci, vpci_read_val, NULL,
>> + PCI_CAPABILITY_LIST, 1,
>> + (void *)(uintptr_t)next);
>
> ... you'd avoid the need for the double cast here and again below. Yet
> then I realize that Misra would take offence at us doing so ...
As ugly as that double cast is, I think I prefer the next and pos declarations have consistent types (which I had intended to be unsigned int to match the prior patches, not uint8_t). As well as not making the MISRA situation any worse. The casts, after all, make it excruciatingly obvious what we're doing here, I hope.
Stew
prev parent reply other threads:[~2023-09-01 4:15 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-28 17:56 [PATCH v4 0/6] vPCI capabilities filtering Stewart Hildebrand
2023-08-28 17:56 ` [PATCH v4 1/6] x86/msi: remove some unused-but-set-variables Stewart Hildebrand
2023-08-29 6:58 ` Jan Beulich
2023-08-28 17:56 ` [PATCH v4 2/6] xen/pci: convert pci_find_*cap* to pci_sbdf_t Stewart Hildebrand
2023-08-30 13:48 ` Jan Beulich
2023-08-28 17:56 ` [PATCH v4 3/6] x86/msi: rearrange read_pci_mem_bar slightly Stewart Hildebrand
2023-08-30 13:51 ` Jan Beulich
2023-08-28 17:56 ` [PATCH v4 4/6] xen/vpci: header: status register handler Stewart Hildebrand
2023-08-30 14:05 ` Jan Beulich
2023-08-31 21:25 ` Stewart Hildebrand
2023-08-28 17:56 ` [RFC PATCH v4 5/6] xen/vpci: support ro mask Stewart Hildebrand
2023-08-31 11:58 ` Jan Beulich
2023-08-28 17:56 ` [PATCH v4 6/6] xen/vpci: header: filter PCI capabilities Stewart Hildebrand
2023-08-29 2:07 ` Stewart Hildebrand
2023-08-31 12:11 ` Jan Beulich
2023-09-01 4:14 ` Stewart Hildebrand [this message]
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=b76fbdab-9e72-996a-2ae3-afd13b086bad@amd.com \
--to=stewart.hildebrand@amd.com \
--cc=andrew.cooper3@citrix.com \
--cc=george.dunlap@citrix.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.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.