Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp11285476imu; Mon, 31 Dec 2018 18:17:37 -0800 (PST) X-Google-Smtp-Source: AFSGD/WfALVr71llPqM1f+fh7axZPu2loE4fFE6ArOC9yKGHW6GGJCEGbpl23D03IusMpbmhV90x X-Received: by 2002:a62:43c1:: with SMTP id l62mr40710372pfi.22.1546309057603; Mon, 31 Dec 2018 18:17:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546309057; cv=none; d=google.com; s=arc-20160816; b=aJrXB7/I/k1DoI1oawqmsSehwhtxU9o8bcpLpKFVHlOQ7S+5lp3+K4inSoB5A5x/qQ bOPStqa6i6QlLadxLcPX4d6Rnw/lQ7twKp28/2Bi9SBBD/7AvAqLf6ext4YKUgRXc/UD VIc4Qpt46WhqfJ5pi8TquUIR3256X30Q1fL5/6zMm6ztYomvTR48b/GdhAWu6UgYMKdf VT3A0YuIoKFEXKH2RIB50zHRpY23mLwFHndPBHQ//mcfVDfm8Tzu5NBlMm+3I9m7YKQ5 5plgcYUXVYLQbJXcDwFQXP4RXXq1mZsfUaC9I2jBCe196d1OfvnAtMIA2f+hszOWUiDV w7hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:message-id :in-reply-to:subject:cc:to:from:date; bh=Iar2Q/K2ufTegPn1nrQXjuI5pT76MvDvPckGqK28sOg=; b=J1e1gunLQiMRh2gswAJ/LbDMmcv68fhxjve3voO+pTEbx8y5k0eE+q71IhtuyKQtT5 2JV3iE5nDv8fsKndK+aA8iXsDBXLzcOu2HWZ+au7bK6L2N2fb66GHYQKoEvJ1xzb7bp7 A4llr1Tx+ZPe6F7zESmokZdaik4Smyd4fG+HoaUH13J3V0QxQUARU9nsBYw+mMyRRTh0 97o8zEZQzTF5OvJxTUdOxIymjyeJvzKKQYSMjV7hdzUR0TnrnItvVO9bkmtqDVj1QOoj HZYG5KRGB63/i5zGRLt00cwEyezrCo7zHRtTYNV4lrOPillNWtTu8Oly9807Nv+F3Yot CRXQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w12si1578972ply.404.2018.12.31.18.17.19; Mon, 31 Dec 2018 18:17:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728101AbfAABG0 (ORCPT + 99 others); Mon, 31 Dec 2018 20:06:26 -0500 Received: from kvm5.telegraphics.com.au ([98.124.60.144]:58528 "EHLO kvm5.telegraphics.com.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728058AbfAABG0 (ORCPT ); Mon, 31 Dec 2018 20:06:26 -0500 Received: from localhost (localhost.localdomain [127.0.0.1]) by kvm5.telegraphics.com.au (Postfix) with ESMTP id 4624B29C55; Mon, 31 Dec 2018 20:06:21 -0500 (EST) Date: Tue, 1 Jan 2019 12:06:18 +1100 (AEDT) From: Finn Thain To: Arnd Bergmann cc: Greg Kroah-Hartman , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Linux Kernel Mailing List , linux-m68k , linuxppc-dev Subject: Re: [PATCH v8 18/25] powerpc: Implement nvram sync ioctl In-Reply-To: Message-ID: References: <3ba1dd965c1097e00463eafe7c7d5fd93bbed836.1545784679.git.fthain@telegraphics.com.au> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 31 Dec 2018, Arnd Bergmann wrote: > On Sun, Dec 30, 2018 at 8:25 AM Finn Thain wrote: > > > > On Sat, 29 Dec 2018, Arnd Bergmann wrote: > > > > > > --- a/drivers/char/nvram.c > > > > +++ b/drivers/char/nvram.c > > > > @@ -48,6 +48,10 @@ > > > > #include > > > > #include > > > > > > > > +#ifdef CONFIG_PPC > > > > +#include > > > > +#include > > > > +#endif > > > > > > > > static DEFINE_MUTEX(nvram_mutex); > > > > static DEFINE_SPINLOCK(nvram_state_lock); > > > > @@ -331,6 +335,37 @@ static long nvram_misc_ioctl(struct file *file, unsigned int cmd, > > > > long ret = -ENOTTY; > > > > > > > > switch (cmd) { > > > > +#ifdef CONFIG_PPC > > > > + case OBSOLETE_PMAC_NVRAM_GET_OFFSET: > > > > + pr_warn("nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n"); > > > > + /* fall through */ > > > > + case IOC_NVRAM_GET_OFFSET: > > > > + ret = -EINVAL; > > > > +#ifdef CONFIG_PPC_PMAC > > > > > > I think it would make be nicer here to keep the ppc bits in arch/ppc, > > > and instead add a .ioctl() callback to nvram_ops. > > > > > > > The problem with having an nvram_ops.ioctl() method is the code in the > > !PPC branch. That code would get duplicated because it's needed by > > both X86 and M68K, to implement the checksum ioctls. > > I was thinking you'd just have a common ioctl function that falls back > to the .ioctl callback for any unhandled commands like > > switch (cmd) { > case NVRAM_INIT: > ... > break; > case ...: > break; > default: > if (ops->ioctl) > return ops->ioctl(...); > return -EINVAL; > } > > Would that work? > There are no ioctls common to all architectures. So your example becomes, static long nvram_misc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { if (ops->ioctl) return ops->ioctl(file, cmd, arg); return -ENOTTY; } And then my objection is the same: m68k and x86 now have to duplicate their common ops->ioctl() implementation. Here's a compromise that avoids some code duplication. switch (cmd) { #if defined(CONFIG_X86) || defined(CONFIG_M68K) case NVRAM_INIT: ... break; case NVRAM_SETCKS: ... break; #endif default: if (ops->ioctl) return ops->ioctl(...); return -EINVAL; } But PPC64 and PPC32 also need to share their ops->ioctl() implementation. It's not clear to me where that code would go. Personally, I prefer the present patch series, or something similar, with it's symmetry between nvram.c and nvram.h: static long nvram_misc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret = -ENOTTY; switch (cmd) { #if defined(CONFIG_PPC) case OBSOLETE_PMAC_NVRAM_GET_OFFSET: ... case IOC_NVRAM_GET_OFFSET: ... break; case IOC_NVRAM_SYNC: ... break; #elif defined(CONFIG_X86) || defined(CONFIG_M68K) case NVRAM_INIT: ... break; case NVRAM_SETCKS: ... break; #endif } return ret; } ... versus the struct definition in nvram.h, struct nvram_ops { ssize_t (*read)(char *, size_t, loff_t *); ssize_t (*write)(char *, size_t, loff_t *); unsigned char (*read_byte)(int); void (*write_byte)(unsigned char, int); ssize_t (*get_size)(void); #if defined(CONFIG_PPC) long (*sync)(void); int (*get_partition)(int); #elif defined(CONFIG_X86) || defined(CONFIG_M68K) long (*set_checksum)(void); long (*initialize)(void); #endif }; Which of these alternatives do you prefer? Is there a better way? -- > Arnd >