From: Michael Mueller <mimu@linux.ibm.com>
To: Halil Pasic <pasic@linux.ibm.com>,
kvm@vger.kernel.org, linux-s390@vger.kernel.org,
Cornelia Huck <cohuck@redhat.com>,
Sebastian Ott <sebott@linux.ibm.com>,
Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: virtualization@lists.linux-foundation.org,
"Michael S. Tsirkin" <mst@redhat.com>,
Christoph Hellwig <hch@infradead.org>,
Thomas Huth <thuth@redhat.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Viktor Mihajlovski <mihajlov@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
Farhan Ali <alifm@linux.ibm.com>,
Eric Farman <farman@linux.ibm.com>,
"Jason J. Herne" <jjherne@linux.ibm.com>
Subject: Re: [PATCH v5 4/8] s390/airq: use DMA memory for adapter interrupts
Date: Thu, 13 Jun 2019 10:25:59 +0200 [thread overview]
Message-ID: <721eb3c1-dce0-972e-2f25-9028a39a3a1b@linux.ibm.com> (raw)
In-Reply-To: <20190612111236.99538-5-pasic@linux.ibm.com>
On 12.06.19 13:12, Halil Pasic wrote:
> Protected virtualization guests have to use shared pages for airq
> notifier bit vectors, because hypervisor needs to write these bits.
because the hypervisor
>
> Let us make sure we allocate DMA memory for the notifier bit vectors by
> replacing the kmem_cache with a dma_cache and kalloc() with
> cio_dma_zalloc().
>
> Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
> Reviewed-by: Sebastian Ott <sebott@linux.ibm.com>
> ---
> arch/s390/include/asm/airq.h | 2 ++
> drivers/s390/cio/airq.c | 37 ++++++++++++++++++++++--------------
> drivers/s390/cio/cio.h | 2 ++
> drivers/s390/cio/css.c | 1 +
> 4 files changed, 28 insertions(+), 14 deletions(-)
>
> diff --git a/arch/s390/include/asm/airq.h b/arch/s390/include/asm/airq.h
> index c10d2ee2dfda..01936fdfaddb 100644
> --- a/arch/s390/include/asm/airq.h
> +++ b/arch/s390/include/asm/airq.h
> @@ -11,6 +11,7 @@
> #define _ASM_S390_AIRQ_H
>
> #include <linux/bit_spinlock.h>
> +#include <linux/dma-mapping.h>
>
> struct airq_struct {
> struct hlist_node list; /* Handler queueing. */
> @@ -29,6 +30,7 @@ void unregister_adapter_interrupt(struct airq_struct *airq);
> /* Adapter interrupt bit vector */
> struct airq_iv {
> unsigned long *vector; /* Adapter interrupt bit vector */
> + dma_addr_t vector_dma; /* Adapter interrupt bit vector dma */
> unsigned long *avail; /* Allocation bit mask for the bit vector */
> unsigned long *bitlock; /* Lock bit mask for the bit vector */
> unsigned long *ptr; /* Pointer associated with each bit */
> diff --git a/drivers/s390/cio/airq.c b/drivers/s390/cio/airq.c
> index 4534afc63591..427b2e24a8ce 100644
> --- a/drivers/s390/cio/airq.c
> +++ b/drivers/s390/cio/airq.c
> @@ -16,9 +16,11 @@
> #include <linux/mutex.h>
> #include <linux/rculist.h>
> #include <linux/slab.h>
> +#include <linux/dmapool.h>
>
> #include <asm/airq.h>
> #include <asm/isc.h>
> +#include <asm/cio.h>
>
> #include "cio.h"
> #include "cio_debug.h"
> @@ -27,7 +29,7 @@
> static DEFINE_SPINLOCK(airq_lists_lock);
> static struct hlist_head airq_lists[MAX_ISC+1];
>
> -static struct kmem_cache *airq_iv_cache;
> +static struct dma_pool *airq_iv_cache;
>
> /**
> * register_adapter_interrupt() - register adapter interrupt handler
> @@ -115,6 +117,11 @@ void __init init_airq_interrupts(void)
> setup_irq(THIN_INTERRUPT, &airq_interrupt);
> }
>
> +static inline unsigned long iv_size(unsigned long bits)
> +{
> + return BITS_TO_LONGS(bits) * sizeof(unsigned long);
> +}
> +
> /**
> * airq_iv_create - create an interrupt vector
> * @bits: number of bits in the interrupt vector
> @@ -132,17 +139,19 @@ struct airq_iv *airq_iv_create(unsigned long bits, unsigned long flags)
> goto out;
> iv->bits = bits;
> iv->flags = flags;
> - size = BITS_TO_LONGS(bits) * sizeof(unsigned long);
> + size = iv_size(bits);
>
> if (flags & AIRQ_IV_CACHELINE) {
> - if ((cache_line_size() * BITS_PER_BYTE) < bits)
> + if ((cache_line_size() * BITS_PER_BYTE) < bits
> + || !airq_iv_cache)
> goto out_free;
>
> - iv->vector = kmem_cache_zalloc(airq_iv_cache, GFP_KERNEL);
> + iv->vector = dma_pool_zalloc(airq_iv_cache, GFP_KERNEL,
> + &iv->vector_dma);
> if (!iv->vector)
> goto out_free;
> } else {
> - iv->vector = kzalloc(size, GFP_KERNEL);
> + iv->vector = cio_dma_zalloc(size);
> if (!iv->vector)
> goto out_free;
> }
> @@ -178,10 +187,10 @@ struct airq_iv *airq_iv_create(unsigned long bits, unsigned long flags)
> kfree(iv->ptr);
> kfree(iv->bitlock);
> kfree(iv->avail);
> - if (iv->flags & AIRQ_IV_CACHELINE)
> - kmem_cache_free(airq_iv_cache, iv->vector);
> + if (iv->flags & AIRQ_IV_CACHELINE && iv->vector)
> + dma_pool_free(airq_iv_cache, iv->vector, iv->vector_dma);
> else
> - kfree(iv->vector);
> + cio_dma_free(iv->vector, size);
> kfree(iv);
> out:
> return NULL;
> @@ -198,9 +207,9 @@ void airq_iv_release(struct airq_iv *iv)
> kfree(iv->ptr);
> kfree(iv->bitlock);
> if (iv->flags & AIRQ_IV_CACHELINE)
> - kmem_cache_free(airq_iv_cache, iv->vector);
> + dma_pool_free(airq_iv_cache, iv->vector, iv->vector_dma);
> else
> - kfree(iv->vector);
> + cio_dma_free(iv->vector, iv_size(iv->bits));
> kfree(iv->avail);
> kfree(iv);
> }
> @@ -295,12 +304,12 @@ unsigned long airq_iv_scan(struct airq_iv *iv, unsigned long start,
> }
> EXPORT_SYMBOL(airq_iv_scan);
>
> -static int __init airq_init(void)
> +int __init airq_init(void)
> {
> - airq_iv_cache = kmem_cache_create("airq_iv_cache", cache_line_size(),
> - cache_line_size(), 0, NULL);
> + airq_iv_cache = dma_pool_create("airq_iv_cache", cio_get_dma_css_dev(),
> + cache_line_size(),
> + cache_line_size(), PAGE_SIZE);
> if (!airq_iv_cache)
> return -ENOMEM;
> return 0;
> }
> -subsys_initcall(airq_init);
> diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h
> index 06a91743335a..4d6c7d16416e 100644
> --- a/drivers/s390/cio/cio.h
> +++ b/drivers/s390/cio/cio.h
> @@ -135,6 +135,8 @@ extern int cio_commit_config(struct subchannel *sch);
> int cio_tm_start_key(struct subchannel *sch, struct tcw *tcw, u8 lpm, u8 key);
> int cio_tm_intrg(struct subchannel *sch);
>
> +extern int __init airq_init(void);
> +
> /* Use with care. */
> #ifdef CONFIG_CCW_CONSOLE
> extern struct subchannel *cio_probe_console(void);
> diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
> index e0f19f1e82a0..1b867c941b86 100644
> --- a/drivers/s390/cio/css.c
> +++ b/drivers/s390/cio/css.c
> @@ -1184,6 +1184,7 @@ static int __init css_bus_init(void)
> ret = cio_dma_pool_init();
> if (ret)
> goto out_unregister_pmn;
> + airq_init();
> css_init_done = 1;
>
> /* Enable default isc for I/O subchannels. */
>
Reviewed-by: Michael Mueller <mimu@linux.ibm.com>
Michael
next prev parent reply other threads:[~2019-06-13 8:26 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-12 11:12 [PATCH v5 0/8] s390: virtio: support protected virtualization Halil Pasic
2019-06-12 11:12 ` [PATCH v5 1/8] s390/mm: force swiotlb for " Halil Pasic
2019-06-13 8:09 ` Michael Mueller
2019-07-11 21:48 ` Thiago Jung Bauermann
2019-06-12 11:12 ` [PATCH v5 2/8] s390/cio: introduce DMA pools to cio Halil Pasic
2019-06-12 14:23 ` Cornelia Huck
2019-06-13 8:13 ` Michael Mueller
2019-06-12 11:12 ` [PATCH v5 3/8] s390/cio: add basic protected virtualization support Halil Pasic
2019-06-13 8:21 ` Michael Mueller
2019-06-12 11:12 ` [PATCH v5 4/8] s390/airq: use DMA memory for adapter interrupts Halil Pasic
2019-06-12 14:35 ` Cornelia Huck
2019-06-12 15:11 ` Halil Pasic
2019-06-13 8:25 ` Michael Mueller [this message]
2019-06-12 11:12 ` [PATCH v5 5/8] virtio/s390: use cacheline aligned airq bit vectors Halil Pasic
2019-06-13 8:27 ` Michael Mueller
2019-06-12 11:12 ` [PATCH v5 6/8] virtio/s390: add indirection to indicators access Halil Pasic
2019-06-13 8:29 ` Michael Mueller
2019-06-12 11:12 ` [PATCH v5 7/8] virtio/s390: use DMA memory for ccw I/O and classic notifiers Halil Pasic
2019-06-13 8:32 ` Michael Mueller
2019-06-12 11:12 ` [PATCH v5 8/8] virtio/s390: make airq summary indicators DMA Halil Pasic
2019-06-13 8:35 ` Michael Mueller
2019-06-13 9:11 ` [PATCH v5 0/8] s390: virtio: support protected virtualization Michael Mueller
2019-06-13 11:14 ` Halil Pasic
2019-06-13 11:17 ` Michael Mueller
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=721eb3c1-dce0-972e-2f25-9028a39a3a1b@linux.ibm.com \
--to=mimu@linux.ibm.com \
--cc=alifm@linux.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=farman@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hch@infradead.org \
--cc=heiko.carstens@de.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=jjherne@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mihajlov@linux.ibm.com \
--cc=mst@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=sebott@linux.ibm.com \
--cc=thuth@redhat.com \
--cc=virtualization@lists.linux-foundation.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