From: Christian Borntraeger <borntraeger@de.ibm.com>
To: David Hildenbrand <david@redhat.com>, Cornelia Huck <cohuck@redhat.com>
Cc: KVM <kvm@vger.kernel.org>,
linux-s390 <linux-s390@vger.kernel.org>,
Janosch Frank <frankja@linux.vnet.ibm.com>,
Martin Schwidefsky <schwidefsky@de.ibm.com>,
Heiko Carstens <heiko.carstens@de.ibm.com>,
Michael Mueller <mimu@linux.vnet.ibm.com>
Subject: Re: [PATCH v2 06/12] KVM: s390: exploit GISA and AIV for emulated interrupts
Date: Thu, 25 Jan 2018 17:32:29 +0100 [thread overview]
Message-ID: <b7fb3580-0eae-ee29-cae6-d58bc8a4e350@de.ibm.com> (raw)
In-Reply-To: <040c7c5d-bbbd-89d4-ebcd-5d04ed80a40d@redhat.com>
On 01/25/2018 03:20 PM, David Hildenbrand wrote:
[...]
>> @@ -918,18 +919,38 @@ static int __must_check __deliver_virtio(struct kvm_vcpu *vcpu)
>> return rc ? -EFAULT : 0;
>> }
>>
>> +static int __do_deliver_io(struct kvm_vcpu *vcpu, struct kvm_s390_io_info *io)
>> +{
>> + int rc;
>> +
>> + rc = put_guest_lc(vcpu, io->subchannel_id, (u16 *)__LC_SUBCHANNEL_ID);
>> + rc |= put_guest_lc(vcpu, io->subchannel_nr, (u16 *)__LC_SUBCHANNEL_NR);
>> + rc |= put_guest_lc(vcpu, io->io_int_parm, (u32 *)__LC_IO_INT_PARM);
>> + rc |= put_guest_lc(vcpu, io->io_int_word, (u32 *)__LC_IO_INT_WORD);
>> + rc |= write_guest_lc(vcpu, __LC_IO_OLD_PSW,
>> + &vcpu->arch.sie_block->gpsw,
>> + sizeof(psw_t));
>> + rc |= read_guest_lc(vcpu, __LC_IO_NEW_PSW,
>> + &vcpu->arch.sie_block->gpsw,
>> + sizeof(psw_t));
>
> These should now it into less lines.
The last two lines are way beyond 80.
Can you factor that change out into
> a separate patch?
Unless Conny agrees that this is absolutely mandatory I would like to avoid that.
>
>> + return rc ? -EFAULT : 0;
>> +}
>> +
>> static int __must_check __deliver_io(struct kvm_vcpu *vcpu,
>> unsigned long irq_type)
>> {
>> struct list_head *isc_list;
>> struct kvm_s390_float_interrupt *fi;
>> struct kvm_s390_interrupt_info *inti = NULL;
>> + struct kvm_s390_io_info io;
>> + u32 isc;
>> int rc = 0;
>>
>> fi = &vcpu->kvm->arch.float_int;
>>
>> spin_lock(&fi->lock);
>> - isc_list = &fi->lists[irq_type_to_isc(irq_type)];
>> + isc = irq_type_to_isc(irq_type);
>> + isc_list = &fi->lists[isc];
>> inti = list_first_entry_or_null(isc_list,
>> struct kvm_s390_interrupt_info,
>> list);
>> @@ -957,24 +978,32 @@ static int __must_check __deliver_io(struct kvm_vcpu *vcpu,
>> spin_unlock(&fi->lock);
>>
>> if (inti) {
>> - rc = put_guest_lc(vcpu, inti->io.subchannel_id,
>> - (u16 *)__LC_SUBCHANNEL_ID);
>> - rc |= put_guest_lc(vcpu, inti->io.subchannel_nr,
>> - (u16 *)__LC_SUBCHANNEL_NR);
>> - rc |= put_guest_lc(vcpu, inti->io.io_int_parm,
>> - (u32 *)__LC_IO_INT_PARM);
>> - rc |= put_guest_lc(vcpu, inti->io.io_int_word,
>> - (u32 *)__LC_IO_INT_WORD);
>> - rc |= write_guest_lc(vcpu, __LC_IO_OLD_PSW,
>> - &vcpu->arch.sie_block->gpsw,
>> - sizeof(psw_t));
>> - rc |= read_guest_lc(vcpu, __LC_IO_NEW_PSW,
>> - &vcpu->arch.sie_block->gpsw,
>> - sizeof(psw_t));
>> + rc = __do_deliver_io(vcpu, &(inti->io));
>> kfree(inti);
>> + goto out;
>> }
>>
>> - return rc ? -EFAULT : 0;
>> + if (vcpu->kvm->arch.gisa) {
>> + if (kvm_s390_gisa_tac_ipm_gisc(vcpu->kvm->arch.gisa, isc)) {
>
>
> if (vcpu->kvm->arch.gisa &&
> kvm_s390_gisa_tac_ipm_gisc(vcpu->kvm->arch.gisa, isc) {
>
> avoids one nesting level
agreed.
>
>> + /*
>> + * in case an adapter interrupt was not delivered
>> + * in SIE context KVM will handle the delivery
>> + */
>> + VCPU_EVENT(vcpu, 4, "%s isc %u", "deliver: I/O (AI/gisa)", isc);
>> + memset(&io, 0, sizeof(io));
>> + io.io_int_word = (isc << 27) | 0x80000000;
>> + vcpu->stat.deliver_io_int++;
>> + trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id,
>> + KVM_S390_INT_IO(1, 0, 0, 0),
>> + ((__u32)io.subchannel_id << 16) |
>> + io.subchannel_nr,
>> + ((__u64)io.io_int_parm << 32) |
>> + io.io_int_word);
>> + rc = __do_deliver_io(vcpu, &io);
>> + }
>> + }
>> +out:
>> + return rc;
>> }
>>
>> typedef int (*deliver_irq_t)(struct kvm_vcpu *vcpu);
>> @@ -1537,12 +1566,23 @@ static int __inject_io(struct kvm *kvm, struct kvm_s390_interrupt_info *inti)
>> struct kvm_s390_float_interrupt *fi;
>> struct list_head *list;
>> int isc;
>> + int rc = 0;
>> +
>> + isc = int_word_to_isc(inti->io.io_int_word);
>> +
>> + if (kvm->arch.gisa && inti->type & KVM_S390_INT_IO_AI_MASK) {
>
> && (inti->type & KVM_S390_INT_IO_AI_MASK)) {
not necessary, & binds stronger than &&. So why?
>
>> + VM_EVENT(kvm, 4, "%s isc %1u", "inject: I/O (AI/gisa)", isc);
>> + kvm_s390_gisa_set_ipm_gisc(kvm->arch.gisa, isc);
>
> Can there only be one pending at a time? (e.g. what happens if the bit
> is already set?)
Yes there can be only one per ISC and the multiplexing is done on device
specific summary and queue indicator bits. (e.g. look at the virtio-ccw
stuff)
>
>> + kfree(inti);
>> + goto out;
>
> Why not simply return 0? ...
>
>> + }
>>
>> fi = &kvm->arch.float_int;
>> spin_lock(&fi->lock);
>> if (fi->counters[FIRQ_CNTR_IO] >= KVM_S390_MAX_FLOAT_IRQS) {
>> spin_unlock(&fi->lock);
>> - return -EBUSY;
>> + rc = -EBUSY;
>> + goto out;
>
> ... avoids this change ...
>
>> }
>> fi->counters[FIRQ_CNTR_IO] += 1;
>>
>> @@ -1553,12 +1593,12 @@ static int __inject_io(struct kvm *kvm, struct kvm_s390_interrupt_info *inti)
>> inti->io.subchannel_id >> 8,
>> inti->io.subchannel_id >> 1 & 0x3,
>> inti->io.subchannel_nr);
>> - isc = int_word_to_isc(inti->io.io_int_word);
>> list = &fi->lists[FIRQ_LIST_IO_ISC_0 + isc];
>> list_add_tail(&inti->list, list);
>> set_bit(isc_to_irq_type(isc), &fi->pending_irqs);
>> spin_unlock(&fi->lock);
>> - return 0;
>> +out:
>> + return rc;
>
> ... and this.
>
>> }
Will double check but at the moment I agree to 3 comments.
>>
>> /*
>> @@ -2705,3 +2745,29 @@ int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len)
>> return n;
>> }
>>
>> +void kvm_s390_gisa_clear(struct kvm *kvm)
>
> can we instead call this "gisa_setup" or move all that directly into the
> init function? (because it essentially inits the gisa)
It is also called in other places (kvm_s390_clear_float_irqs)
>
>> +{
>> + if (kvm->arch.gisa) {
>
> This check is not needed: guaranteed to be set by the caller.
Huh? kvm->arch.gisa can be NULL, also called by kvm_s390_clear_float_irqs
>
>> + memset(kvm->arch.gisa, 0, sizeof(struct kvm_s390_gisa));
>> +
>> +void kvm_s390_gisa_destroy(struct kvm *kvm)
>> +{
>> + if (!kvm->arch.gisa)
>> + return;
>> + kvm->arch.gisa = NULL;
>
> You can do this unconditionally. Nevertheless, this function is not
> really useful: only called when we destroy the VM.
It can be useful for later support of passthrough, so I would like to
keep it as counter part of gisa_init
next prev parent reply other threads:[~2018-01-25 16:32 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-25 13:28 [PATCH v2 00/12] KVM: s390: exitless interrupt support for KVM Christian Borntraeger
2018-01-25 13:28 ` [PATCH v2 01/12] KVM: s390: reverse bit ordering of irqs in pending mask Christian Borntraeger
2018-01-25 13:59 ` David Hildenbrand
2018-01-25 13:28 ` [PATCH v2 02/12] KVM: s390: define GISA format-0 data structure Christian Borntraeger
2018-01-25 14:00 ` David Hildenbrand
2018-01-26 9:03 ` Cornelia Huck
2018-01-25 13:28 ` [PATCH v2 03/12] s390/bitops: add test_and_clear_bit_inv() Christian Borntraeger
2018-01-25 13:53 ` Martin Schwidefsky
2018-01-25 13:28 ` [PATCH v2 04/12] KVM: s390: implement GISA IPM related primitives Christian Borntraeger
2018-01-25 14:06 ` David Hildenbrand
2018-01-25 14:21 ` Christian Borntraeger
2018-01-25 13:28 ` [PATCH v2 05/12] s390/css: indicate the availability of the AIV facility Christian Borntraeger
2018-01-25 13:54 ` Martin Schwidefsky
2018-01-25 13:59 ` David Hildenbrand
2018-01-25 13:28 ` [PATCH v2 06/12] KVM: s390: exploit GISA and AIV for emulated interrupts Christian Borntraeger
2018-01-25 14:20 ` David Hildenbrand
2018-01-25 14:32 ` Christian Borntraeger
2018-01-25 14:42 ` David Hildenbrand
2018-01-25 14:45 ` Christian Borntraeger
2018-01-25 15:05 ` Cornelia Huck
2018-01-25 15:27 ` David Hildenbrand
2018-01-25 15:31 ` Christian Borntraeger
2018-01-25 16:32 ` Christian Borntraeger [this message]
2018-01-25 16:39 ` Cornelia Huck
2018-01-25 16:47 ` David Hildenbrand
2018-01-25 16:50 ` Christian Borntraeger
2018-01-25 13:28 ` [PATCH v2 07/12] KVM: s390: abstract adapter interruption word generation from ISC Christian Borntraeger
2018-01-25 13:28 ` [PATCH v2 08/12] KVM: s390: add GISA interrupts to FLIC ioctl interface Christian Borntraeger
2018-01-26 9:18 ` Cornelia Huck
2018-01-25 13:28 ` [PATCH v2 09/12] KVM: s390: make kvm_s390_get_io_int() aware of GISA Christian Borntraeger
2018-01-26 9:41 ` Cornelia Huck
2018-01-26 9:57 ` Christian Borntraeger
2018-01-26 11:21 ` Cornelia Huck
2018-01-26 11:25 ` Christian Borntraeger
2018-01-26 11:40 ` Cornelia Huck
2018-01-26 13:13 ` Christian Borntraeger
2018-01-25 13:28 ` [PATCH v2 10/12] KVM: s390: activate GISA for emulated interrupts Christian Borntraeger
2018-01-25 13:28 ` [PATCH v2 11/12] s390/sclp: expose the GISA format facility Christian Borntraeger
2018-01-25 13:54 ` Martin Schwidefsky
2018-01-26 9:44 ` Cornelia Huck
2018-01-25 13:28 ` [PATCH v2 12/12] KVM: s390: introduce the format-1 GISA Christian Borntraeger
2018-01-25 15:31 ` David Hildenbrand
2018-01-25 15:43 ` Christian Borntraeger
2018-01-25 15:47 ` Cornelia Huck
2018-01-25 16:12 ` Christian Borntraeger
2018-01-25 16:17 ` Cornelia Huck
2018-01-25 16:51 ` Christian Borntraeger
2018-01-25 16:53 ` Cornelia Huck
2018-01-25 16:16 ` David Hildenbrand
2018-01-25 16:46 ` Christian Borntraeger
2018-01-26 9:46 ` Cornelia Huck
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=b7fb3580-0eae-ee29-cae6-d58bc8a4e350@de.ibm.com \
--to=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=frankja@linux.vnet.ibm.com \
--cc=heiko.carstens@de.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mimu@linux.vnet.ibm.com \
--cc=schwidefsky@de.ibm.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