From: Scott Wood <scottwood@freescale.com>
To: Alexander Graf <agraf@suse.de>
Cc: <kvm-ppc@vger.kernel.org>, <kvm@vger.kernel.org>, <paulus@samba.org>
Subject: Re: [RFC PATCH v3 5/6] kvm/ppc/mpic: in-kernel MPIC emulation
Date: Wed, 3 Apr 2013 16:38:30 -0500 [thread overview]
Message-ID: <1365025110.25627.15@snotra> (raw)
In-Reply-To: <A6072B5C-C638-4DDB-8269-5BDF211C5701@suse.de> (from agraf@suse.de on Wed Apr 3 11:19:42 2013)
On 04/03/2013 11:19:42 AM, Alexander Graf wrote:
>
> On 03.04.2013, at 03:57, Scott Wood wrote:
>
> > Hook the MPIC code up to the KVM interfaces, add locking, etc.
> >
> > TODO: irqfd support, split up into multiple patches, KVM_IRQ_LINE
> > support
> >
> > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > ---
> > v3: mpic_put -> kvmppc_mpic_put
> >
> >
>
> [...]
>
> > +void kvmppc_mpic_set_epr(struct kvm_vcpu *vcpu);
> > +
> > int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
> > struct kvm_config_tlb *cfg);
> > int kvm_vcpu_ioctl_dirty_tlb(struct kvm_vcpu *vcpu,
> > diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig
> > index 63c67ec..a87139b 100644
> > --- a/arch/powerpc/kvm/Kconfig
> > +++ b/arch/powerpc/kvm/Kconfig
> > @@ -151,6 +151,11 @@ config KVM_E500MC
> >
> > If unsure, say N.
> >
> > +config KVM_MPIC
> > + bool "KVM in-kernel MPIC emulation"
> > + depends on KVM
>
> This should probably depend on FSL KVM for now, until someone adds
> support for other MPIC revisions.
I don't see a symbol specifically for "FSL KVM". What part of the MPIC
code depends on booke or any FSL-specific code?
> > struct irq_dest {
> > + struct kvm_vcpu *vcpu;
> > +
> > int32_t ctpr; /* CPU current task priority */
> > struct irq_queue raised;
> > struct irq_queue servicing;
> > - qemu_irq *irqs;
> >
> > /* Count of IRQ sources asserting on non-INT outputs */
> > - uint32_t outputs_active[OPENPIC_OUTPUT_NB];
> > + uint32_t outputs_active[NUM_OUTPUTS];
> > };
> >
> > +struct openpic;
>
> Isn't this superfluous?
Yes, will remove. Probably a leftover from when there was other stuff
in between that referenced it.
> > @@ -731,8 +771,8 @@ static uint64_t openpic_gbl_read(void *opaque,
> gpa_t addr, unsigned len)
> > case 0x90:
> > case 0xA0:
> > case 0xB0:
> > - retval =
> > - openpic_cpu_read_internal(opp, addr,
> get_current_cpu());
> > + retval = openpic_cpu_read_internal(opp, addr,
> > + &retval, get_current_cpu());
>
> This looks bogus. You're passing &retval and overwrite it with the
> return value right after the function returns?
Yeah, will fix. Thanks for spotting it.
> > +static int kvm_mpic_read(struct kvm_io_device *this, gpa_t addr,
> > + int len, void *ptr)
> > +{
> > + struct openpic *opp = container_of(this, struct openpic, mmio);
> > + int ret;
> > +
> > + /*
> > + * Technically only 32-bit accesses are allowed, but be nice to
> > + * people dumping registers a byte at a time -- it works in real
> > + * hardware (reads only, not writes).
>
> Do 16-bit accesses work in real hardware?
Probably, though according to the documentation only 32-bit accesses
should be used. As the comment says, I'm just being nice to hexdumps
and such, which are unlikely to use 16-bit accesses.
> > + */
> > + if (len == 4) {
> > + if (addr & 3) {
> > + pr_debug("%s: bad alignment %llx/%d\n",
> > + __func__, addr, len);
> > + return -EINVAL;
> > + }
>
> if (addr & (len - 1))
>
> Then the read_internal call can be shared between the different
> access sizes, no?
Not as is, because the read_internal call passes a different pointer in
the two different cases. I originally tried to write this with more in
common between the two cases, and it got a bit messy. I'll give it
another shot, though.
> > + spin_lock_irq(&opp->lock);
> > + ret = kvm_mpic_read_internal(opp, addr - opp->reg_base,
> ptr);
> > + spin_unlock_irq(&opp->lock);
> > +
> > + pr_debug("%s: addr %llx ret %d len 4 val %x\n",
> > + __func__, addr, ret, *(const u32 *)ptr);
> > + } else if (len == 1) {
> > + union {
> > + u32 val;
> > + u8 bytes[4];
> > + } u;
> > +
> > + spin_lock_irq(&opp->lock);
> > + ret = kvm_mpic_read_internal(opp, addr - opp->reg_base,
> &u.val);
> > + spin_unlock_irq(&opp->lock);
> > +
> > + *(u8 *)ptr = u.bytes[addr & 3];
> > +
> > + pr_debug("%s: addr %llx ret %d len 1 val %x\n",
> > + __func__, addr, ret, *(const u8 *)ptr);
> > + } else {
> > + pr_debug("%s: bad length %d\n", __func__, len);
> > + return -EINVAL;
> > + }
> > +
> > + return ret;
> > +}
> > +
>
> [...]
>
> >
> > +static int mpic_set_attr(struct openpic *opp, struct
> kvm_device_attr *attr)
> > +{
> > + u32 attr32;
> > +
> > + switch (attr->group) {
> > + case KVM_DEV_MPIC_GRP_MISC:
> > + switch (attr->attr) {
> > + case KVM_DEV_MPIC_BASE_ADDR:
> > + return set_base_addr(opp, attr);
> > + }
> > +
> > + break;
> > +
> > + case KVM_DEV_MPIC_GRP_REGISTER:
> > + if (copy_from_user(&attr32, (u32 __user
> *)(long)attr->addr,
> > + sizeof(u32)))
>
> get_user?
OK.
> > + switch (attr->group) {
> > + case KVM_DEV_MPIC_GRP_MISC:
> > + switch (attr->attr) {
> > + case KVM_DEV_MPIC_BASE_ADDR:
> > + mutex_lock(&opp->kvm->slots_lock);
> > + attr64 = opp->reg_base;
> > + mutex_unlock(&opp->kvm->slots_lock);
> > +
> > + if (copy_to_user((u64 __user *)(long)attr->addr,
> > + &attr64, sizeof(u64)))
>
> u64 is tricky with put_user on 32bit hosts, so here copy_to_user
> makes sense
What are the issues with put_user? It looks like it's supported with a
pair of "stw" instructions.
> > + case KVM_DEV_MPIC_GRP_IRQ_ACTIVE:
> > + if (attr->attr > MAX_SRC)
> > + return -EINVAL;
> > +
> > + attr32 = opp->src[attr->attr].pending;
>
> Isn't this missing a lock?
I don't see why it needs one. If the pending status changes during the
ioctl, it's undefined which state you'll read back, and a lock wouldn't
change that (you could end up taking the lock before or after the
change gets made).
reg_base above was a different situation -- it's 64-bit, so we can't
read it atomically on 32-bit.
-Scott
next prev parent reply other threads:[~2013-04-03 21:38 UTC|newest]
Thread overview: 130+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-14 5:49 [RFC PATCH 0/6] kvm/ppc/mpic: in-kernel irqchip Scott Wood
2013-02-14 5:49 ` [RFC PATCH 1/6] kvm: add device control API Scott Wood
2013-02-18 12:21 ` Gleb Natapov
2013-02-18 23:01 ` Scott Wood
2013-02-19 0:43 ` Christoffer Dall
2013-02-19 12:24 ` Gleb Natapov
2013-02-19 15:51 ` Christoffer Dall
2013-02-19 21:16 ` Scott Wood
2013-02-20 13:09 ` Gleb Natapov
2013-02-20 21:28 ` Marcelo Tosatti
2013-02-20 22:44 ` Marcelo Tosatti
2013-02-20 23:53 ` Scott Wood
2013-02-21 0:14 ` Marcelo Tosatti
2013-02-21 1:28 ` Scott Wood
2013-02-21 6:39 ` Gleb Natapov
2013-02-21 23:03 ` Marcelo Tosatti
2013-02-22 2:00 ` Scott Wood
2013-02-23 15:04 ` Marcelo Tosatti
2013-02-26 0:27 ` Scott Wood
2013-02-21 2:05 ` Scott Wood
2013-02-21 8:22 ` Gleb Natapov
2013-02-22 2:17 ` Scott Wood
2013-02-24 15:46 ` Gleb Natapov
2013-02-25 15:23 ` Alexander Graf
2013-02-26 2:38 ` Scott Wood
2013-02-20 21:17 ` Marcelo Tosatti
2013-02-20 23:20 ` Scott Wood
2013-02-21 0:01 ` Marcelo Tosatti
2013-02-21 0:33 ` Scott Wood
2013-02-25 1:11 ` Paul Mackerras
2013-02-25 13:09 ` Gleb Natapov
2013-02-25 15:29 ` Alexander Graf
2013-02-19 0:44 ` Christoffer Dall
2013-02-19 0:53 ` Scott Wood
2013-02-19 5:50 ` Christoffer Dall
2013-02-19 12:45 ` Gleb Natapov
2013-02-19 20:16 ` Scott Wood
2013-02-20 2:16 ` Christoffer Dall
2013-02-24 13:12 ` Marc Zyngier
2013-03-06 0:59 ` Paul Mackerras
2013-03-06 1:20 ` Scott Wood
2013-03-06 2:48 ` Benjamin Herrenschmidt
2013-03-06 3:36 ` Scott Wood
2013-03-06 4:28 ` Benjamin Herrenschmidt
2013-03-06 10:18 ` Gleb Natapov
2013-02-14 5:49 ` [RFC PATCH 2/6] kvm/ppc: add a notifier chain for vcpu creation/destruction Scott Wood
2013-02-14 5:49 ` [RFC PATCH 3/6] kvm/ppc/mpic: import hw/openpic.c from QEMU Scott Wood
2013-02-14 5:49 ` [RFC PATCH 4/6] kvm/ppc/mpic: remove some obviously unneeded code Scott Wood
2013-02-14 5:49 ` [RFC PATCH 5/6] kvm/ppc/mpic: adapt to kernel style and environment Scott Wood
2013-02-14 5:49 ` [RFC PATCH 6/6] kvm/ppc/mpic: in-kernel MPIC emulation Scott Wood
2013-03-21 8:28 ` Alexander Graf
2013-03-21 14:43 ` Scott Wood
2013-03-21 14:52 ` Alexander Graf
2013-02-18 12:04 ` [RFC PATCH 0/6] kvm/ppc/mpic: in-kernel irqchip Gleb Natapov
2013-02-18 23:05 ` Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 0/6] device control and in-kernel MPIC Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 1/6] kvm: add device control API Scott Wood
2013-04-02 6:59 ` tiejun.chen
[not found] ` <1364923807.24520.2@snotra>
2013-04-03 1:28 ` tiejun.chen
[not found] ` <1364952853.8690.3@snotra>
2013-04-03 1:42 ` tiejun.chen
2013-04-03 1:02 ` Paul Mackerras
2013-04-03 1:19 ` Scott Wood
2013-04-03 2:17 ` Paul Mackerras
2013-04-03 13:22 ` Alexander Graf
2013-04-03 17:37 ` Scott Wood
2013-04-03 17:39 ` Alexander Graf
2013-04-04 9:58 ` Gleb Natapov
2013-04-03 21:03 ` Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 2/6] kvm/ppc/mpic: import hw/openpic.c from QEMU Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 3/6] kvm/ppc/mpic: remove some obviously unneeded code Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 4/6] kvm/ppc/mpic: adapt to kernel style and environment Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 5/6] kvm/ppc/mpic: in-kernel MPIC emulation Scott Wood
2013-04-01 22:47 ` [RFC PATCH v2 6/6] kvm/ppc/mpic: add KVM_CAP_IRQ_MPIC Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 0/6] device control and in-kernel MPIC Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 1/6] kvm: add device control API Scott Wood
2013-04-03 15:13 ` Alexander Graf
2013-04-04 10:41 ` Gleb Natapov
2013-04-04 23:47 ` Scott Wood
2013-04-08 10:34 ` Gleb Natapov
2013-04-05 1:02 ` Paul Mackerras
2013-04-08 10:37 ` Gleb Natapov
2013-04-08 5:33 ` Paul Mackerras
2013-04-09 0:50 ` Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 2/6] kvm/ppc/mpic: import hw/openpic.c from QEMU Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 3/6] kvm/ppc/mpic: remove some obviously unneeded code Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 4/6] kvm/ppc/mpic: adapt to kernel style and environment Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 5/6] kvm/ppc/mpic: in-kernel MPIC emulation Scott Wood
2013-04-03 15:55 ` Gleb Natapov
2013-04-03 20:58 ` Scott Wood
2013-04-04 5:59 ` Gleb Natapov
2013-04-04 23:33 ` Scott Wood
2013-04-08 10:39 ` Gleb Natapov
2013-04-03 16:19 ` Alexander Graf
2013-04-03 21:38 ` Scott Wood [this message]
2013-04-03 21:58 ` Alexander Graf
2013-04-03 22:07 ` Scott Wood
2013-04-03 22:12 ` Alexander Graf
2013-04-03 22:54 ` Scott Wood
2013-04-04 9:42 ` Alexander Graf
2013-04-03 23:23 ` Scott Wood
2013-04-08 6:30 ` Paul Mackerras
2013-04-09 0:49 ` Scott Wood
2013-04-03 1:57 ` [RFC PATCH v3 6/6] kvm/ppc/mpic: add KVM_CAP_IRQ_MPIC Scott Wood
2013-04-04 12:54 ` Alexander Graf
2013-04-04 18:41 ` Scott Wood
2013-04-04 22:30 ` Alexander Graf
2013-04-04 22:35 ` Scott Wood
2013-04-05 6:09 ` Alexander Graf
2013-04-05 17:11 ` Scott Wood
2013-04-13 0:08 ` [PATCH v4 0/6] device-control and in-kernel MPIC Scott Wood
2013-04-13 0:08 ` [PATCH v4 1/6] kvm: add device control API Scott Wood
2013-04-25 9:43 ` Gleb Natapov
2013-04-25 10:47 ` Alexander Graf
2013-04-25 12:07 ` Gleb Natapov
2013-04-25 13:45 ` Alexander Graf
2013-04-25 13:51 ` Gleb Natapov
2013-04-25 16:51 ` Scott Wood
2013-04-25 18:22 ` Gleb Natapov
2013-04-25 18:59 ` Scott Wood
2013-04-26 9:53 ` Gleb Natapov
2013-04-26 9:55 ` Alexander Graf
2013-04-26 9:57 ` Gleb Natapov
2013-04-13 0:08 ` [PATCH v4 2/6] kvm/ppc/mpic: import hw/openpic.c from QEMU Scott Wood
2013-04-13 0:08 ` [PATCH v4 3/6] kvm/ppc/mpic: remove some obviously unneeded code Scott Wood
2013-04-13 0:08 ` [PATCH v4 4/6] kvm/ppc/mpic: adapt to kernel style and environment Scott Wood
2013-04-13 0:08 ` [PATCH v4 5/6] kvm/ppc/mpic: in-kernel MPIC emulation Scott Wood
2013-04-13 0:08 ` [PATCH v4 6/6] kvm/ppc/mpic: add KVM_CAP_IRQ_MPIC Scott Wood
2013-04-15 5:23 ` Paul Mackerras
2013-04-15 17:52 ` Scott Wood
2013-04-16 3:59 ` Paul Mackerras
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=1365025110.25627.15@snotra \
--to=scottwood@freescale.com \
--cc=agraf@suse.de \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=paulus@samba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox