Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96D0AC433F5 for ; Wed, 8 Dec 2021 08:04:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244634AbhLHIHy (ORCPT ); Wed, 8 Dec 2021 03:07:54 -0500 Received: from out30-44.freemail.mail.aliyun.com ([115.124.30.44]:35904 "EHLO out30-44.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240425AbhLHIHx (ORCPT ); Wed, 8 Dec 2021 03:07:53 -0500 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R111e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04423;MF=yun.wang@linux.alibaba.com;NM=1;PH=DS;RN=4;SR=0;TI=SMTPD_---0UzrdQVf_1638950659; Received: from 30.21.164.163(mailfrom:yun.wang@linux.alibaba.com fp:SMTPD_---0UzrdQVf_1638950659) by smtp.aliyun-inc.com(127.0.0.1); Wed, 08 Dec 2021 16:04:19 +0800 Message-ID: Date: Wed, 8 Dec 2021 16:04:19 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.2.1 Subject: Re: [RFC PATCH] virtio: make sure legacy pci device gain 32bit-pfn vq Content-Language: en-US To: "Michael S. Tsirkin" Cc: Jason Wang , "open list:VIRTIO CORE AND NET DRIVERS" , open list References: <20211207031217-mutt-send-email-mst@kernel.org> <8bbfd029-d969-4632-cb8e-482481d65a2f@linux.alibaba.com> <20211208021947-mutt-send-email-mst@kernel.org> From: =?UTF-8?B?546L6LSH?= In-Reply-To: <20211208021947-mutt-send-email-mst@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 在 2021/12/8 下午3:23, Michael S. Tsirkin 写道: > On Tue, Dec 07, 2021 at 05:09:56PM +0800, 王贇 wrote: >> >> >> 在 2021/12/7 下午4:13, Michael S. Tsirkin 写道: >>> On Tue, Dec 07, 2021 at 03:51:45PM +0800, 王贇 wrote: >>>> We observed issues like: >>>> virtio-pci 0000:14:00.0: platform bug: legacy virtio-mmio must >>>> not be used with RAM above 0x4000GB >>>> >>>> when we have a legacy pci device which desired 32bit-pfn vq >>>> but gain 64bit-pfn instead, lead into the failure of probe. >>>> >>>> vring_use_dma_api() is playing the key role in here, to help the >>>> allocation process understand which kind of vq it should alloc, >>>> however, it failed to take care the legacy pci device, which only >>>> have 32bit feature flag and can never have VIRTIO_F_ACCESS_PLATFORM >>>> setted. >>>> >>>> This patch introduce force_dma flag to help vring_use_dma_api() >>>> understanding the requirement better, to avoid the failing. >>>> >>>> Signed-off-by: Michael Wang >>> >>> This will break configs where the device appears behind >>> a virtual iommu, so this won't fly. >>> Just make your device support 1.0, eh? >> >> Hi, Michael >> >> Thanks for the comment, unfortunately modify device is not an option for us >> :-( >> >> Is there any idea on how to solve this issue properly? >> >> Regards, >> Michael Wang > > By the way, there is a bug in the error message. Want to fix that? Could you please provide more detail about the bug? We'd like to help fixing it :-) Besides, I've checked that patch but it can't address our issue, we actually have this legacy pci device on arm platform, and the memory layout is unfriendly since allocation rarely providing page-address below 44bit, we understand the virtio-iommu case should not do force dma, while we don't have that so it's just working fine. Regards, Michael Wang > > >>> >>>> --- >>>> drivers/virtio/virtio_pci_legacy.c | 10 ++++++++++ >>>> drivers/virtio/virtio_ring.c | 3 +++ >>>> include/linux/virtio.h | 1 + >>>> 3 files changed, 14 insertions(+) >>>> >>>> diff --git a/drivers/virtio/virtio_pci_legacy.c >>>> b/drivers/virtio/virtio_pci_legacy.c >>>> index d62e983..11f2ebf 100644 >>>> --- a/drivers/virtio/virtio_pci_legacy.c >>>> +++ b/drivers/virtio/virtio_pci_legacy.c >>>> @@ -263,6 +263,16 @@ int virtio_pci_legacy_probe(struct virtio_pci_device >>>> *vp_dev) >>>> vp_dev->setup_vq = setup_vq; >>>> vp_dev->del_vq = del_vq; >>>> >>>> + /* >>>> + * The legacy pci device requre 32bit-pfn vq, >>>> + * or setup_vq() will failed. >>>> + * >>>> + * Thus we make sure vring_use_dma_api() will >>>> + * return true during the allocation by marking >>>> + * force_dma here. >>>> + */ >>>> + vp_dev->vdev.force_dma = true; >>>> + >>>> return 0; >>>> >>>> err_iomap: >>>> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c >>>> index 3035bb6..6562e01 100644 >>>> --- a/drivers/virtio/virtio_ring.c >>>> +++ b/drivers/virtio/virtio_ring.c >>>> @@ -245,6 +245,9 @@ static inline bool virtqueue_use_indirect(struct >>>> virtqueue *_vq, >>>> >>>> static bool vring_use_dma_api(struct virtio_device *vdev) >>>> { >>>> + if (vdev->force_dma) >>>> + return true; >>>> + >>>> if (!virtio_has_dma_quirk(vdev)) >>>> return true; >>>> >>>> diff --git a/include/linux/virtio.h b/include/linux/virtio.h >>>> index 41edbc0..a4eb29d 100644 >>>> --- a/include/linux/virtio.h >>>> +++ b/include/linux/virtio.h >>>> @@ -109,6 +109,7 @@ struct virtio_device { >>>> bool failed; >>>> bool config_enabled; >>>> bool config_change_pending; >>>> + bool force_dma; >>>> spinlock_t config_lock; >>>> spinlock_t vqs_list_lock; /* Protects VQs list access */ >>>> struct device dev; >>>> -- >>>> 1.8.3.1