Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp2998646rwb; Mon, 3 Oct 2022 08:19:36 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6w84VUtgPFHA86q2TLN0MEwmKTdI96Y96mij8RzAg0OrtAfvs8KTm1P3gJipz+4JTenZst X-Received: by 2002:a17:907:a079:b0:770:78cb:6650 with SMTP id ia25-20020a170907a07900b0077078cb6650mr15198163ejc.515.1664810376197; Mon, 03 Oct 2022 08:19:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664810376; cv=none; d=google.com; s=arc-20160816; b=UIXapWvl7o43ph8TckPqbNoP1i+hZLynta47StkPRJkMDTndx/lDGMVKvHpOUGoYl4 fQ/HkIaPu+dKfe85ST4WeGd5WWbv7q0WAflcwvthYuoziYjbzXnYNbe1lCtlxifhkhXl cj5v2nhXqFXtGrGroe9TeqHWMSE7rNRFEpuw4jtqShIwvv0qRakqwUfxd+ck8tlJZ+bT 3RJ1RwLsH6aIfCqcnpRXG+/Zxd0t0MYn/8t5tgNNM+thCKXu0KxwOs1Vws/BEZmcvV6K n480uB8LTJqQmwxgOKSW6axSlOb9tn3b4OXUeEKzbmg16saqbQcO2cwwvWr+rubtxjW1 7DrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=fCXMG78Mq498Zqnn7Lm+s48q3EJRMLHwH5JGdcQySEg=; b=d9+j4PDfDFshowE0biKs7sWUCpJsiA2jVmQbMxEqnjRdujkeu5XJBMb+os9nenx3mM +pZFOecD1fzZAPYx2lIFsKYLyb8N8/ZKxlpJlxQnYdnUMfcvTAjwD72SMTgqGn/tXIMO N5yoUxraTcCWJKEbkKOTDel3fOaCLKUz73R9cnReEjMq+9sBR4nAEewDXt5Zs87Ye+Iv nKLhufpvC/q/pi9MjZYCxgee2AY8Ysj1wU7bL+jtzZYkZ3Z9JzFejevfEBUuNcoF2U6G xQKPZi0++P6S5zfH6Hb3ClwvawqodsCfBOoSjOKYKMxMaRYLCKbxCptz4S/wJ3RdT78I dkVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=2Pp1KEoR; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m29-20020a50d7dd000000b00458d1c48708si4171331edj.303.2022.10.03.08.19.07; Mon, 03 Oct 2022 08:19:36 -0700 (PDT) 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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=2Pp1KEoR; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230078AbiJCPFV (ORCPT + 99 others); Mon, 3 Oct 2022 11:05:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53042 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230087AbiJCPFS (ORCPT ); Mon, 3 Oct 2022 11:05:18 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85EB81400A; Mon, 3 Oct 2022 08:05:14 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 330D661132; Mon, 3 Oct 2022 15:05:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 14F02C433D6; Mon, 3 Oct 2022 15:05:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1664809513; bh=kQRY7ykuDbE0o51P8UlIlK+aCXBweDG/nc36XgImZeE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=2Pp1KEoROdEhqllwvsisChE7fLM6legHZc2Gh55GhMc68DvAEwW6aijJkqREMA5Pi FETIXJX5dZEP0im+US1hx67Hg7V2Hqi52BzwhzMVSNV8LcQIbi9YR2sqCRXrMJxd2J R9S1y6oRRUuNnYQtO5rJJMNzZ99OvnTaXpWxANhQ= Date: Mon, 3 Oct 2022 17:05:10 +0200 From: Greg Kroah-Hartman To: "Rafael J. Wysocki" Cc: Sakari Ailus , Andy Shevchenko , Heikki Krogerus , Bjorn Andersson , Prashant Malani , linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Daniel Scally Subject: Re: [PATCH v2 1/5] device property: Keep dev_fwnode() and dev_fwnode_const() separate Message-ID: References: <20220928105746.51208-1-andriy.shevchenko@linux.intel.com> <20220928105746.51208-2-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, 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 Mon, Oct 03, 2022 at 01:54:37PM +0200, Rafael J. Wysocki wrote: > On Fri, Sep 30, 2022 at 4:43 PM Greg Kroah-Hartman > wrote: > > > > On Fri, Sep 30, 2022 at 02:30:53PM +0000, Sakari Ailus wrote: > > > Hi Greg, > > > > > > On Wed, Sep 28, 2022 at 01:05:20PM +0200, Greg Kroah-Hartman wrote: > > > > On Wed, Sep 28, 2022 at 01:57:42PM +0300, Andy Shevchenko wrote: > > > > > It's not fully correct to take a const parameter pointer to a struct > > > > > and return a non-const pointer to a member of that struct. > > > > > > > > > > Instead, introduce a const version of the dev_fwnode() API which takes > > > > > and returns const pointers and use it where it's applicable. > > > > > > > > > > Suggested-by: Sakari Ailus > > > > > Fixes: aade55c86033 ("device property: Add const qualifier to device_get_match_data() parameter") > > > > > Signed-off-by: Andy Shevchenko > > > > > Acked-by: Heikki Krogerus > > > > > Reviewed-by: Sakari Ailus > > > > > --- > > > > > drivers/base/property.c | 11 +++++++++-- > > > > > include/linux/property.h | 3 ++- > > > > > 2 files changed, 11 insertions(+), 3 deletions(-) > > > > > > > > > > diff --git a/drivers/base/property.c b/drivers/base/property.c > > > > > index 4d6278a84868..699f1b115e0a 100644 > > > > > --- a/drivers/base/property.c > > > > > +++ b/drivers/base/property.c > > > > > @@ -17,13 +17,20 @@ > > > > > #include > > > > > #include > > > > > > > > > > -struct fwnode_handle *dev_fwnode(const struct device *dev) > > > > > +struct fwnode_handle *dev_fwnode(struct device *dev) > > > > > { > > > > > return IS_ENABLED(CONFIG_OF) && dev->of_node ? > > > > > of_fwnode_handle(dev->of_node) : dev->fwnode; > > > > > } > > > > > EXPORT_SYMBOL_GPL(dev_fwnode); > > > > > > > > > > +const struct fwnode_handle *dev_fwnode_const(const struct device *dev) > > > > > +{ > > > > > + return IS_ENABLED(CONFIG_OF) && dev->of_node ? > > > > > + of_fwnode_handle(dev->of_node) : dev->fwnode; > > > > > +} > > > > > +EXPORT_SYMBOL_GPL(dev_fwnode_const); > > > > > > > > Ick, no, this is a mess. > > > > > > > > Either always return a const pointer, or don't. Ideally always return a > > > > const pointer, so all we really need is: > > > > > > > > const struct fwnode_handle *dev_fwnode(const struct device *dev); > > > > > > > > right? > > > > > > > > Yes, it will take some unwinding backwards to get there, but please do > > > > that instead of having 2 different functions where the parameter type is > > > > part of the function name. This isn't the 1980's... > > > > > > The problem with this approach is that sometimes non-const fwnode_handles > > > are needed. On OF, for instance, anything that has something to do with > > > refcounting requires this. Software nodes as well. > > > > If they are writable, then yes, let's keep them writable, and not create > > two function paths where we have to pick and choose. > > > > > One option which I suggested earlier was to turn dev_fwnode() into a macro > > > and use C11 _Generic() to check whether the device is const or not. > > > > As much fun as that would be, I don't think it would work well. > > > > Although, maybe it would, have an example of how that would look? > > > > I ask as I just went through a large refactoring of the kobject layer to > > mark many things const * and I find it a bit "sad" that functions like > > this: > > static inline struct device *kobj_to_dev(const struct kobject *kobj) > > { > > return container_of(kobj, struct device, kobj); > > } > > have the ability to take a read-only pointer and spit out a writable one > > thanks to the pointer math in container_of() with no one being the > > wiser. > > Well, is this really a problem? > > After all, if an immutable structure is embedded in another one, that > doesn't automatically imply that the containing structure has to be > immutable too. Hence, a const pointer to the inner structure doesn't > automatically yield a const pointer to the outer one. That is true, but it's a _huge_ hint that we are throwing away here, sometimes without even really realizing it. Ideally, if you have a const * passed into container_of() you would get a const * back, and then, if you _really_ know what you are doing with it, feel free to cast it away. That cast would be a huge sign that "hey, something is happening here" and allow people to at least notice it, while today, we loose all of that. Let me play around with this a bit. In talking with the Rust Linux developers, a lot of "how do we know if this pointer is immutable or not" discussions happen. With many of our apis, right now we don't know that, and perhaps that should change as it would make things not necessarily more "safe", but more "obvious" as to what both the intent is, and what is actually happening to pointers at times. Especially in the mess that is kobjects and struct device where we cast pointers around with abandon :) thanks, greg k-h