From: Cornelia Huck <cornelia.huck@de.ibm.com>
To: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org,
qemu-devel@nongnu.org, renxiaof@linux.vnet.ibm.com,
borntraeger@de.ibm.com, agraf@suse.com,
alex.williamson@redhat.com, pmorel@linux.vnet.ibm.com,
pasic@linux.vnet.ibm.com, wkywang@linux.vnet.ibm.com
Subject: Re: [PATCH RFC v3 04/15] vfio: ccw: basic implementation for vfio_ccw driver
Date: Mon, 20 Feb 2017 19:31:13 +0100 [thread overview]
Message-ID: <20170220193113.3ba5af2c.cornelia.huck@de.ibm.com> (raw)
In-Reply-To: <20170217082939.33208-5-bjsdjshi@linux.vnet.ibm.com>
On Fri, 17 Feb 2017 09:29:28 +0100
Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> wrote:
> To make vfio support subchannel devices, we need a css driver for
> the vfio subchannels. This patch adds a basic vfio-ccw subchannel
> driver for this purpose.
>
> To enable VFIO for vfio-ccw, enable S390_CCW_IOMMU config option
> and configure VFIO as required.
>
> Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
> Acked-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
> ---
> arch/s390/Kconfig | 10 ++
> arch/s390/include/asm/isc.h | 1 +
> drivers/iommu/Kconfig | 8 ++
> drivers/s390/cio/Makefile | 3 +
> drivers/s390/cio/vfio_ccw_drv.c | 262 ++++++++++++++++++++++++++++++++++++
> drivers/s390/cio/vfio_ccw_private.h | 25 ++++
> 6 files changed, 309 insertions(+)
> create mode 100644 drivers/s390/cio/vfio_ccw_drv.c
> create mode 100644 drivers/s390/cio/vfio_ccw_private.h
>
> diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
> index c6722112..b920df8 100644
> --- a/arch/s390/Kconfig
> +++ b/arch/s390/Kconfig
> @@ -670,6 +670,16 @@ config EADM_SCH
> To compile this driver as a module, choose M here: the
> module will be called eadm_sch.
>
> +config VFIO_CCW
> + def_tristate n
> + prompt "Support for VFIO-CCW subchannels"
> + depends on S390_CCW_IOMMU && VFIO
> + help
> + This driver allows usage of VFIO-CCW subchannels.
Hm...
"This driver allows usage of I/O subchannels via VFIO-CCW."
?
> +
> + To compile this driver as a module, choose M here: the
> + module will be called vfio_ccw.
> +
> endmenu
>
> menu "Dump support"
> diff --git a/arch/s390/include/asm/isc.h b/arch/s390/include/asm/isc.h
> index 68d7d68..8a0b721 100644
> --- a/arch/s390/include/asm/isc.h
> +++ b/arch/s390/include/asm/isc.h
> @@ -16,6 +16,7 @@
> #define CONSOLE_ISC 1 /* console I/O subchannel */
> #define EADM_SCH_ISC 4 /* EADM subchannels */
> #define CHSC_SCH_ISC 7 /* CHSC subchannels */
> +#define VFIO_CCW_ISC IO_SCH_ISC /* VFIO-CCW I/O subchannels */
This is OK for now, I guess; but do we want to have the isc
configurable in the long run? I.e., if a host wants to run its own I/O
devices at a different priority than the devices it passes to a guest?
> /* Adapter interrupts. */
> #define QDIO_AIRQ_ISC IO_SCH_ISC /* I/O subchannel in qdio mode */
> #define PCI_ISC 2 /* PCI I/O subchannels */
(...)
> diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c
> new file mode 100644
> index 0000000..b068207
> --- /dev/null
> +++ b/drivers/s390/cio/vfio_ccw_drv.c
> @@ -0,0 +1,262 @@
> +/*
> + * VFIO based Physical Subchannel device driver
> + *
> + * Copyright IBM Corp. 2017
> + *
> + * Author(s): Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
> + * Xiao Feng Ren <renxiaof@linux.vnet.ibm.com>
> + */
> +
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/device.h>
> +#include <linux/slab.h>
> +
> +#include <asm/isc.h>
> +
> +#include "vfio_ccw_private.h"
> +
> +/*
> + * Helpers
> + */
> +static int vfio_ccw_sch_quiesce(struct subchannel *sch)
> +{
> + struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
> + DECLARE_COMPLETION_ONSTACK(completion);
> + int iretry, ret = 0;
> +
> + spin_lock_irq(sch->lock);
> + if (!sch->schib.pmcw.ena)
> + goto out_unlock;
> + ret = cio_disable_subchannel(sch);
> + if (ret != -EBUSY)
> + goto out_unlock;
> +
> + do {
> + iretry = 255;
> +
> + ret = cio_cancel_halt_clear(sch, &iretry);
> + while (ret == -EBUSY) {
> + /*
> + * Flushing all I/O and wait the
"Flush all I/O and wait for..."
> + * cancel/halt/clear completion.
> + */
> + private->completion = &completion;
> + spin_unlock_irq(sch->lock);
> +
> + wait_for_completion(&completion);
What happens for cancel? It won't generate an interrupt.
> +
> + spin_lock_irq(sch->lock);
> + private->completion = NULL;
> + ret = cio_cancel_halt_clear(sch, &iretry);
> + };
> +
> + ret = cio_disable_subchannel(sch);
> + } while (ret == -EBUSY);
> +
> +out_unlock:
> + spin_unlock_irq(sch->lock);
> + return ret;
> +}
> +
> +/*
> + * Sysfs interfaces
> + */
> +static ssize_t chpids_show(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct subchannel *sch = to_subchannel(dev);
> + struct chsc_ssd_info *ssd = &sch->ssd_info;
> + ssize_t ret = 0;
> + int chp;
> + int mask;
> +
> + for (chp = 0; chp < 8; chp++) {
> + mask = 0x80 >> chp;
> + if (ssd->path_mask & mask)
> + ret += sprintf(buf + ret, "%02x ", ssd->chpid[chp].id);
> + else
> + ret += sprintf(buf + ret, "00 ");
> + }
> + ret += sprintf(buf+ret, "\n");
> + return ret;
> +}
> +
> +static ssize_t pimpampom_show(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct subchannel *sch = to_subchannel(dev);
> + struct pmcw *pmcw = &sch->schib.pmcw;
> +
> + return sprintf(buf, "%02x %02x %02x\n",
> + pmcw->pim, pmcw->pam, pmcw->pom);
> +}
> +
> +static DEVICE_ATTR(chpids, 0444, chpids_show, NULL);
> +static DEVICE_ATTR(pimpampom, 0444, pimpampom_show, NULL);
Quick question: You need to duplicate these so that lscss shows a sane
output for vfio-ccw subchannels?
> +
> +static struct attribute *vfio_subchannel_attrs[] = {
> + &dev_attr_chpids.attr,
> + &dev_attr_pimpampom.attr,
> + NULL,
> +};
> +
> +static struct attribute_group vfio_subchannel_attr_group = {
> + .attrs = vfio_subchannel_attrs,
> +};
> +
> +/*
> + * Css driver callbacks
> + */
> +static void vfio_ccw_sch_irq(struct subchannel *sch)
> +{
> + struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
> +
> + inc_irq_stat(IRQIO_CIO);
> +
> + if (!private)
> + return;
> +
> + if (private->completion)
> + complete(private->completion);
> +}
> +
> +static int vfio_ccw_sch_probe(struct subchannel *sch)
> +{
> + struct pmcw *pmcw = &sch->schib.pmcw;
> + struct vfio_ccw_private *private;
> + int ret;
> +
> + if (pmcw->qf) {
> + dev_warn(&sch->dev, "vfio: ccw: do not support QDIO: %s\n",
s/do/does/
> + dev_name(&sch->dev));
> + return -ENOTTY;
Is -ENOTTY the right return code here? -EINVAL?
> + }
> +
> + private = kzalloc(sizeof(*private), GFP_KERNEL | GFP_DMA);
> + if (!private)
> + return -ENOMEM;
> + private->sch = sch;
> + dev_set_drvdata(&sch->dev, private);
> +
> + spin_lock_irq(sch->lock);
> + sch->isc = VFIO_CCW_ISC;
> + ret = cio_enable_subchannel(sch, (u32)(unsigned long)sch);
> + spin_unlock_irq(sch->lock);
> + if (ret)
> + goto out_free;
> +
> + ret = sysfs_create_group(&sch->dev.kobj, &vfio_subchannel_attr_group);
> + if (ret)
> + goto out_disable;
> +
> + return 0;
> +
> +out_disable:
> + cio_disable_subchannel(sch);
> +out_free:
> + dev_set_drvdata(&sch->dev, NULL);
> + kfree(private);
> + return ret;
> +}
> +
(...)
> +/**
> + * vfio_ccw_sch_event - process subchannel event
> + * @sch: subchannel
> + * @process: non-zero if function is called in process context
> + *
> + * An unspecified event occurred for this subchannel. Adjust data according
> + * to the current operational state of the subchannel. Return zero when the
> + * event has been handled sufficiently or -EAGAIN when this function should
> + * be called again in process context.
> + */
> +static int vfio_ccw_sch_event(struct subchannel *sch, int process)
> +{
> + unsigned long flags;
> +
> + spin_lock_irqsave(sch->lock, flags);
> + if (!device_is_registered(&sch->dev))
> + goto out_unlock;
> +
> + if (work_pending(&sch->todo_work))
> + goto out_unlock;
> +
> + if (cio_update_schib(sch)) {
> + /* Not operational. */
> + css_sched_sch_todo(sch, SCH_TODO_UNREG);
> +
> + /*
> + * TODO:
> + * Probably we should send the machine check to the guest.
Yes, we should do that later on. Will user space notice that the device
is gone? (I think crw injection should be done by user space.)
> + */
> + goto out_unlock;
> + }
> +
> +out_unlock:
> + spin_unlock_irqrestore(sch->lock, flags);
> +
> + return 0;
> +}
(...)
Looks sane in general from my POV.
next prev parent reply other threads:[~2017-02-20 18:31 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-17 8:29 [PATCH RFC v3 00/15] basic vfio-ccw infrastructure Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 01/15] s390: cio: introduce cio_cancel_halt_clear Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 02/15] s390: cio: export more interfaces Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 03/15] vfio: ccw: define device_api strings Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 04/15] vfio: ccw: basic implementation for vfio_ccw driver Dong Jia Shi
2017-02-20 18:31 ` Cornelia Huck [this message]
2017-02-21 7:36 ` Dong Jia Shi
[not found] ` <20170221073623.GJ562@bjsdjshi@linux.vnet.ibm.com>
2017-02-21 7:43 ` Dong Jia Shi
2017-02-21 15:43 ` Cornelia Huck
2017-02-22 3:05 ` Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 05/15] vfio: ccw: introduce channel program interfaces Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 06/15] vfio: ccw: register vfio_ccw to the mediated device framework Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 07/15] vfio: ccw: introduce ccw_io_region Dong Jia Shi
2017-02-24 23:13 ` Alex Williamson
2017-02-17 8:29 ` [PATCH RFC v3 08/15] vfio: ccw: handle ccw command request Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 09/15] vfio: ccw: realize VFIO_DEVICE_GET_REGION_INFO ioctl Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 10/15] vfio: ccw: realize VFIO_DEVICE_RESET ioctl Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 11/15] vfio: ccw: realize VFIO_DEVICE_G(S)ET_IRQ_INFO ioctls Dong Jia Shi
2017-02-24 23:27 ` Alex Williamson
2017-02-27 1:44 ` Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 12/15] vfio: ccw: return I/O results asynchronously Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 13/15] vfio: ccw: introduce a finite state machine Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 14/15] docs: add documentation for vfio-ccw Dong Jia Shi
2017-02-17 8:29 ` [PATCH RFC v3 15/15] vfio: ccw: introduce support for ccw0 Dong Jia Shi
2017-02-20 18:59 ` Cornelia Huck
2017-02-21 8:58 ` Dong Jia Shi
[not found] ` <20170221085824.GN562@bjsdjshi@linux.vnet.ibm.com>
2017-02-21 15:47 ` Cornelia Huck
[not found] ` <20170309092525.GA10189@bjsdjshi@linux.vnet.ibm.com>
2017-03-10 10:46 ` [PATCH RFC v3 00/15] basic vfio-ccw infrastructure Cornelia Huck
[not found] ` <20170313071652.GD6756@bjsdjshi@linux.vnet.ibm.com>
2017-03-16 9:25 ` 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=20170220193113.3ba5af2c.cornelia.huck@de.ibm.com \
--to=cornelia.huck@de.ibm.com \
--cc=agraf@suse.com \
--cc=alex.williamson@redhat.com \
--cc=bjsdjshi@linux.vnet.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=pasic@linux.vnet.ibm.com \
--cc=pmorel@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=renxiaof@linux.vnet.ibm.com \
--cc=wkywang@linux.vnet.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