From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753386AbbCIPa5 (ORCPT ); Mon, 9 Mar 2015 11:30:57 -0400 Received: from mail-lb0-f177.google.com ([209.85.217.177]:41627 "EHLO mail-lb0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750930AbbCIPay (ORCPT ); Mon, 9 Mar 2015 11:30:54 -0400 MIME-Version: 1.0 In-Reply-To: <20150309152822.GA21219@gmail.com> References: <1425912738-559-1-git-send-email-dvlasenk@redhat.com> <20150309145844.GA19511@gmail.com> <20150309152822.GA21219@gmail.com> From: Andy Lutomirski Date: Mon, 9 Mar 2015 08:30:32 -0700 Message-ID: Subject: Re: [PATCH 1/2] move offsetofend() from vfio.h to stddef.h To: Ingo Molnar Cc: Denys Vlasenko , Denys Vlasenko , Linus Torvalds , Steven Rostedt , Borislav Petkov , "H. Peter Anvin" , Oleg Nesterov , Frederic Weisbecker , Alexei Starovoitov , Will Drewry , Kees Cook , X86 ML , Linux Kernel Mailing List Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Mar 9, 2015 at 8:28 AM, Ingo Molnar wrote: > > * Denys Vlasenko wrote: > >> On Mon, Mar 9, 2015 at 3:58 PM, Ingo Molnar wrote: >> >> -/** >> >> - * offsetofend(TYPE, MEMBER) >> >> - * >> >> - * @TYPE: The type of the structure >> >> - * @MEMBER: The member within the structure to get the end offset of >> >> - * >> >> - * Simple helper macro for dealing with variable sized structures passed >> >> - * from user space. This allows us to easily determine if the provided >> >> - * structure is sized to include various fields. >> >> - */ >> >> -#define offsetofend(TYPE, MEMBER) \ >> >> - (offsetof(TYPE, MEMBER) + sizeof(((TYPE *)0)->MEMBER)) >> > >> > So I like it, and because it is not particularly trivial when to use >> > this primitive it was explained nicely in a description in the vfio.h >> > version. >> > >> > But you lost that nice description during the code move!! >> >> That description was clearly specific to how that macro is used in >> drivers/vfio/*.c, along the lines of >> >> minsz = offsetofend(struct vfio_eeh_pe_op, op); > > Hm, but here 'minsz' == sizeof(struct vfio_eeh_pe_op), so the vfio > usage does not seem to be justified. > >> if (copy_from_user(&op, (void __user *)arg, minsz)) >> return -EFAULT; >> if (op.argsz < minsz || op.flags) >> return -EINVAL; >> >> But the macro is generic, it has many other uses besides this one. > > So I might be missing something, but what generic uses does it have, > beyond structures that have some rare size related weirdness, such as > alignment attributes? In 99% of the cases: > > sizeof(struct) == offsetofend(struct, last_member) > > right? struct foo { u64 a; char b; }; sizeof(struct foo) will be 16, but offsetofend(struct foo, b) will be 9 on most platforms, right? --Andy