linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: David Laight <David.Laight@ACULAB.COM>
To: 'Guo Ren' <guoren@kernel.org>
Cc: "linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
	"linux-s390@vger.kernel.org" <linux-s390@vger.kernel.org>,
	"linux-parisc@vger.kernel.org" <linux-parisc@vger.kernel.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"drew@beagleboard.org" <drew@beagleboard.org>,
	"anup@brainfault.org" <anup@brainfault.org>,
	"wangjunqiang@iscas.ac.cn" <wangjunqiang@iscas.ac.cn>,
	"x86@kernel.org" <x86@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-csky@vger.kernel.org" <linux-csky@vger.kernel.org>,
	"linux-mips@vger.kernel.org" <linux-mips@vger.kernel.org>,
	"palmer@dabbelt.com" <palmer@dabbelt.com>,
	"liush@allwinnertech.com" <liush@allwinnertech.com>,
	"sparclinux@vger.kernel.org" <sparclinux@vger.kernel.org>,
	"linux-riscv@lists.infradead.org"
	<linux-riscv@lists.infradead.org>,
	"linuxppc-dev@lists.ozlabs.org" <linuxppc-dev@lists.ozlabs.org>,
	"hch@lst.de" <hch@lst.de>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"wefu@redhat.com" <wefu@redhat.com>
Subject: RE: [PATCH V7 03/20] compat: consolidate the compat_flock{,64} definition
Date: Mon, 28 Feb 2022 12:36:26 +0000	[thread overview]
Message-ID: <75af91aff07c43f4afd1f1a024e23bd4@AcuMS.aculab.com> (raw)
In-Reply-To: <CAJF2gTQhFK55z4juC7uHpWmHsEXSOkbMyXeid6KsnhfPRo7wqg@mail.gmail.com>

From: Guo Ren
> Sent: 28 February 2022 12:13
> 
> On Mon, Feb 28, 2022 at 8:02 PM David Laight <David.Laight@aculab.com> wrote:
> >
> > From: Guo Ren
> > > Sent: 28 February 2022 11:52
> > >
> > > On Mon, Feb 28, 2022 at 2:40 PM David Laight <David.Laight@aculab.com> wrote:
> > > >
> > > > From: guoren@kernel.org
> > > > > Sent: 27 February 2022 16:28
> > > > >
> > > > > From: Christoph Hellwig <hch@lst.de>
> > > > >
> > > > > Provide a single common definition for the compat_flock and
> > > > > compat_flock64 structures using the same tricks as for the native
> > > > > variants.  Another extra define is added for the packing required on
> > > > > x86.
> > > > ...
> > > > > diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h
> > > > ...
> > > > >  /*
> > > > > - * IA32 uses 4 byte alignment for 64 bit quantities,
> > > > > - * so we need to pack this structure.
> > > > > + * IA32 uses 4 byte alignment for 64 bit quantities, so we need to pack the
> > > > > + * compat flock64 structure.
> > > > >   */
> > > > ...
> > > > > +#define __ARCH_NEED_COMPAT_FLOCK64_PACKED
> > > > >
> > > > >  struct compat_statfs {
> > > > >       int             f_type;
> > > > > diff --git a/include/linux/compat.h b/include/linux/compat.h
> > > > > index 1c758b0e0359..a0481fe6c5d5 100644
> > > > > --- a/include/linux/compat.h
> > > > > +++ b/include/linux/compat.h
> > > > > @@ -258,6 +258,37 @@ struct compat_rlimit {
> > > > >       compat_ulong_t  rlim_max;
> > > > >  };
> > > > >
> > > > > +#ifdef __ARCH_NEED_COMPAT_FLOCK64_PACKED
> > > > > +#define __ARCH_COMPAT_FLOCK64_PACK   __attribute__((packed))
> > > > > +#else
> > > > > +#define __ARCH_COMPAT_FLOCK64_PACK
> > > > > +#endif
> > > > ...
> > > > > +struct compat_flock64 {
> > > > > +     short           l_type;
> > > > > +     short           l_whence;
> > > > > +     compat_loff_t   l_start;
> > > > > +     compat_loff_t   l_len;
> > > > > +     compat_pid_t    l_pid;
> > > > > +#ifdef __ARCH_COMPAT_FLOCK64_PAD
> > > > > +     __ARCH_COMPAT_FLOCK64_PAD
> > > > > +#endif
> > > > > +} __ARCH_COMPAT_FLOCK64_PACK;
> > > > > +
> > > >
> > > > Provided compat_loff_t are correctly defined with __aligned__(4)
> > > See include/asm-generic/compat.h
> > >
> > > typedef s64 compat_loff_t;
> > >
> > > Only:
> > > #ifdef CONFIG_COMPAT_FOR_U64_ALIGNMENT
> > > typedef s64 __attribute__((aligned(4))) compat_s64;
> > >
> > > So how do you think compat_loff_t could be defined with __aligned__(4)?
> >
> > compat_loff_t should be compat_s64 not s64.
> >
> > The same should be done for all 64bit 'compat' types.
> Changing
> typedef s64 compat_loff_t;
> to
> typedef compat_s64 compat_loff_t;
> 
> should be another patch and it affects all architectures, I don't
> think we should involve it in this series.

Except that I think only x86 sets CONFIG_COMPAT_FOR_U64_ALIGNMENT.

> look at kernel/power/user.c:
> struct compat_resume_swap_area {
>         compat_loff_t offset;
>         u32 dev;
> } __packed;

That is a bug!
The size should be 16 bytes on most 32bit architectures.
So the compat code won't fault if the last 4 bytes aren't mapped
whereas the native 32bit version will fault.

Hopefully the compiler realises the on-stack item is actually
aligned and doesn't use byte loads and shifts on (eg) sparc64.

> I thnk keep "typedef s64 compat_loff_t;" is a sensible choice for
> COMPAT support patchset series.

But it is wrong :-)

