From patchwork Thu Apr 4 23:16:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Halil Pasic X-Patchwork-Id: 10886619 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 31FE117E9 for ; Thu, 4 Apr 2019 23:16:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F02028A84 for ; Thu, 4 Apr 2019 23:16:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 130AB285A6; Thu, 4 Apr 2019 23:16:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E9C9285A6 for ; Thu, 4 Apr 2019 23:16:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731071AbfDDXQw (ORCPT ); Thu, 4 Apr 2019 19:16:52 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:50150 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730972AbfDDXQv (ORCPT ); Thu, 4 Apr 2019 19:16:51 -0400 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x34N9mXF004762 for ; Thu, 4 Apr 2019 19:16:50 -0400 Received: from e06smtp03.uk.ibm.com (e06smtp03.uk.ibm.com [195.75.94.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 2rnubag8ek-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 04 Apr 2019 19:16:50 -0400 Received: from localhost by e06smtp03.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 5 Apr 2019 00:16:48 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp03.uk.ibm.com (192.168.101.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Fri, 5 Apr 2019 00:16:46 +0100 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x34NGiiV52953126 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 4 Apr 2019 23:16:44 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9EFFE52050; Thu, 4 Apr 2019 23:16:44 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTPS id 26FA952051; Thu, 4 Apr 2019 23:16:44 +0000 (GMT) From: Halil Pasic To: kvm@vger.kernel.org, linux-s390@vger.kernel.org, Cornelia Huck , Martin Schwidefsky , Sebastian Ott Cc: Halil Pasic , virtualization@lists.linux-foundation.org, Christian Borntraeger , Viktor Mihajlovski , Vasily Gorbik , Janosch Frank , Claudio Imbrenda , Farhan Ali , Eric Farman Subject: [RFC PATCH 11/12] virtio/s390: use the cio DMA pool Date: Fri, 5 Apr 2019 01:16:21 +0200 X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190404231622.52531-1-pasic@linux.ibm.com> References: <20190404231622.52531-1-pasic@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 19040423-0012-0000-0000-0000030B67B9 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19040423-0013-0000-0000-000021437904 Message-Id: <20190404231622.52531-12-pasic@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-04-04_13:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=775 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1904040148 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Lets use the cio DMA pool for DMA allocations to avoid problems with granularity, and make things simpler and cheaper. Signed-off-by: Halil Pasic --- drivers/s390/virtio/virtio_ccw.c | 54 ++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c index 7268149f2ee8..ba1dafe04968 100644 --- a/drivers/s390/virtio/virtio_ccw.c +++ b/drivers/s390/virtio/virtio_ccw.c @@ -71,7 +71,6 @@ struct virtio_ccw_device { void *airq_info; __u64 dma_mask; struct vcdev_dma_area *dma_area; - dma_addr_t dma_area_dma_addr; }; static inline unsigned long *indicators(struct virtio_ccw_device *vcdev) @@ -128,7 +127,6 @@ struct virtio_ccw_vq_info { struct vq_info_block s; struct vq_info_block_legacy l; } *info_block; - dma_addr_t info_block_dma_addr; int bit_nr; struct list_head node; long cookie; @@ -184,26 +182,23 @@ static struct virtio_ccw_device *to_vc_device(struct virtio_device *vdev) } #define vc_dma_decl_struct(type, field) \ - dma_addr_t field ## _dma_addr; \ struct type *field -static inline void *__vc_dma_alloc(struct virtio_device *vdev, size_t size, - dma_addr_t *dma_handle) +static inline void *__vc_dma_alloc(struct virtio_device *vdev, size_t size) { - return dma_alloc_coherent(vdev->dev.parent, size, dma_handle, - GFP_DMA | GFP_KERNEL | __GFP_ZERO); + return (void *) cio_dma_zalloc(size); } static inline void __vc_dma_free(struct virtio_device *vdev, size_t size, - void *cpu_addr, dma_addr_t dma_handle) + void *cpu_addr) { - dma_free_coherent(vdev->dev.parent, size, cpu_addr, dma_handle); + cio_dma_free(cpu_addr, size); } #define vc_dma_alloc_struct(vdev, ptr) \ - ({ ptr = __vc_dma_alloc(vdev, (sizeof(*(ptr))), &(ptr ## _dma_addr)); }) + ({ptr = __vc_dma_alloc(vdev, sizeof(*(ptr))); }) #define vc_dma_free_struct(vdev, ptr) \ - __vc_dma_free(vdev, sizeof(*(ptr)), (ptr), (ptr ## _dma_addr)) + __vc_dma_free(vdev, sizeof(*(ptr)), (ptr)) static void drop_airq_indicator(struct virtqueue *vq, struct airq_info *info) { @@ -361,7 +356,6 @@ static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev, int ret; unsigned long *indicatorp = NULL; vc_dma_decl_struct(virtio_thinint_area, thinint_area) = NULL; - dma_addr_t indicatorp_dma_addr; struct airq_info *airq_info = vcdev->airq_info; if (vcdev->is_thinint) { @@ -377,8 +371,7 @@ static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev, } else { /* payload is the address of the indicators */ indicatorp = __vc_dma_alloc(&vcdev->vdev, - sizeof(indicators(vcdev)), - &indicatorp_dma_addr); + sizeof(indicators(vcdev))); if (!indicatorp) return; *indicatorp = 0; @@ -400,7 +393,7 @@ static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev, virtio_ccw_drop_indicators(vcdev); if (indicatorp) __vc_dma_free(&vcdev->vdev, sizeof(indicators(vcdev)), - indicatorp, indicatorp_dma_addr); + indicatorp); vc_dma_free_struct(&vcdev->vdev, thinint_area); } @@ -667,7 +660,6 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs, { struct virtio_ccw_device *vcdev = to_vc_device(vdev); unsigned long *indicatorp = NULL; - dma_addr_t indicatorp_dma_addr; int ret, i, queue_idx = 0; vc_dma_decl_struct(ccw1, ccw); @@ -695,8 +687,7 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs, * We need a data area under 2G to communicate. Our payload is * the address of the indicators. */ - indicatorp = __vc_dma_alloc(&vcdev->vdev, sizeof(indicators(vcdev)), - &indicatorp_dma_addr); + indicatorp = __vc_dma_alloc(&vcdev->vdev, sizeof(indicators(vcdev))); if (!indicatorp) goto out; *indicatorp = (unsigned long) indicators(vcdev); @@ -730,13 +721,13 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs, if (indicatorp) __vc_dma_free(&vcdev->vdev, sizeof(indicators(vcdev)), - indicatorp, indicatorp_dma_addr); + indicatorp); vc_dma_free_struct(vdev, ccw); return 0; out: if (indicatorp) __vc_dma_free(&vcdev->vdev, sizeof(indicators(vcdev)), - indicatorp, indicatorp_dma_addr); + indicatorp); vc_dma_free_struct(vdev, ccw); virtio_ccw_del_vqs(vdev); return ret; @@ -889,14 +880,12 @@ static void virtio_ccw_get_config(struct virtio_device *vdev, vc_dma_decl_struct(ccw1, ccw); void *config_area; unsigned long flags; - dma_addr_t config_area_dma_addr; vc_dma_alloc_struct(vdev, ccw); if (!ccw) return; - config_area = __vc_dma_alloc(vdev, VIRTIO_CCW_CONFIG_SIZE, - &config_area_dma_addr); + config_area = __vc_dma_alloc(vdev, VIRTIO_CCW_CONFIG_SIZE); if (!config_area) goto out_free; @@ -918,8 +907,7 @@ static void virtio_ccw_get_config(struct virtio_device *vdev, memcpy(buf, config_area + offset, len); out_free: - __vc_dma_free(vdev, VIRTIO_CCW_CONFIG_SIZE, config_area, - config_area_dma_addr); + __vc_dma_free(vdev, VIRTIO_CCW_CONFIG_SIZE, config_area); vc_dma_free_struct(vdev, ccw); } @@ -931,14 +919,12 @@ static void virtio_ccw_set_config(struct virtio_device *vdev, vc_dma_decl_struct(ccw1, ccw); void *config_area; unsigned long flags; - dma_addr_t config_area_dma_addr; vc_dma_alloc_struct(vdev, ccw); if (!ccw) return; - config_area = __vc_dma_alloc(vdev, VIRTIO_CCW_CONFIG_SIZE, - &config_area_dma_addr); + config_area = __vc_dma_alloc(vdev, VIRTIO_CCW_CONFIG_SIZE); if (!config_area) goto out_free; @@ -957,8 +943,7 @@ static void virtio_ccw_set_config(struct virtio_device *vdev, ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_CONFIG); out_free: - __vc_dma_free(vdev, VIRTIO_CCW_CONFIG_SIZE, config_area, - config_area_dma_addr); + __vc_dma_free(vdev, VIRTIO_CCW_CONFIG_SIZE, config_area); vc_dma_free_struct(vdev, ccw); } @@ -1045,8 +1030,7 @@ static void virtio_ccw_release_dev(struct device *_d) struct virtio_device *dev = dev_to_virtio(_d); struct virtio_ccw_device *vcdev = to_vc_device(dev); - __vc_dma_free(&vcdev->vdev, PAGE_SIZE, vcdev->dma_area, - vcdev->dma_area_dma_addr); + vc_dma_free_struct(&vcdev->vdev, vcdev->dma_area); kfree(vcdev); } @@ -1318,8 +1302,7 @@ static int virtio_ccw_online(struct ccw_device *cdev) goto out_free; } - vcdev->dma_area = __vc_dma_alloc(&vcdev->vdev, PAGE_SIZE, - &vcdev->dma_area_dma_addr); + vc_dma_alloc_struct(&vcdev->vdev, vcdev->dma_area); if (!vcdev->dma_area) { ret = -ENOMEM; goto out_free; @@ -1360,8 +1343,7 @@ static int virtio_ccw_online(struct ccw_device *cdev) return ret; out_free: if (vcdev) { - __vc_dma_free(&vcdev->vdev, PAGE_SIZE, vcdev->dma_area, - vcdev->dma_area_dma_addr); + vc_dma_free_struct(&vcdev->vdev, vcdev->dma_area); } kfree(vcdev); return ret;