Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp428647pxb; Sat, 10 Apr 2021 07:18:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw6KiKXT08A6IflGDztQEzqQywFEkpIxV6P9wcLrJJEIBfhFVj8qLSRNkFrInGcVfogHJZ5 X-Received: by 2002:a17:906:3952:: with SMTP id g18mr20447682eje.104.1618064327618; Sat, 10 Apr 2021 07:18:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618064327; cv=none; d=google.com; s=arc-20160816; b=izIoi3uufbuaUr/aSr/cC5NxJTP8yGiPrfXGiEvBVDHyakFMYJXJF5eSm0pCeXJfG9 c85wpYTnbDmVUzbwTsnlVvBztk9B4ZTvLv0NHCoxNigwQ726qpPUmiXunZ8mHdcbT1F6 c9htCXMNHlzr8F0/WZVEW3uh859qpOBTRgFfUG62MZFi4HRcHmfbWkbbUzhwOlH5sMu1 bwnvLUAmBHFCmyYNfCPFhXowQ98hQJm90TSOKbsBaa05jiBxCLFZ3xODjEIn9wE94lva 20KxQSD8ASURfYrPqz1MwfytNGt2hu0VmgwkPyfF6yr2qYcdoxGDyyMOa7I/CdFQNsPv ceHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :mime-version:accept-language:in-reply-to:references:message-id:date :thread-index:thread-topic:subject:cc:to:from; bh=sjH+6OCY7Nu70u2oTG2sUuPHeP0dKv9AdltD8H83Wb0=; b=Nue9lLYwuTqtQrZEc5sm5UKzav4KAF6CCaNgEVBVH065aJ4ARhGM+l/bY6KZRzbhYO Bj4WhXU5h6ztcM1nG+STSw3dvNFp4yRp+PdxMmke3aFv/johm2W442lDUGjdnoEKau55 LPZpP030GB9NFx9Zj7+1fQgzmtaadfZ1FP5rq89/Gw1MicUooIba4x4IzR1KWLkqq+eP 7w6a0lN8Iq158kirk3q8O/mpFu+gRo9E4RpGxI/lVbwsbpSldHe3+sruQx/4/g/Pulfr TTfpZeRhrtyX/hhRBU2Yr2l8yXixgYSobyyeT4h8k0Wl4f2dexGrX9qAXDL1QfBXzyDR A/4g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=aculab.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h18si4261906edq.365.2021.04.10.07.18.21; Sat, 10 Apr 2021 07:18:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=aculab.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234733AbhDJORX convert rfc822-to-8bit (ORCPT + 99 others); Sat, 10 Apr 2021 10:17:23 -0400 Received: from eu-smtp-delivery-151.mimecast.com ([185.58.85.151]:53205 "EHLO eu-smtp-delivery-151.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234392AbhDJORX (ORCPT ); Sat, 10 Apr 2021 10:17:23 -0400 Received: from AcuMS.aculab.com (156.67.243.121 [156.67.243.121]) (Using TLS) by relay.mimecast.com with ESMTP id uk-mta-84-kCKo1-18OZuYsleNdk-yPA-1; Sat, 10 Apr 2021 15:17:06 +0100 X-MC-Unique: kCKo1-18OZuYsleNdk-yPA-1 Received: from AcuMS.Aculab.com (fd9f:af1c:a25b:0:994c:f5c2:35d6:9b65) by AcuMS.aculab.com (fd9f:af1c:a25b:0:994c:f5c2:35d6:9b65) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 10 Apr 2021 15:17:05 +0100 Received: from AcuMS.Aculab.com ([fe80::994c:f5c2:35d6:9b65]) by AcuMS.aculab.com ([fe80::994c:f5c2:35d6:9b65%12]) with mapi id 15.00.1497.012; Sat, 10 Apr 2021 15:17:05 +0100 From: David Laight To: 'Matthew Wilcox' , kernel test robot CC: "linux-mm@kvack.org" , "kbuild-all@lists.01.org" , "clang-built-linux@googlegroups.com" , "linux-kernel@vger.kernel.org" , "linux-fsdevel@vger.kernel.org" , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , "linuxppc-dev@lists.ozlabs.org" , "linux-arm-kernel@lists.infradead.org" , Jesper Dangaard Brouer , "David S. Miller" Subject: RE: Bogus struct page layout on 32-bit Thread-Topic: Bogus struct page layout on 32-bit Thread-Index: AQHXLbNopyewSd0HZEaZbqB5fscTXqqtw2Cg Date: Sat, 10 Apr 2021 14:17:04 +0000 Message-ID: References: <20210409185105.188284-3-willy@infradead.org> <202104100656.N7EVvkNZ-lkp@intel.com> <20210410024313.GX2531743@casper.infradead.org> In-Reply-To: <20210410024313.GX2531743@casper.infradead.org> Accept-Language: en-GB, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.202.205.107] MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=C51A453 smtp.mailfrom=david.laight@aculab.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: aculab.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Matthew Wilcox > Sent: 10 April 2021 03:43 > On Sat, Apr 10, 2021 at 06:45:35AM +0800, kernel test robot wrote: > > >> include/linux/mm_types.h:274:1: error: static_assert failed due to requirement > '__builtin_offsetof(struct page, lru) == __builtin_offsetof(struct folio, lru)' "offsetof(struct page, > lru) == offsetof(struct folio, lru)" > > FOLIO_MATCH(lru, lru); > > include/linux/mm_types.h:272:2: note: expanded from macro 'FOLIO_MATCH' > > static_assert(offsetof(struct page, pg) == offsetof(struct folio, fl)) > > Well, this is interesting. pahole reports: > > struct page { > long unsigned int flags; /* 0 4 */ > /* XXX 4 bytes hole, try to pack */ > union { > struct { > struct list_head lru; /* 8 8 */ > ... > struct folio { > union { > struct { > long unsigned int flags; /* 0 4 */ > struct list_head lru; /* 4 8 */ > > so this assert has absolutely done its job. > > But why has this assert triggered? Why is struct page layout not what > we thought it was? Turns out it's the dma_addr added in 2019 by commit > c25fff7171be ("mm: add dma_addr_t to struct page"). On this particular > config, it's 64-bit, and ppc32 requires alignment to 64-bit. So > the whole union gets moved out by 4 bytes. > > Unfortunately, we can't just fix this by putting an 'unsigned long pad' > in front of it. It still aligns the entire union to 8 bytes, and then > it skips another 4 bytes after the pad. > > We can fix it like this ... > > +++ b/include/linux/mm_types.h > @@ -96,11 +96,12 @@ struct page { > unsigned long private; > }; > struct { /* page_pool used by netstack */ > + unsigned long _page_pool_pad; > /** > * @dma_addr: might require a 64-bit value even on > * 32-bit architectures. > */ > - dma_addr_t dma_addr; > + dma_addr_t dma_addr __packed; > }; > struct { /* slab, slob and slub */ > union { > > but I don't know if GCC is smart enough to realise that dma_addr is now > on an 8 byte boundary and it can use a normal instruction to access it, > or whether it'll do something daft like use byte loads to access it. I'm betting it will use byte accesses. Checked - it does seem to use 4-byte accesses. (godbolt is rather short of 32 bit compilers...) > > We could also do: > > + dma_addr_t dma_addr __packed __aligned(sizeof(void *)); I wonder if __aligned(n) should be defined as __attribute__((packed,aligned(n)) I don't think you ever want the 'unpacked' variant. But explicitly reducing the alignment of single member is much better than the habit of marking the structure 'packed'. (Never mind the habit of adding __packed 'because we don't want the compiler to add random padding.) > > and I see pahole, at least sees this correctly: > > struct { > long unsigned int _page_pool_pad; /* 4 4 */ > dma_addr_t dma_addr __attribute__((__aligned__(4))); /* 8 8 */ > } __attribute__((__packed__)) __attribute__((__aligned__(4))); Is the attribute on the struct an artifact of pahole? It should just have an alignment of 4 without anything special. > > This presumably affects any 32-bit architecture with a 64-bit phys_addr_t > / dma_addr_t. Advice, please? Only those where a 64-bit value is 64-bit aligned. So that excludes x86 (which can have 64-bit dma) but includes sparc32 (which probably doesn't). David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)