compat_[su]64 exist so that compat syscalls that contain 64bit
values get the correct alignment.
Which is exactly what you have here.

AFAICT most of the uses of __packed in the kernel are wrong.
It should only be used (on a structure) if the structure might
be on a misaligned address.
This can happen in data for some network protocols.
It should not be used because the structure should have no holes.
(Especially in ones that don't have any holes.)

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

  reply	other threads:[~2022-02-28 12:37 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-27 16:28 [PATCH V7 00/20] riscv: compat: Add COMPAT mode support for rv64 guoren
2022-02-27 16:28 ` [PATCH V7 01/20] uapi: simplify __ARCH_FLOCK{,64}_PAD a little guoren
2022-02-27 16:28 ` [PATCH V7 02/20] uapi: always define F_GETLK64/F_SETLK64/F_SETLKW64 in fcntl.h guoren
2022-02-27 16:28 ` [PATCH V7 03/20] compat: consolidate the compat_flock{, 64} definition guoren
2022-02-28  6:40   ` [PATCH V7 03/20] compat: consolidate the compat_flock{,64} definition David Laight
2022-02-28 11:51     ` [PATCH V7 03/20] compat: consolidate the compat_flock{, 64} definition Guo Ren
2022-02-28 12:02       ` [PATCH V7 03/20] compat: consolidate the compat_flock{,64} definition David Laight
2022-02-28 12:13         ` [PATCH V7 03/20] compat: consolidate the compat_flock{, 64} definition Guo Ren
2022-02-28 12:36           ` David Laight [this message]
2022-02-28 12:51           ` Arnd Bergmann
2022-02-27 16:28 ` [PATCH V7 04/20] kconfig: Add SYSVIPC_COMPAT for all architectures guoren
2022-02-27 16:28 ` [PATCH V7 05/20] fs: stat: compat: Add __ARCH_WANT_COMPAT_STAT guoren
2022-02-27 16:28 ` [PATCH V7 06/20] asm-generic: compat: Cleanup duplicate definitions guoren
2022-02-27 16:28 ` [PATCH V7 07/20] syscalls: compat: Fix the missing part for __SYSCALL_COMPAT guoren
2022-02-27 16:28 ` [PATCH V7 08/20] riscv: Fixup difference with defconfig guoren
2022-02-27 16:28 ` [PATCH V7 09/20] riscv: compat: Add basic compat data type implementation guoren
2022-02-27 16:28 ` [PATCH V7 10/20] riscv: compat: Re-implement TASK_SIZE for COMPAT_32BIT guoren
2022-02-27 16:28 ` [PATCH V7 11/20] riscv: compat: syscall: Add compat_sys_call_table implementation guoren
2022-02-27 16:28 ` [PATCH V7 12/20] riscv: compat: syscall: Add entry.S implementation guoren
2022-02-27 16:28 ` [PATCH V7 13/20] riscv: compat: process: Add UXL_32 support in start_thread guoren
2022-03-11  2:38   ` Guo Ren
2022-03-11 13:37     ` Ben Dooks
2022-03-12  2:13       ` Guo Ren
2022-03-12  8:36         ` Arnd Bergmann
2022-03-12 12:46           ` Guo Ren
2022-02-27 16:28 ` [PATCH V7 14/20] riscv: compat: Add elf.h implementation guoren
2022-03-10 10:06   ` Guo Ren
2022-02-27 16:28 ` [PATCH V7 15/20] riscv: compat: Add hw capability check for elf guoren
2022-02-27 16:28 ` [PATCH V7 16/20] riscv: compat: vdso: Add COMPAT_VDSO base code implementation guoren
2022-02-27 16:28 ` [PATCH V7 17/20] riscv: compat: vdso: Add setup additional pages implementation guoren
2022-02-27 16:28 ` [PATCH V7 18/20] riscv: compat: signal: Add rt_frame implementation guoren
2022-02-27 16:28 ` [PATCH V7 19/20] riscv: compat: ptrace: Add compat_arch_ptrace implement guoren
2022-02-27 16:28 ` [PATCH V7 20/20] riscv: compat: Add COMPAT Kbuild skeletal support guoren
2022-03-07 15:23 ` [PATCH V7 00/20] riscv: compat: Add COMPAT mode support for rv64 Heiko Stübner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=75af91aff07c43f4afd1f1a024e23bd4@AcuMS.aculab.com \
    --to=david.laight@aculab.com \
    --cc=anup@brainfault.org \
    --cc=arnd@arndb.de \
    --cc=drew@beagleboard.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=guoren@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-csky@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-parisc@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=liush@allwinnertech.com \
    --cc=palmer@dabbelt.com \
    --cc=sparclinux@vger.kernel.org \
    --cc=wangjunqiang@iscas.ac.cn \
    --cc=wefu@redhat.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).