From: Andrew Cooper <Andrew.Cooper3@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: Roger Pau Monne <roger.pau@citrix.com>, Wei Liu <wl@xen.org>,
Xen-devel <xen-devel@lists.xenproject.org>
Subject: Re: [PATCH v2.1 8/7] x86/IOMMU: Use altcall, and __initconst_cf_clobber
Date: Tue, 22 Feb 2022 10:54:22 +0000 [thread overview]
Message-ID: <9e442a8d-ef71-3776-e655-8c8a226af706@citrix.com> (raw)
In-Reply-To: <0c253fda-c5f6-b7ea-df6c-8b43b86c6a59@suse.com>
On 22/02/2022 09:29, Jan Beulich wrote:
> On 21.02.2022 19:03, Andrew Cooper wrote:
>> Most IOMMU hooks are already altcall for performance reasons. Convert the
>> rest of them so we can harden all the hooks in Control Flow Integrity
>> configurations. This necessitates the use of iommu_{v,}call() in debug builds
>> too.
>>
>> Move the root iommu_ops from __read_mostly to __ro_after_init now that the
>> latter exists. There is no need for a forward declaration of vtd_ops any
>> more, meaning that __initconst_cf_clobber can be used for VTD and AMD.
> The connection between the forward declaration and the annotation addition
> isn't really clear to me.
>
>> --- a/xen/arch/x86/include/asm/iommu.h
>> +++ b/xen/arch/x86/include/asm/iommu.h
>> @@ -72,7 +72,6 @@ struct arch_iommu
>>
>> extern struct iommu_ops iommu_ops;
>>
>> -#ifdef NDEBUG
>> # include <asm/alternative.h>
>> # define iommu_call(ops, fn, args...) ({ \
>> (void)(ops); \
>> @@ -83,7 +82,6 @@ extern struct iommu_ops iommu_ops;
>> (void)(ops); \
>> alternative_vcall(iommu_ops.fn, ## args); \
>> })
>> -#endif
>>
>> static inline const struct iommu_ops *iommu_get_ops(void)
>> {
>> @@ -106,7 +104,7 @@ int iommu_setup_hpet_msi(struct msi_desc *);
>> static inline int iommu_adjust_irq_affinities(void)
>> {
>> return iommu_ops.adjust_irq_affinities
>> - ? iommu_ops.adjust_irq_affinities()
>> + ? iommu_call(iommu_ops, adjust_irq_affinities)
> While this (and other instances below) is x86-only code, where - with
> the removal of the #ifdef above - we now know the first argument is
> always ignored, I think it would still better be of the correct type
> (&iommu_ops). Perhaps the "(void)(ops)" in the macro definitions would
> better become "ASSERT((ops) == &iommu_ops)", which would check both
> type (compile time) and value (runtime).
I'm happy to fold that change if you want. It ought to optimise out
completely for being
>
>> --- a/xen/drivers/passthrough/iommu.c
>> +++ b/xen/drivers/passthrough/iommu.c
>> @@ -540,7 +540,7 @@ int __init iommu_setup(void)
>> int iommu_suspend()
>> {
>> if ( iommu_enabled )
>> - return iommu_get_ops()->suspend();
>> + return iommu_call(iommu_get_ops(), suspend);
> This use of iommu_get_ops() in such constructs is a pattern we didn't
> have so far. Perhaps it just looks bogus, and all is fine in reality
> (apart from the whole idea being wrong for Arm, or really any
> environment where multiple dissimilar IOMMUs may be in use). Or wait,
> there are pre-existing cases (just not immediately visible when
> grep-ing for "iommu_v?call") in iommu_get_reserved_device_memory() and
> iommu_setup_hpet_msi().
I think this means your happy(ish) with the change?
I agree that this is nonsense on ARM, but the codepath isn't used yet
and someone's going to have to reconcile the conflicting views.
>> --- a/xen/drivers/passthrough/vtd/iommu.c
>> +++ b/xen/drivers/passthrough/vtd/iommu.c
>> @@ -56,7 +56,6 @@ bool __read_mostly iommu_snoop = true;
>>
>> static unsigned int __read_mostly nr_iommus;
>>
>> -static struct iommu_ops vtd_ops;
>> static struct tasklet vtd_fault_tasklet;
>>
>> static int cf_check setup_hwdom_device(u8 devfn, struct pci_dev *);
>> @@ -2794,7 +2793,7 @@ static int __init cf_check intel_iommu_quarantine_init(struct domain *d)
>> return rc;
>> }
>>
>> -static struct iommu_ops __initdata vtd_ops = {
>> +static const struct iommu_ops __initconst_cf_clobber vtd_ops = {
> Ah yes, the conversion to const (and the dropping of the forward decl)
> could have been part of "VT-d / x86: re-arrange cache syncing".
>
> With the missing &-s added and preferably with the description adjusted
> a little
> Reviewed-by: Jan Beulich <jbeulich@suse.com>
Thanks.
~Andrew
next prev parent reply other threads:[~2022-02-22 10:54 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-14 12:56 [PATCH v2 0/7] x86: Further harden function pointers Andrew Cooper
2022-02-14 12:56 ` [PATCH v2 1/7] xen/altcall: Use __ro_after_init now that it exists Andrew Cooper
2022-02-14 12:59 ` Jan Beulich
2022-02-14 12:56 ` [PATCH v2 2/7] x86/altcall: Check and optimise altcall targets Andrew Cooper
2022-02-14 12:56 ` [PATCH v2 3/7] x86/altcall: Optimise away endbr64 instruction where possible Andrew Cooper
2022-02-14 13:06 ` Jan Beulich
2022-02-14 13:31 ` Andrew Cooper
2022-02-14 13:51 ` Jan Beulich
2022-02-14 16:03 ` Andrew Cooper
2022-02-14 16:16 ` Jan Beulich
2022-03-01 11:59 ` Jan Beulich
2022-03-01 14:51 ` Andrew Cooper
2022-03-01 14:58 ` Jan Beulich
2022-02-14 12:56 ` [PATCH v2 4/7] xsm: Use __initconst_cf_clobber for xsm_ops Andrew Cooper
2022-02-14 12:56 ` [PATCH v2 5/7] x86/hvm: Use __initdata_cf_clobber for hvm_funcs Andrew Cooper
2022-02-14 13:10 ` Jan Beulich
2022-02-14 13:35 ` Andrew Cooper
2022-02-14 16:39 ` Andrew Cooper
2022-02-14 16:45 ` Jan Beulich
2022-02-14 12:56 ` [PATCH v2 6/7] x86/ucode: Use altcall, and __initconst_cf_clobber Andrew Cooper
2022-02-14 13:13 ` Jan Beulich
2022-02-14 12:56 ` [PATCH v2 7/7] x86/vpmu: Harden indirect branches Andrew Cooper
2022-02-14 13:14 ` Jan Beulich
2022-02-21 18:03 ` [PATCH v2.1 8/7] x86/IOMMU: Use altcall, and __initconst_cf_clobber Andrew Cooper
2022-02-22 9:29 ` Jan Beulich
2022-02-22 10:54 ` Andrew Cooper [this message]
2022-02-22 11:02 ` Andrew Cooper
2022-02-22 11:06 ` Jan Beulich
2022-02-22 11:34 ` Andrew Cooper
2022-02-22 11:04 ` Jan Beulich
2022-02-22 11:47 ` [PATCH v2.2 " Andrew Cooper
2022-02-22 12:10 ` Jan Beulich
2022-02-25 8:24 ` Jan Beulich
2022-03-01 14:58 ` Andrew Cooper
2022-03-02 8:10 ` Jan Beulich
2022-03-02 10:12 ` Andrew Cooper
2022-03-02 10:34 ` Jan Beulich
2022-03-02 13:39 ` Andrew Cooper
2022-03-02 19:57 ` Andrew Cooper
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=9e442a8d-ef71-3776-e655-8c8a226af706@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=roger.pau@citrix.com \
--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.