* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
[not found] ` <1492426712-12230-8-git-send-email-peterx@redhat.com>
@ 2017-04-18 3:23 ` Jason Wang
2017-04-18 3:50 ` Peter Xu
0 siblings, 1 reply; 7+ messages in thread
From: Jason Wang @ 2017-04-18 3:23 UTC (permalink / raw)
To: Peter Xu, qemu-devel
Cc: David Gibson, Lan Tianyu, Marcel Apfelbaum, Michael S.Tsirkin,
" peterx"
On 2017年04月17日 18:58, Peter Xu wrote:
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> hw/i386/intel_iommu.c | 109 +++++++++++++++++++++++++++++++++--------
> hw/i386/intel_iommu_internal.h | 1 +
> hw/i386/trace-events | 1 +
> hw/i386/x86-iommu.c | 1 +
> include/hw/i386/x86-iommu.h | 1 +
> 5 files changed, 93 insertions(+), 20 deletions(-)
>
> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> index 05ae631..deb2007 100644
> --- a/hw/i386/intel_iommu.c
> +++ b/hw/i386/intel_iommu.c
> @@ -872,7 +872,7 @@ static int vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
> } else {
> switch (vtd_ce_get_type(ce)) {
> case VTD_CONTEXT_TT_MULTI_LEVEL:
> - /* fall through */
> + case VTD_CONTEXT_TT_PASS_THROUGH:
> case VTD_CONTEXT_TT_DEV_IOTLB:
> break;
> default:
> @@ -883,6 +883,73 @@ static int vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
> return 0;
> }
>
> +/* Fetch translation type for specific device. Returns <0 if error
> + * happens, otherwise return the shifted type to check against
> + * VTD_CONTEXT_TT_*. */
> +static int vtd_dev_get_trans_type(VTDAddressSpace *as)
> +{
> + IntelIOMMUState *s;
> + VTDContextEntry ce;
> + int ret;
> +
> + s = as->iommu_state;
> +
> + ret = vtd_dev_to_context_entry(s, pci_bus_num(as->bus),
> + as->devfn, &ce);
> + if (ret) {
> + return ret;
> + }
> +
> + return vtd_ce_get_type(&ce);
> +}
> +
> +static bool vtd_dev_pt_enabled(VTDAddressSpace *as)
> +{
> + int ret;
> +
> + assert(as);
> +
> + ret = vtd_dev_get_trans_type(as);
> + if (ret < 0) {
> + /*
> + * Possibly failed to parse the context entry for some reason
> + * (e.g., during init, or any guest configuration errors on
> + * context entries). We should assume PT not enabled for
> + * safety.
> + */
> + return false;
> + }
> +
> + return ret == VTD_CONTEXT_TT_PASS_THROUGH;
> +}
> +
> +static void vtd_switch_address_space(VTDAddressSpace *as)
> +{
> + bool use_iommu;
> +
> + assert(as);
> +
> + use_iommu = as->iommu_state->dmar_enabled;
> + if (use_iommu) {
> + /* Further checks per-device configuration */
> + use_iommu &= !vtd_dev_pt_enabled(as);
> + }
Looks like you can use as->iommu_state->dmar_enabled &&
!vtd_dev_pt_enabled(as)
> +
> + trace_vtd_switch_address_space(pci_bus_num(as->bus),
> + VTD_PCI_SLOT(as->devfn),
> + VTD_PCI_FUNC(as->devfn),
> + use_iommu);
> +
> + /* Turn off first then on the other */
> + if (use_iommu) {
> + memory_region_set_enabled(&as->sys_alias, false);
> + memory_region_set_enabled(&as->iommu, true);
> + } else {
> + memory_region_set_enabled(&as->iommu, false);
> + memory_region_set_enabled(&as->sys_alias, true);
> + }
> +}
> +
> static inline uint16_t vtd_make_source_id(uint8_t bus_num, uint8_t devfn)
> {
> return ((bus_num & 0xffUL) << 8) | (devfn & 0xffUL);
> @@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
> cc_entry->context_cache_gen = s->context_cache_gen;
> }
>
> + /*
> + * We don't need to translate for pass-through context entries.
> + * Also, let's ignore IOTLB caching as well for PT devices.
> + */
> + if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
> + entry->translated_addr = entry->iova;
> + entry->addr_mask = VTD_PAGE_SIZE - 1;
> + entry->perm = IOMMU_RW;
> + trace_vtd_translate_pt(source_id, entry->iova);
> + return;
> + }
Several questions here:
1) Is this just for vhost?
2) Since this is done after IOTLB querying, do we need flush IOTLB
during address switching?
> +
> ret_fr = vtd_iova_to_slpte(&ce, addr, is_write, &slpte, &level,
> &reads, &writes);
> if (ret_fr) {
> @@ -1135,6 +1214,11 @@ static void vtd_context_device_invalidate(IntelIOMMUState *s,
> VTD_PCI_FUNC(devfn_it));
> vtd_as->context_cache_entry.context_cache_gen = 0;
> /*
> + * Do switch address space when needed, in case if the
> + * device passthrough bit is switched.
> + */
> + vtd_switch_address_space(vtd_as);
> + /*
> * So a device is moving out of (or moving into) a
> * domain, a replay() suites here to notify all the
> * IOMMU_NOTIFIER_MAP registers about this change.
> @@ -1366,25 +1450,6 @@ static void vtd_handle_gcmd_sirtp(IntelIOMMUState *s)
> vtd_set_clear_mask_long(s, DMAR_GSTS_REG, 0, VTD_GSTS_IRTPS);
> }
>
> -static void vtd_switch_address_space(VTDAddressSpace *as)
> -{
> - assert(as);
> -
> - trace_vtd_switch_address_space(pci_bus_num(as->bus),
> - VTD_PCI_SLOT(as->devfn),
> - VTD_PCI_FUNC(as->devfn),
> - as->iommu_state->dmar_enabled);
> -
> - /* Turn off first then on the other */
> - if (as->iommu_state->dmar_enabled) {
> - memory_region_set_enabled(&as->sys_alias, false);
> - memory_region_set_enabled(&as->iommu, true);
> - } else {
> - memory_region_set_enabled(&as->iommu, false);
> - memory_region_set_enabled(&as->sys_alias, true);
> - }
> -}
> -
> static void vtd_switch_address_space_all(IntelIOMMUState *s)
> {
> GHashTableIter iter;
> @@ -2849,6 +2914,10 @@ static void vtd_init(IntelIOMMUState *s)
> s->ecap |= VTD_ECAP_DT;
> }
>
> + if (x86_iommu->pt_supported) {
> + s->ecap |= VTD_ECAP_PT;
> + }
Since we support migration now, need compat this for pre 2.10.
> +
> if (s->caching_mode) {
> s->cap |= VTD_CAP_CM;
> }
> diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> index 29d6707..0e73a65 100644
> --- a/hw/i386/intel_iommu_internal.h
> +++ b/hw/i386/intel_iommu_internal.h
> @@ -187,6 +187,7 @@
> /* Interrupt Remapping support */
> #define VTD_ECAP_IR (1ULL << 3)
> #define VTD_ECAP_EIM (1ULL << 4)
> +#define VTD_ECAP_PT (1ULL << 6)
> #define VTD_ECAP_MHMV (15ULL << 20)
>
> /* CAP_REG */
> diff --git a/hw/i386/trace-events b/hw/i386/trace-events
> index 04a6980..867ad0b 100644
> --- a/hw/i386/trace-events
> +++ b/hw/i386/trace-events
> @@ -38,6 +38,7 @@ vtd_page_walk_skip_perm(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"P
> vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
> vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
> vtd_as_unmap_whole(uint8_t bus, uint8_t slot, uint8_t fn, uint64_t iova, uint64_t size) "Device %02x:%02x.%x start 0x%"PRIx64" size 0x%"PRIx64
> +vtd_translate_pt(uint16_t sid, uint64_t addr) "source id 0x%"PRIu16", iova 0x%"PRIx64
>
> # hw/i386/amd_iommu.c
> amdvi_evntlog_fail(uint64_t addr, uint32_t head) "error: fail to write at addr 0x%"PRIx64" + offset 0x%"PRIx32
> diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c
> index 02b8825..293caf8 100644
> --- a/hw/i386/x86-iommu.c
> +++ b/hw/i386/x86-iommu.c
> @@ -91,6 +91,7 @@ static void x86_iommu_realize(DeviceState *dev, Error **errp)
> static Property x86_iommu_properties[] = {
> DEFINE_PROP_BOOL("intremap", X86IOMMUState, intr_supported, false),
> DEFINE_PROP_BOOL("device-iotlb", X86IOMMUState, dt_supported, false),
> + DEFINE_PROP_BOOL("pt", X86IOMMUState, pt_supported, true),
Do you know if AMD IOMMU support this?
Thanks
> DEFINE_PROP_END_OF_LIST(),
> };
>
> diff --git a/include/hw/i386/x86-iommu.h b/include/hw/i386/x86-iommu.h
> index 361c07c..ef89c0c 100644
> --- a/include/hw/i386/x86-iommu.h
> +++ b/include/hw/i386/x86-iommu.h
> @@ -74,6 +74,7 @@ struct X86IOMMUState {
> SysBusDevice busdev;
> bool intr_supported; /* Whether vIOMMU supports IR */
> bool dt_supported; /* Whether vIOMMU supports DT */
> + bool pt_supported; /* Whether vIOMMU supports pass-through */
> IommuType type; /* IOMMU type - AMD/Intel */
> QLIST_HEAD(, IEC_Notifier) iec_notifiers; /* IEC notify list */
> };
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
2017-04-18 3:23 ` [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT) Jason Wang
@ 2017-04-18 3:50 ` Peter Xu
2017-04-18 4:00 ` Jason Wang
0 siblings, 1 reply; 7+ messages in thread
From: Peter Xu @ 2017-04-18 3:50 UTC (permalink / raw)
To: Jason Wang
Cc: qemu-devel, David Gibson, Lan Tianyu, Marcel Apfelbaum,
Michael S.Tsirkin
On Tue, Apr 18, 2017 at 11:23:35AM +0800, Jason Wang wrote:
> On 2017年04月17日 18:58, Peter Xu wrote:
[...]
> >+static void vtd_switch_address_space(VTDAddressSpace *as)
> >+{
> >+ bool use_iommu;
> >+
> >+ assert(as);
> >+
> >+ use_iommu = as->iommu_state->dmar_enabled;
> >+ if (use_iommu) {
> >+ /* Further checks per-device configuration */
> >+ use_iommu &= !vtd_dev_pt_enabled(as);
> >+ }
>
> Looks like you can use as->iommu_state->dmar_enabled &&
> !vtd_dev_pt_enabled(as)
vtd_dev_pt_enalbed() needs to read the guest memory (starting from
reading root entry), which is slightly slow. I was trying to avoid
unecessary reads.
[...]
> >@@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
> > cc_entry->context_cache_gen = s->context_cache_gen;
> > }
> >+ /*
> >+ * We don't need to translate for pass-through context entries.
> >+ * Also, let's ignore IOTLB caching as well for PT devices.
> >+ */
> >+ if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
> >+ entry->translated_addr = entry->iova;
> >+ entry->addr_mask = VTD_PAGE_SIZE - 1;
> >+ entry->perm = IOMMU_RW;
> >+ trace_vtd_translate_pt(source_id, entry->iova);
> >+ return;
> >+ }
>
> Several questions here:
>
> 1) Is this just for vhost?
No. When caching mode is not enabled, all passthroughed devices should
be using this path.
> 2) Since this is done after IOTLB querying, do we need flush IOTLB during
> address switching?
IMHO if guest switches address space for a device, it is required to
send IOTLB flush as well for that device/domain.
[...]
> > static void vtd_switch_address_space_all(IntelIOMMUState *s)
> > {
> > GHashTableIter iter;
> >@@ -2849,6 +2914,10 @@ static void vtd_init(IntelIOMMUState *s)
> > s->ecap |= VTD_ECAP_DT;
> > }
> >+ if (x86_iommu->pt_supported) {
> >+ s->ecap |= VTD_ECAP_PT;
> >+ }
>
> Since we support migration now, need compat this for pre 2.10.
Oh yes. If I set pt=off by default, it should be okay then, right?
Then, at some point, we can switch to on by default, with a touch-up
in include/hw/compat.h I guess?
>
> >+
> > if (s->caching_mode) {
> > s->cap |= VTD_CAP_CM;
> > }
> >diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> >index 29d6707..0e73a65 100644
> >--- a/hw/i386/intel_iommu_internal.h
> >+++ b/hw/i386/intel_iommu_internal.h
> >@@ -187,6 +187,7 @@
> > /* Interrupt Remapping support */
> > #define VTD_ECAP_IR (1ULL << 3)
> > #define VTD_ECAP_EIM (1ULL << 4)
> >+#define VTD_ECAP_PT (1ULL << 6)
> > #define VTD_ECAP_MHMV (15ULL << 20)
> > /* CAP_REG */
> >diff --git a/hw/i386/trace-events b/hw/i386/trace-events
> >index 04a6980..867ad0b 100644
> >--- a/hw/i386/trace-events
> >+++ b/hw/i386/trace-events
> >@@ -38,6 +38,7 @@ vtd_page_walk_skip_perm(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"P
> > vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
> > vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
> > vtd_as_unmap_whole(uint8_t bus, uint8_t slot, uint8_t fn, uint64_t iova, uint64_t size) "Device %02x:%02x.%x start 0x%"PRIx64" size 0x%"PRIx64
> >+vtd_translate_pt(uint16_t sid, uint64_t addr) "source id 0x%"PRIu16", iova 0x%"PRIx64
> > # hw/i386/amd_iommu.c
> > amdvi_evntlog_fail(uint64_t addr, uint32_t head) "error: fail to write at addr 0x%"PRIx64" + offset 0x%"PRIx32
> >diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c
> >index 02b8825..293caf8 100644
> >--- a/hw/i386/x86-iommu.c
> >+++ b/hw/i386/x86-iommu.c
> >@@ -91,6 +91,7 @@ static void x86_iommu_realize(DeviceState *dev, Error **errp)
> > static Property x86_iommu_properties[] = {
> > DEFINE_PROP_BOOL("intremap", X86IOMMUState, intr_supported, false),
> > DEFINE_PROP_BOOL("device-iotlb", X86IOMMUState, dt_supported, false),
> >+ DEFINE_PROP_BOOL("pt", X86IOMMUState, pt_supported, true),
>
> Do you know if AMD IOMMU support this?
AMD IOMMU should support this. IIUC it's the first bit of Device Table Entry.
Thanks,
--
Peter Xu
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
2017-04-18 3:50 ` Peter Xu
@ 2017-04-18 4:00 ` Jason Wang
2017-04-18 4:21 ` Peter Xu
0 siblings, 1 reply; 7+ messages in thread
From: Jason Wang @ 2017-04-18 4:00 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, David Gibson, Lan Tianyu, Marcel Apfelbaum,
Michael S.Tsirkin
On 2017年04月18日 11:50, Peter Xu wrote:
> On Tue, Apr 18, 2017 at 11:23:35AM +0800, Jason Wang wrote:
>> On 2017年04月17日 18:58, Peter Xu wrote:
> [...]
>
>>> +static void vtd_switch_address_space(VTDAddressSpace *as)
>>> +{
>>> + bool use_iommu;
>>> +
>>> + assert(as);
>>> +
>>> + use_iommu = as->iommu_state->dmar_enabled;
>>> + if (use_iommu) {
>>> + /* Further checks per-device configuration */
>>> + use_iommu &= !vtd_dev_pt_enabled(as);
>>> + }
>> Looks like you can use as->iommu_state->dmar_enabled &&
>> !vtd_dev_pt_enabled(as)
> vtd_dev_pt_enalbed() needs to read the guest memory (starting from
> reading root entry), which is slightly slow. I was trying to avoid
> unecessary reads.
>
> [...]
I think compiler won't go to vtd_dev_pt_enabled() if dmar_enabled is false.
>
>>> @@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
>>> cc_entry->context_cache_gen = s->context_cache_gen;
>>> }
>>> + /*
>>> + * We don't need to translate for pass-through context entries.
>>> + * Also, let's ignore IOTLB caching as well for PT devices.
>>> + */
>>> + if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
>>> + entry->translated_addr = entry->iova;
>>> + entry->addr_mask = VTD_PAGE_SIZE - 1;
>>> + entry->perm = IOMMU_RW;
>>> + trace_vtd_translate_pt(source_id, entry->iova);
>>> + return;
>>> + }
>> Several questions here:
>>
>> 1) Is this just for vhost?
> No. When caching mode is not enabled, all passthroughed devices should
> be using this path.
Ok, then it looks better to switch the address space if we've found it
was PT?
>
>> 2) Since this is done after IOTLB querying, do we need flush IOTLB during
>> address switching?
> IMHO if guest switches address space for a device, it is required to
> send IOTLB flush as well for that device/domain.
>
> [...]
Ok.
>
>>> static void vtd_switch_address_space_all(IntelIOMMUState *s)
>>> {
>>> GHashTableIter iter;
>>> @@ -2849,6 +2914,10 @@ static void vtd_init(IntelIOMMUState *s)
>>> s->ecap |= VTD_ECAP_DT;
>>> }
>>> + if (x86_iommu->pt_supported) {
>>> + s->ecap |= VTD_ECAP_PT;
>>> + }
>> Since we support migration now, need compat this for pre 2.10.
> Oh yes. If I set pt=off by default, it should be okay then, right?
Right, but I think it's better to keep this on by default for
performance reason.
>
> Then, at some point, we can switch to on by default, with a touch-up
> in include/hw/compat.h I guess?
Yes.
Thanks
>
>>> +
>>> if (s->caching_mode) {
>>> s->cap |= VTD_CAP_CM;
>>> }
>>> diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
>>> index 29d6707..0e73a65 100644
>>> --- a/hw/i386/intel_iommu_internal.h
>>> +++ b/hw/i386/intel_iommu_internal.h
>>> @@ -187,6 +187,7 @@
>>> /* Interrupt Remapping support */
>>> #define VTD_ECAP_IR (1ULL << 3)
>>> #define VTD_ECAP_EIM (1ULL << 4)
>>> +#define VTD_ECAP_PT (1ULL << 6)
>>> #define VTD_ECAP_MHMV (15ULL << 20)
>>> /* CAP_REG */
>>> diff --git a/hw/i386/trace-events b/hw/i386/trace-events
>>> index 04a6980..867ad0b 100644
>>> --- a/hw/i386/trace-events
>>> +++ b/hw/i386/trace-events
>>> @@ -38,6 +38,7 @@ vtd_page_walk_skip_perm(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"P
>>> vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
>>> vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
>>> vtd_as_unmap_whole(uint8_t bus, uint8_t slot, uint8_t fn, uint64_t iova, uint64_t size) "Device %02x:%02x.%x start 0x%"PRIx64" size 0x%"PRIx64
>>> +vtd_translate_pt(uint16_t sid, uint64_t addr) "source id 0x%"PRIu16", iova 0x%"PRIx64
>>> # hw/i386/amd_iommu.c
>>> amdvi_evntlog_fail(uint64_t addr, uint32_t head) "error: fail to write at addr 0x%"PRIx64" + offset 0x%"PRIx32
>>> diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c
>>> index 02b8825..293caf8 100644
>>> --- a/hw/i386/x86-iommu.c
>>> +++ b/hw/i386/x86-iommu.c
>>> @@ -91,6 +91,7 @@ static void x86_iommu_realize(DeviceState *dev, Error **errp)
>>> static Property x86_iommu_properties[] = {
>>> DEFINE_PROP_BOOL("intremap", X86IOMMUState, intr_supported, false),
>>> DEFINE_PROP_BOOL("device-iotlb", X86IOMMUState, dt_supported, false),
>>> + DEFINE_PROP_BOOL("pt", X86IOMMUState, pt_supported, true),
>> Do you know if AMD IOMMU support this?
> AMD IOMMU should support this. IIUC it's the first bit of Device Table Entry.
>
> Thanks,
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
2017-04-18 4:00 ` Jason Wang
@ 2017-04-18 4:21 ` Peter Xu
2017-04-20 5:18 ` Jason Wang
0 siblings, 1 reply; 7+ messages in thread
From: Peter Xu @ 2017-04-18 4:21 UTC (permalink / raw)
To: Jason Wang
Cc: qemu-devel, David Gibson, Lan Tianyu, Marcel Apfelbaum,
Michael S.Tsirkin
On Tue, Apr 18, 2017 at 12:00:13PM +0800, Jason Wang wrote:
>
>
> On 2017年04月18日 11:50, Peter Xu wrote:
> >On Tue, Apr 18, 2017 at 11:23:35AM +0800, Jason Wang wrote:
> >>On 2017年04月17日 18:58, Peter Xu wrote:
> >[...]
> >
> >>>+static void vtd_switch_address_space(VTDAddressSpace *as)
> >>>+{
> >>>+ bool use_iommu;
> >>>+
> >>>+ assert(as);
> >>>+
> >>>+ use_iommu = as->iommu_state->dmar_enabled;
> >>>+ if (use_iommu) {
> >>>+ /* Further checks per-device configuration */
> >>>+ use_iommu &= !vtd_dev_pt_enabled(as);
> >>>+ }
> >>Looks like you can use as->iommu_state->dmar_enabled &&
> >>!vtd_dev_pt_enabled(as)
> >vtd_dev_pt_enalbed() needs to read the guest memory (starting from
> >reading root entry), which is slightly slow. I was trying to avoid
> >unecessary reads.
> >
> >[...]
>
> I think compiler won't go to vtd_dev_pt_enabled() if dmar_enabled is false.
You are right. I'll switch.
>
> >
> >>>@@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
> >>> cc_entry->context_cache_gen = s->context_cache_gen;
> >>> }
> >>>+ /*
> >>>+ * We don't need to translate for pass-through context entries.
> >>>+ * Also, let's ignore IOTLB caching as well for PT devices.
> >>>+ */
> >>>+ if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
> >>>+ entry->translated_addr = entry->iova;
> >>>+ entry->addr_mask = VTD_PAGE_SIZE - 1;
> >>>+ entry->perm = IOMMU_RW;
> >>>+ trace_vtd_translate_pt(source_id, entry->iova);
> >>>+ return;
> >>>+ }
> >>Several questions here:
> >>
> >>1) Is this just for vhost?
> >No. When caching mode is not enabled, all passthroughed devices should
> >be using this path.
>
> Ok, then it looks better to switch the address space if we've found it was
> PT?
Do you mean to switch in that if() above? Then when invalidate context
entry, we switch back if needed?
>
> >
> >>2) Since this is done after IOTLB querying, do we need flush IOTLB during
> >>address switching?
> >IMHO if guest switches address space for a device, it is required to
> >send IOTLB flush as well for that device/domain.
> >
> >[...]
>
> Ok.
>
> >
> >>> static void vtd_switch_address_space_all(IntelIOMMUState *s)
> >>> {
> >>> GHashTableIter iter;
> >>>@@ -2849,6 +2914,10 @@ static void vtd_init(IntelIOMMUState *s)
> >>> s->ecap |= VTD_ECAP_DT;
> >>> }
> >>>+ if (x86_iommu->pt_supported) {
> >>>+ s->ecap |= VTD_ECAP_PT;
> >>>+ }
> >>Since we support migration now, need compat this for pre 2.10.
> >Oh yes. If I set pt=off by default, it should be okay then, right?
>
> Right, but I think it's better to keep this on by default for performance
> reason.
Okay. Just to confirm, that'll need one entry for HW_COMPAT_2_9,
right? (though it is still not there)
--
Peter Xu
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
2017-04-18 4:21 ` Peter Xu
@ 2017-04-20 5:18 ` Jason Wang
2017-04-20 5:28 ` Peter Xu
0 siblings, 1 reply; 7+ messages in thread
From: Jason Wang @ 2017-04-20 5:18 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, David Gibson, Lan Tianyu, Marcel Apfelbaum,
Michael S.Tsirkin
On 2017年04月18日 12:21, Peter Xu wrote:
> On Tue, Apr 18, 2017 at 12:00:13PM +0800, Jason Wang wrote:
>>
>> On 2017年04月18日 11:50, Peter Xu wrote:
>>> On Tue, Apr 18, 2017 at 11:23:35AM +0800, Jason Wang wrote:
>>>> On 2017年04月17日 18:58, Peter Xu wrote:
>>> [...]
>>>
>>>>> +static void vtd_switch_address_space(VTDAddressSpace *as)
>>>>> +{
>>>>> + bool use_iommu;
>>>>> +
>>>>> + assert(as);
>>>>> +
>>>>> + use_iommu = as->iommu_state->dmar_enabled;
>>>>> + if (use_iommu) {
>>>>> + /* Further checks per-device configuration */
>>>>> + use_iommu &= !vtd_dev_pt_enabled(as);
>>>>> + }
>>>> Looks like you can use as->iommu_state->dmar_enabled &&
>>>> !vtd_dev_pt_enabled(as)
>>> vtd_dev_pt_enalbed() needs to read the guest memory (starting from
>>> reading root entry), which is slightly slow. I was trying to avoid
>>> unecessary reads.
>>>
>>> [...]
>> I think compiler won't go to vtd_dev_pt_enabled() if dmar_enabled is false.
> You are right. I'll switch.
>
>>>>> @@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
>>>>> cc_entry->context_cache_gen = s->context_cache_gen;
>>>>> }
>>>>> + /*
>>>>> + * We don't need to translate for pass-through context entries.
>>>>> + * Also, let's ignore IOTLB caching as well for PT devices.
>>>>> + */
>>>>> + if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
>>>>> + entry->translated_addr = entry->iova;
>>>>> + entry->addr_mask = VTD_PAGE_SIZE - 1;
>>>>> + entry->perm = IOMMU_RW;
>>>>> + trace_vtd_translate_pt(source_id, entry->iova);
>>>>> + return;
>>>>> + }
>>>> Several questions here:
>>>>
>>>> 1) Is this just for vhost?
>>> No. When caching mode is not enabled, all passthroughed devices should
>>> be using this path.
>> Ok, then it looks better to switch the address space if we've found it was
>> PT?
> Do you mean to switch in that if() above? Then when invalidate context
> entry, we switch back if needed?
Yes.
>
>>>> 2) Since this is done after IOTLB querying, do we need flush IOTLB during
>>>> address switching?
>>> IMHO if guest switches address space for a device, it is required to
>>> send IOTLB flush as well for that device/domain.
>>>
>>> [...]
>> Ok.
>>
>>>>> static void vtd_switch_address_space_all(IntelIOMMUState *s)
>>>>> {
>>>>> GHashTableIter iter;
>>>>> @@ -2849,6 +2914,10 @@ static void vtd_init(IntelIOMMUState *s)
>>>>> s->ecap |= VTD_ECAP_DT;
>>>>> }
>>>>> + if (x86_iommu->pt_supported) {
>>>>> + s->ecap |= VTD_ECAP_PT;
>>>>> + }
>>>> Since we support migration now, need compat this for pre 2.10.
>>> Oh yes. If I set pt=off by default, it should be okay then, right?
>> Right, but I think it's better to keep this on by default for performance
>> reason.
> Okay. Just to confirm, that'll need one entry for HW_COMPAT_2_9,
> right? (though it is still not there)
>
Right.
Thanks
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
2017-04-20 5:18 ` Jason Wang
@ 2017-04-20 5:28 ` Peter Xu
2017-04-20 6:05 ` Jason Wang
0 siblings, 1 reply; 7+ messages in thread
From: Peter Xu @ 2017-04-20 5:28 UTC (permalink / raw)
To: Jason Wang
Cc: qemu-devel, David Gibson, Lan Tianyu, Marcel Apfelbaum,
Michael S.Tsirkin
On Thu, Apr 20, 2017 at 01:18:28PM +0800, Jason Wang wrote:
>
>
> On 2017年04月18日 12:21, Peter Xu wrote:
> >On Tue, Apr 18, 2017 at 12:00:13PM +0800, Jason Wang wrote:
> >>
> >>On 2017年04月18日 11:50, Peter Xu wrote:
> >>>On Tue, Apr 18, 2017 at 11:23:35AM +0800, Jason Wang wrote:
> >>>>On 2017年04月17日 18:58, Peter Xu wrote:
> >>>[...]
> >>>
> >>>>>+static void vtd_switch_address_space(VTDAddressSpace *as)
> >>>>>+{
> >>>>>+ bool use_iommu;
> >>>>>+
> >>>>>+ assert(as);
> >>>>>+
> >>>>>+ use_iommu = as->iommu_state->dmar_enabled;
> >>>>>+ if (use_iommu) {
> >>>>>+ /* Further checks per-device configuration */
> >>>>>+ use_iommu &= !vtd_dev_pt_enabled(as);
> >>>>>+ }
> >>>>Looks like you can use as->iommu_state->dmar_enabled &&
> >>>>!vtd_dev_pt_enabled(as)
> >>>vtd_dev_pt_enalbed() needs to read the guest memory (starting from
> >>>reading root entry), which is slightly slow. I was trying to avoid
> >>>unecessary reads.
> >>>
> >>>[...]
> >>I think compiler won't go to vtd_dev_pt_enabled() if dmar_enabled is false.
> >You are right. I'll switch.
> >
> >>>>>@@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
> >>>>> cc_entry->context_cache_gen = s->context_cache_gen;
> >>>>> }
> >>>>>+ /*
> >>>>>+ * We don't need to translate for pass-through context entries.
> >>>>>+ * Also, let's ignore IOTLB caching as well for PT devices.
> >>>>>+ */
> >>>>>+ if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
> >>>>>+ entry->translated_addr = entry->iova;
> >>>>>+ entry->addr_mask = VTD_PAGE_SIZE - 1;
> >>>>>+ entry->perm = IOMMU_RW;
> >>>>>+ trace_vtd_translate_pt(source_id, entry->iova);
> >>>>>+ return;
> >>>>>+ }
> >>>>Several questions here:
> >>>>
> >>>>1) Is this just for vhost?
> >>>No. When caching mode is not enabled, all passthroughed devices should
> >>>be using this path.
> >>Ok, then it looks better to switch the address space if we've found it was
> >>PT?
> >Do you mean to switch in that if() above? Then when invalidate context
> >entry, we switch back if needed?
>
> Yes.
Sure. Do you mind if I put this into another standalone patch? I see
it an enhancement that can be separated from current one. Thanks,
--
Peter Xu
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT)
2017-04-20 5:28 ` Peter Xu
@ 2017-04-20 6:05 ` Jason Wang
0 siblings, 0 replies; 7+ messages in thread
From: Jason Wang @ 2017-04-20 6:05 UTC (permalink / raw)
To: Peter Xu
Cc: Lan Tianyu, Marcel Apfelbaum, Michael S.Tsirkin, qemu-devel,
David Gibson
On 2017年04月20日 13:28, Peter Xu wrote:
> On Thu, Apr 20, 2017 at 01:18:28PM +0800, Jason Wang wrote:
>>
>> On 2017年04月18日 12:21, Peter Xu wrote:
>>> On Tue, Apr 18, 2017 at 12:00:13PM +0800, Jason Wang wrote:
>>>> On 2017年04月18日 11:50, Peter Xu wrote:
>>>>> On Tue, Apr 18, 2017 at 11:23:35AM +0800, Jason Wang wrote:
>>>>>> On 2017年04月17日 18:58, Peter Xu wrote:
>>>>> [...]
>>>>>
>>>>>>> +static void vtd_switch_address_space(VTDAddressSpace *as)
>>>>>>> +{
>>>>>>> + bool use_iommu;
>>>>>>> +
>>>>>>> + assert(as);
>>>>>>> +
>>>>>>> + use_iommu = as->iommu_state->dmar_enabled;
>>>>>>> + if (use_iommu) {
>>>>>>> + /* Further checks per-device configuration */
>>>>>>> + use_iommu &= !vtd_dev_pt_enabled(as);
>>>>>>> + }
>>>>>> Looks like you can use as->iommu_state->dmar_enabled &&
>>>>>> !vtd_dev_pt_enabled(as)
>>>>> vtd_dev_pt_enalbed() needs to read the guest memory (starting from
>>>>> reading root entry), which is slightly slow. I was trying to avoid
>>>>> unecessary reads.
>>>>>
>>>>> [...]
>>>> I think compiler won't go to vtd_dev_pt_enabled() if dmar_enabled is false.
>>> You are right. I'll switch.
>>>
>>>>>>> @@ -991,6 +1058,18 @@ static void vtd_do_iommu_translate(VTDAddressSpace *vtd_as, PCIBus *bus,
>>>>>>> cc_entry->context_cache_gen = s->context_cache_gen;
>>>>>>> }
>>>>>>> + /*
>>>>>>> + * We don't need to translate for pass-through context entries.
>>>>>>> + * Also, let's ignore IOTLB caching as well for PT devices.
>>>>>>> + */
>>>>>>> + if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
>>>>>>> + entry->translated_addr = entry->iova;
>>>>>>> + entry->addr_mask = VTD_PAGE_SIZE - 1;
>>>>>>> + entry->perm = IOMMU_RW;
>>>>>>> + trace_vtd_translate_pt(source_id, entry->iova);
>>>>>>> + return;
>>>>>>> + }
>>>>>> Several questions here:
>>>>>>
>>>>>> 1) Is this just for vhost?
>>>>> No. When caching mode is not enabled, all passthroughed devices should
>>>>> be using this path.
>>>> Ok, then it looks better to switch the address space if we've found it was
>>>> PT?
>>> Do you mean to switch in that if() above? Then when invalidate context
>>> entry, we switch back if needed?
>> Yes.
> Sure. Do you mind if I put this into another standalone patch? I see
> it an enhancement that can be separated from current one. Thanks,
>
I don't mind. It can be done on top.
Thanks
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-04-20 6:06 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1492426712-12230-1-git-send-email-peterx@redhat.com>
[not found] ` <1492426712-12230-8-git-send-email-peterx@redhat.com>
2017-04-18 3:23 ` [Qemu-devel] [PATCH 7/7] intel_iommu: support passthrough (PT) Jason Wang
2017-04-18 3:50 ` Peter Xu
2017-04-18 4:00 ` Jason Wang
2017-04-18 4:21 ` Peter Xu
2017-04-20 5:18 ` Jason Wang
2017-04-20 5:28 ` Peter Xu
2017-04-20 6:05 ` Jason Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).