From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: <joro@8bytes.org>, <pbonzini@redhat.com>,
<alex.williamson@redhat.com>, <kvm@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <sherry.hurwitz@amd.com>
Subject: Re: [PART2 PATCH v3 07/11] iommu/amd: Introduce amd_iommu_update_ga()
Date: Wed, 13 Jul 2016 15:49:05 +0700 [thread overview]
Message-ID: <57860081.8000206@amd.com> (raw)
In-Reply-To: <20160711185943.GA1375@potion>
Hi Radim,
I have a feeling that there might be some confusion in the use of
parameter ga_tag here in various places. My apology. I am in the process
of cleaning up this, and will send out the V4.
In the meantime, let me try to clarify a couple design detail that might
be missed here.
On 07/12/2016 01:59 AM, Radim Krčmář wrote:
> 2016-07-11 05:11-0500, Suravee Suthikulpanit:
>> From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>>
>> Introduces a new IOMMU API, amd_iommu_update_ga(), which allows
>> KVM (SVM) to update existing posted interrupt IOMMU IRTE when
>> load/unload vcpu.
>>
>> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
>> ---
>> diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
>> @@ -4481,4 +4481,67 @@ int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
>> +int amd_iommu_update_ga(u32 vcpu_id, u32 cpu, u32 ga_tag,
>> + u64 base, bool is_run)
>
> Not just in this function does the interface between svm and iommu split
> ga_tag into its two components (vcpu_id and ga_tag), but it seems that
> the combined value could always be used instead ...
> Is there an advantage to passing two values?
Basically, the amd_iommu_update_ga() function is designed to achieve two
things:
1. Communicate from SVM to AMD IOMMU driver the interrupt routing
information (e.g. the physical CPU to route the guest interrupt to) in
case the vcpu is running.
2. In case of vcpu is not running, the IOMMU driver should decode the
GATAG field of the GA log entry to find out which VCPU of which VM need
to be scheduled in, and notify KVM/SVM. The GATAG is encode as ((VM_ID
<< 8) | VCPU_ID).
Here, the amd_iommu_update_ga() takes the two separate value for input
parameters. Mainly the ga_tag (which is really the vm_id) and vcpu_id.
This allow IOMMU driver to decide how to encode the GATAG to be
programmed into the IRTE. Currently, the actual GATAG is a 16-bit value,
<vm_id><vcpu_id>. This keeps the interface independent from how we
encode the GATAG.
>> +{
>> + unsigned long flags;
>> + struct amd_iommu *iommu;
>> +
>> + if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir))
>> + return 0;
>> +
>> + for_each_iommu(iommu) {
>> + struct amd_ir_data *ir_data;
>> +
>> + spin_lock_irqsave(&iommu->ga_hash_lock, flags);
>> +
>> + /* Note: Update all possible ir_data for a particular
>> + * vcpu in a particular vm.
>> + */
>> + hash_for_each_possible(iommu->ga_hash, ir_data, hnode,
>> + AMD_IOMMU_GATAG(ga_tag, vcpu_id)) {
>> + struct irte_ga *irte = (struct irte_ga *) ir_data->entry;
>
> (The ga_tag check is missing here too.)
Here, the intention is to update all interrupt remapping entries in the
bucket w/ the same GATAG (i.e. vm_id + vcpu_id), where GATAG =
AMD_IOMMU_GATAG(vm_id, vcpu_id).
>> + if (!irte->lo.fields_vapic.guest_mode)
>> + continue;
>> +
>> + update_irte_ga((struct irte_ga *)ir_data->ref,
>> + ir_data->irq_2_irte.devid,
>> + base, cpu, is_run);
>
> (The lookup leading up to here is avoidable -- svm, the caller, has the
> ability to map ga_tag into irte/ir_data directly with a pointer.
> I'm not sure if the lookup is slow enough to pardon optimization, but
> it might make the code simpler as well.)
I might have mislead you up to this point. Not sure if the assumption
here still hold with my explanation above. Sorry for confusion.
Thanks,
Suravee
next prev parent reply other threads:[~2016-07-13 8:49 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-11 10:11 [PART2 PATCH v3 00/11] iommu/AMD: Introduce IOMMU AVIC support Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 01/11] iommu/amd: Detect and enable guest vAPIC support Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 02/11] iommu/amd: Move and introduce new IRTE-related unions and structures Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 03/11] iommu/amd: Introduce interrupt remapping ops structure Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 04/11] iommu/amd: Add support for multiple IRTE formats Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 05/11] iommu/amd: Detect and initialize guest vAPIC log Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 06/11] iommu/amd: Adding GALOG interrupt handler Suravee Suthikulpanit
2016-07-11 18:47 ` Radim Krčmář
2016-07-13 12:49 ` Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 07/11] iommu/amd: Introduce amd_iommu_update_ga() Suravee Suthikulpanit
2016-07-11 18:59 ` Radim Krčmář
2016-07-13 8:49 ` Suravee Suthikulpanit [this message]
2016-07-11 10:11 ` [PART2 PATCH v3 08/11] iommu/amd: Implements irq_set_vcpu_affinity() hook to setup vapic mode for pass-through devices Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 09/11] iommu/amd: Enable vAPIC interrupt remapping mode by default Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 10/11] svm: Introduce AMD IOMMU avic_ga_log_notifier Suravee Suthikulpanit
2016-07-11 19:09 ` Radim Krčmář
2016-07-13 8:53 ` Suravee Suthikulpanit
2016-07-11 10:11 ` [PART2 PATCH v3 11/11] svm: Implements update_pi_irte hook to setup posted interrupt Suravee Suthikulpanit
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=57860081.8000206@amd.com \
--to=suravee.suthikulpanit@amd.com \
--cc=alex.williamson@redhat.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=sherry.hurwitz@amd.com \
/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 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).