Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp272983pxm; Wed, 2 Mar 2022 15:07:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJxXk7NOjPalsmhFWR+sgeGLQCpBlXBzdT98S9g3mKCJER10pRRTUTt4fiJjyl/CSuaCjpSp X-Received: by 2002:a17:902:ec90:b0:151:a632:7ebb with SMTP id x16-20020a170902ec9000b00151a6327ebbmr1195446plg.154.1646262473015; Wed, 02 Mar 2022 15:07:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646262473; cv=none; d=google.com; s=arc-20160816; b=EiUkfcI8qlr2SyEc59d/Je7cDPVCK0lld7imzjS5V2IsGNbG18CsJyLqJEn8vtyM5t aCRbAn51wAfE88asVAugQHv+gmmVwWFxqnxR6MbyVynMytcofSlGsKJ8zAcD19QyrXP9 wzpnUztuvim4L6qTTMcG6J9TiQoOKp+YTXgsVcgmG2S+Ol/hStnWiOxARY8SwDrZfXhN 54hG3A8ItCesZeUyKJoeYxEQwaWwQnuzfxDD1qUo19bbgABba/UzmbbooL26q0uhlons oGyaVK1ti8W0k7kAdgZ4BRHFS29e6fKvE+b1t1UvLv0Y4ThG+oWYOitrDGhuXKY/U+Bq 3F7Q== 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:dkim-signature:dkim-filter; bh=Hb0MichcGnKy9W7QnftN3HlYDH5eIZ2HR+Yd+eYl9oA=; b=GN2fSiA1VFuoJfSEDiYRt0LDlZFWE9MhLKJQ3gPWkSdsqKTIsdNDtbH+pNyuB/fFSn ZmrNDJQaw3LnX/jR6GEvOn5z4IFwRyZa4a65TWFnzROahDGWIvbudVYr9mDXvx91tL1Q wpHot90cB9er+E9CrCiJJTR5P8UZJpVNN6tEVZwTJ8WRTa5F70iTxEw95vQaaMH0zu7o Pamck/sx9R/AOgbLwvrXbVpHdRWxA9E2QGAtjjwYFQ6g4ArHFRUa09aPatV6cW/YcaHE pHogiyUl+1Cphtsa167Trc/C1eXv3dlau88kBL98aY4hzVFY38fYAlxzOLIYwel5HqAW NB+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=bFjfT1E6; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id kb17-20020a17090ae7d100b001bf0b01f820si354180pjb.132.2022.03.02.15.07.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Mar 2022 15:07:53 -0800 (PST) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=bFjfT1E6; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 8C34A25C59; Wed, 2 Mar 2022 14:49:02 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244741AbiCBSuB (ORCPT + 99 others); Wed, 2 Mar 2022 13:50:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235844AbiCBSuA (ORCPT ); Wed, 2 Mar 2022 13:50:00 -0500 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 277564550B; Wed, 2 Mar 2022 10:49:16 -0800 (PST) Received: from [192.168.1.17] (unknown [192.182.151.181]) by linux.microsoft.com (Postfix) with ESMTPSA id A7F0C20B7178; Wed, 2 Mar 2022 10:49:15 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com A7F0C20B7178 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1646246955; bh=Hb0MichcGnKy9W7QnftN3HlYDH5eIZ2HR+Yd+eYl9oA=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=bFjfT1E6FBhRudcO9bsU0kWiQq+tCxD9tzPSPXt6V87OZkcG7FiM41ymquDeblajJ MsTrs8MyE17bSEKYptulAKHcZ19W7uyZXHVXn063U1tectcIlGMij0McLJtBzQVSWx x4wIQoJAB1zLVjem1H089/lBHs3RxHl/wbBtVVBU= Message-ID: <6ac1dd87-3c78-66ca-c526-d1f6cf253400@linux.microsoft.com> Date: Wed, 2 Mar 2022 10:49:15 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.6.1 Subject: Re: [PATCH v3 02/30] drivers: hv: dxgkrnl: Driver initialization and loading Content-Language: en-US To: Wei Liu , Greg KH Cc: kys@microsoft.com, haiyangz@microsoft.com, sthemmin@microsoft.com, linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org, spronovo@microsoft.com, spronovo@linux.microsoft.com References: <719fe06b7cbe9ac12fa4a729e810e3383ab421c1.1646163378.git.iourit@linux.microsoft.com> <739cf89e71ff72436d7ca3f846881dfb45d07a6a.1646163378.git.iourit@linux.microsoft.com> <20220301222321.yradz24nuyhzh7om@liuwe-devbox-debian-v2> <20220302115334.wemdkznokszlzcpe@liuwe-devbox-debian-v2> From: Iouri Tarassov In-Reply-To: <20220302115334.wemdkznokszlzcpe@liuwe-devbox-debian-v2> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,NICE_REPLY_A,RDNS_NONE,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL autolearn=no 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 3/2/2022 3:53 AM, Wei Liu wrote: > On Wed, Mar 02, 2022 at 08:53:15AM +0100, Greg KH wrote: > > On Tue, Mar 01, 2022 at 10:23:21PM +0000, Wei Liu wrote: > > > > > +struct dxgglobal *dxgglobal; > > > > > > > > No, make this per-device, NEVER have a single device for your driver. > > > > The Linux driver model makes it harder to do it this way than to do it > > > > correctly. Do it correctly please and have no global structures like > > > > this. > > > > > > > > > > This may not be as big an issue as you thought. The device discovery is > > > still done via the normal VMBus probing routine. For all intents and > > > purposes the dxgglobal structure can be broken down into per device > > > fields and a global structure which contains the protocol versioning > > > information -- my understanding is there will always be a global > > > structure to hold information related to the backend, regardless of how > > > many devices there are. > > > > Then that is wrong and needs to be fixed. Drivers should almost never > > have any global data, that is not how Linux drivers work. What happens > > when you get a second device in your system for this? Major rework > > would have to happen and the code will break. Handle that all now as it > > takes less work to make this per-device than it does to have a global > > variable. > > > > It is perhaps easier to draw parallel from an existing driver. I feel > like we're talking past each other. > > Let's look at drivers/iommu/intel/iommu.c. There are a bunch of lists > like `static LIST_HEAD(dmar_rmrr_units)`. During the probing phase, new > units will be added to the list. I this the current code is following > this model. dxgglobal fulfills the role of a list. > > Setting aside the question of whether it makes sense to keep a copy of > the per-VM state in each device instance, I can see the code be changed > to: > > struct mutex device_mutex; /* split out from dxgglobal */ > static LIST_HEAD(dxglist); > > /* Rename struct dxgglobal to struct dxgstate */ > struct dxgstate { > struct list_head dxglist; /* link for dxglist */ > /* ... original fields sans device_mutex */ > } > > /* > * Provide a bunch of helpers manipulate the list. Called in probe / > * remove etc. > */ > struct dxgstate *find_dxgstate(...); > void remove_dxgstate(...); > int add_dxgstate(...); > > This model is well understood and used in tree. It is just that it > doesn't provide much value in doing this now since the list will only > contain one element. I hope that you're not saying we cannot even use a > per-module pointer to quickly get the data structure we want to use, > right? > > Are you suggesting Iouri use dev_set_drvdata to stash the dxgstate > into the device object? I think that can be done too. > > The code can be changed as: > > /* Rename struct dxgglobal to dxgstate and remove unneeded fields */ > struct dxgstate { ... }; > > static int dxg_probe_vmbus(...) { > > /* probe successfully */ > > struct dxgstate *state = kmalloc(...); > /* Fill in dxgstate with information from backend */ > > /* hdev->dev is the device object from the core driver framework */ > dev_set_drvdata(&hdev->dev, state); > } > > static int dxg_remove_vmbus(...) { > /* Normal stuff here ...*/ > > struct dxgstate *state = dev_get_drvdata(...); > dev_set_drvdata(..., NULL); > kfree(state); > } > > /* In all other functions */ > void do_things(...) { > struct dxgstate *state = dev_get_drvdata(...); > > /* Use state in place of where dxgglobal was needed */ > > } > > Iouri, notice this doesn't change anything regarding how userspace is > designed. This is about how kernel organises its data. > > I hope what I wrote above can bring our understanding closer. > > Thanks, > Wei. I can certainly remove dxgglobal and keep theĀ  pointer to the global state in the device object. This will require passing of the global pointer to all functions, which need to access it. Maybe my understanding of the Greg's suggestion was not correct. I thought the suggestion was to have multiple /dev/dxgN devices (one per virtual compute device). This would change how the user mode clients enumerate and communicate with compute devices. Thanks Iouri