Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp5871411rwb; Mon, 14 Nov 2022 10:35:49 -0800 (PST) X-Google-Smtp-Source: AA0mqf5cLw/FDd66leEp3uvViV+g9c84PRaxXss0OWO/VkPbQrH1dYZYOBtlAi6w64bZhFpD90h4 X-Received: by 2002:a17:906:154f:b0:78d:9bcf:4d9f with SMTP id c15-20020a170906154f00b0078d9bcf4d9fmr11080232ejd.749.1668450949408; Mon, 14 Nov 2022 10:35:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668450949; cv=none; d=google.com; s=arc-20160816; b=FHl1YLTmoL/KQ9NQ8khKtSFj8+Tc+dYV2QzsKvQYJcew6IgU7k53eOG2TP5Z0kiNJs 4d40ZVhVkFMQMCX9o4GNgsI1AREt8XSLpb8f/hP4hyftG4DdyMDrIzgnzYESY3MkaRpr 3Vx+KxUOwEAE4AAZeOFhJLTqIfKL87ra1NH+IWZaokggcvmNLccOQ4/dP1xyj9O3AGMo B4aJP4CSblA65G08iJwhIrDrS2xKSfv7YV2nqxT9R0YfNGheTM52Nbx0GmoGwDLVfqSP jjzfgHdsoMgW2TSUrU3kr9rnqI0CC4OQBQLUThK9m6aXTdPjL24YvR8sDkF5TKngs2RB BliA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=C8Fb2VTNV/wbNrLcSnjODsqU340EMcFNCc5+SpFMS5E=; b=bfeppfVgbsHWKbo1wxkMww/Mkrl80EneqLuwcnKNhKT+CBLH51c4CZwfmtIeUW7Vpx O8CpCGbz1Xbk/cIq/ty/rwFDBen1MUOpn/WHZfLwWqIqB4hkrGKTQLSFOTOmbBlkZzMN z4YcNovysdy1ZZYn/scVL9/yLCzSWE++H51EpWMuY1JqOAGbczdT9tJ/aGI/wLINNHil dC7nZvrLofQX+imTqFF1QLcJcSw+NngKZ/KD0MTxhuhmk9TcbtLNPVtGQR+XwZXCBgjb 0V6CY/NBowITCHGZsp3cBH2sRIFJhHscYA1vWDgwlPSiSmkze3caRxt+dljfiz6sD8Mo IREg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o3-20020aa7c503000000b004488842d88esi6748719edq.13.2022.11.14.10.35.28; Mon, 14 Nov 2022 10:35:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235838AbiKNSS5 (ORCPT + 88 others); Mon, 14 Nov 2022 13:18:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42494 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236993AbiKNSRs (ORCPT ); Mon, 14 Nov 2022 13:17:48 -0500 Received: from 2.mo552.mail-out.ovh.net (2.mo552.mail-out.ovh.net [178.33.105.233]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EB22D45084 for ; Mon, 14 Nov 2022 10:16:12 -0800 (PST) Received: from mxplan5.mail.ovh.net (unknown [10.108.4.47]) by mo552.mail-out.ovh.net (Postfix) with ESMTPS id 304A426EE3; Mon, 14 Nov 2022 17:00:21 +0000 (UTC) Received: from kaod.org (37.59.142.96) by DAG4EX1.mxp5.local (172.16.2.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16; Mon, 14 Nov 2022 18:00:20 +0100 Authentication-Results: garm.ovh; auth=pass (GARM-96R001ba274e76-cd36-414b-a769-8a95de005f05, 75464F94774268435EE9F43A7981E45EBBD3EAE1) smtp.auth=clg@kaod.org X-OVh-ClientIp: 82.64.250.170 Message-ID: Date: Mon, 14 Nov 2022 18:00:13 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH] virtio_console: Use an atomic to allocate virtual console numbers Content-Language: en-US To: Greg Kroah-Hartman CC: Amit Shah , Arnd Bergmann , , References: <20221114080752.1900699-1-clg@kaod.org> From: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [37.59.142.96] X-ClientProxiedBy: DAG8EX1.mxp5.local (172.16.2.71) To DAG4EX1.mxp5.local (172.16.2.31) X-Ovh-Tracer-GUID: baa3eead-db12-4207-b471-6daf20ed2d35 X-Ovh-Tracer-Id: 8369095486717004707 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvgedrgedvgdeikecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefkffggfgfuvfevfhfhjggtgfhisehtkeertddtfeejnecuhfhrohhmpeevrogurhhitgcunfgvucfiohgrthgvrhcuoegtlhhgsehkrghougdrohhrgheqnecuggftrfgrthhtvghrnhepffdufeeliedujeeffffhjeffiefghffhhfdvkeeijeehledvueffhfejtdehgeegnecukfhppeduvdejrddtrddtrddupdefjedrheelrddugedvrdelieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpeduvdejrddtrddtrddupdhmrghilhhfrhhomhepoegtlhhgsehkrghougdrohhrgheqpdhnsggprhgtphhtthhopedupdhrtghpthhtohepghhrvghgkhhhsehlihhnuhigfhhouhhnuggrthhiohhnrdhorhhgpdgrmhhitheskhgvrhhnvghlrdhorhhgpdgrrhhnugesrghrnhgusgdruggvpdhvihhrthhurghlihiirghtihhonheslhhishhtshdrlhhinhhugidqfhhouhhnuggrthhiohhnrdhorhhgpdhlihhnuhigqdhkvghrnhgvlhesvhhgvghrrdhkvghrnhgvlhdrohhrghdpoffvtefjohhsthepmhhoheehvddpmhhouggvpehsmhhtphhouhht X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 11/14/22 17:18, Greg Kroah-Hartman wrote: > On Mon, Nov 14, 2022 at 05:03:40PM +0100, Cédric Le Goater wrote: >> On 11/14/22 09:57, Greg Kroah-Hartman wrote: >>> On Mon, Nov 14, 2022 at 09:07:52AM +0100, Cédric Le Goater wrote: >>>> When a virtio console port is initialized, it is registered as an hvc >>>> console using a virtual console number. If a KVM guest is started with >>>> multiple virtio console devices, the same vtermno (or virtual console >>>> number) can be used to allocate different hvc consoles, which leads to >>>> various communication problems later on. >>>> >>>> This is also reported in debugfs : >>>> >>>> # grep vtermno /sys/kernel/debug/virtio-ports/* >>>> /sys/kernel/debug/virtio-ports/vport1p1:console_vtermno: 1 >>>> /sys/kernel/debug/virtio-ports/vport2p1:console_vtermno: 1 >>>> /sys/kernel/debug/virtio-ports/vport3p1:console_vtermno: 2 >>>> /sys/kernel/debug/virtio-ports/vport4p1:console_vtermno: 3 >>>> >>>> Fix the issue with an atomic variable and start the first console >>>> number at 1 as it is today. >>>> >>>> Signed-off-by: Cédric Le Goater >>>> --- >>>> drivers/char/virtio_console.c | 8 ++++---- >>>> 1 file changed, 4 insertions(+), 4 deletions(-) >>>> >>>> diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c >>>> index 9fa3c76a267f..253574f41e57 100644 >>>> --- a/drivers/char/virtio_console.c >>>> +++ b/drivers/char/virtio_console.c >>>> @@ -58,12 +58,13 @@ struct ports_driver_data { >>>> * We also just assume the first console being initialised was >>>> * the first one that got used as the initial console. >>>> */ >>>> - unsigned int next_vtermno; >>>> + atomic_t next_vtermno; >>>> /* All the console devices handled by this driver */ >>>> struct list_head consoles; >>>> }; >>>> -static struct ports_driver_data pdrvdata = { .next_vtermno = 1}; >>>> + >>>> +static struct ports_driver_data pdrvdata = { .next_vtermno = ATOMIC_INIT(0) }; >>>> static DEFINE_SPINLOCK(pdrvdata_lock); >>>> static DECLARE_COMPLETION(early_console_added); >>>> @@ -1244,7 +1245,7 @@ static int init_port_console(struct port *port) >>>> * pointers. The final argument is the output buffer size: we >>>> * can do any size, so we put PAGE_SIZE here. >>>> */ >>>> - port->cons.vtermno = pdrvdata.next_vtermno; >>>> + port->cons.vtermno = atomic_inc_return(&pdrvdata.next_vtermno); >>> >>> Why not use a normal ida/idr structure here? >> >> yes that works. >> >>> And why is this never decremented? >> >> The driver would then need to track the id allocation ... > > That's what an ida/idr does. > >>> and finally, why not use the value that created the "vportN" number >>> instead? >> >> yes. we could also encode the tuple (vdev->index, port) using a bitmask, > > No need for that, you already have a unique number in the name above, > why not use that? > >> possibly using 'max_nr_ports' to reduce the port width. > > Why is that an issue? Maybe I am confused as to what this magic > "vtermno" is here. Who uses it and why is the vportN number not > sufficient? A virtio console device can have multiple ports each being a /dev/hvcX exposed in the guest OS. The "vportN" prefix identifies the virtio device : # grep vtermno /sys/kernel/debug/virtio-ports/* /sys/kernel/debug/virtio-ports/vport1p0:console_vtermno: 2 /sys/kernel/debug/virtio-ports/vport1p1:console_vtermno: 3 /sys/kernel/debug/virtio-ports/vport1p2:console_vtermno: 4 /sys/kernel/debug/virtio-ports/vport1p3:console_vtermno: 5 /sys/kernel/debug/virtio-ports/vport2p0:console_vtermno: 1 /sys/kernel/debug/virtio-ports/vport2p1:console_vtermno: 6 /sys/kernel/debug/virtio-ports/vport2p2:console_vtermno: 7 /sys/kernel/debug/virtio-ports/vport2p3:console_vtermno: 8 and "pX" the port within in the device. The naming is a bit confusing. >> VIRTCONS_MAX_PORTS >> seems a bit big for this device and QEMU sets the #ports to 31. >> >> An ida might be simpler. One drawback is that an id can be reused for a >> different device/port tuple in case of an (unlikely) unplug/plug sequence. > > What's wrong with that? We do not have persistent device names from > within the kernel. Let's go with the ida then. Thanks, C.