License cleanup: add SPDX GPL-2.0 license identifier to files with no license
Many source files in the tree are missing licensing information, which
makes it harder for compliance tools to determine the correct license.
By default all files without license information are under the default
license of the kernel, which is GPL version 2.
Update the files which contain no license information with the 'GPL-2.0'
SPDX license identifier. The SPDX identifier is a legally binding
shorthand, which can be used instead of the full boiler plate text.
This patch is based on work done by Thomas Gleixner and Kate Stewart and
Philippe Ombredanne.
How this work was done:
Patches were generated and checked against linux-4.14-rc6 for a subset of
the use cases:
- file had no licensing information it it.
- file was a */uapi/* one with no licensing information in it,
- file was a */uapi/* one with existing licensing information,
Further patches will be generated in subsequent months to fix up cases
where non-standard license headers were used, and references to license
had to be inferred by heuristics based on keywords.
The analysis to determine which SPDX License Identifier to be applied to
a file was done in a spreadsheet of side by side results from of the
output of two independent scanners (ScanCode & Windriver) producing SPDX
tag:value files created by Philippe Ombredanne. Philippe prepared the
base worksheet, and did an initial spot review of a few 1000 files.
The 4.13 kernel was the starting point of the analysis with 60,537 files
assessed. Kate Stewart did a file by file comparison of the scanner
results in the spreadsheet to determine which SPDX license identifier(s)
to be applied to the file. She confirmed any determination that was not
immediately clear with lawyers working with the Linux Foundation.
Criteria used to select files for SPDX license identifier tagging was:
- Files considered eligible had to be source code files.
- Make and config files were included as candidates if they contained >5
lines of source
- File already had some variant of a license header in it (even if <5
lines).
All documentation files were explicitly excluded.
The following heuristics were used to determine which SPDX license
identifiers to apply.
- when both scanners couldn't find any license traces, file was
considered to have no license information in it, and the top level
COPYING file license applied.
For non */uapi/* files that summary was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 11139
and resulted in the first patch in this series.
If that file was a */uapi/* path one, it was "GPL-2.0 WITH
Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 WITH Linux-syscall-note 930
and resulted in the second patch in this series.
- if a file had some form of licensing information in it, and was one
of the */uapi/* ones, it was denoted with the Linux-syscall-note if
any GPL family license was found in the file or had no licensing in
it (per prior point). Results summary:
SPDX license identifier # files
---------------------------------------------------|------
GPL-2.0 WITH Linux-syscall-note 270
GPL-2.0+ WITH Linux-syscall-note 169
((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21
((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17
LGPL-2.1+ WITH Linux-syscall-note 15
GPL-1.0+ WITH Linux-syscall-note 14
((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5
LGPL-2.0+ WITH Linux-syscall-note 4
LGPL-2.1 WITH Linux-syscall-note 3
((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3
((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1
and that resulted in the third patch in this series.
- when the two scanners agreed on the detected license(s), that became
the concluded license(s).
- when there was disagreement between the two scanners (one detected a
license but the other didn't, or they both detected different
licenses) a manual inspection of the file occurred.
- In most cases a manual inspection of the information in the file
resulted in a clear resolution of the license that should apply (and
which scanner probably needed to revisit its heuristics).
- When it was not immediately clear, the license identifier was
confirmed with lawyers working with the Linux Foundation.
- If there was any question as to the appropriate license identifier,
the file was flagged for further research and to be revisited later
in time.
In total, over 70 hours of logged manual review was done on the
spreadsheet to determine the SPDX license identifiers to apply to the
source files by Kate, Philippe, Thomas and, in some cases, confirmation
by lawyers working with the Linux Foundation.
Kate also obtained a third independent scan of the 4.13 code base from
FOSSology, and compared selected files where the other two scanners
disagreed against that SPDX file, to see if there was new insights. The
Windriver scanner is based on an older version of FOSSology in part, so
they are related.
Thomas did random spot checks in about 500 files from the spreadsheets
for the uapi headers and agreed with SPDX license identifier in the
files he inspected. For the non-uapi files Thomas did random spot checks
in about 15000 files.
In initial set of patches against 4.14-rc6, 3 files were found to have
copy/paste license identifier errors, and have been fixed to reflect the
correct identifier.
Additionally Philippe spent 10 hours this week doing a detailed manual
inspection and review of the 12,461 patched files from the initial patch
version early this week with:
- a full scancode scan run, collecting the matched texts, detected
license ids and scores
- reviewing anything where there was a license detected (about 500+
files) to ensure that the applied SPDX license was correct
- reviewing anything where there was no detection but the patch license
was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied
SPDX license was correct
This produced a worksheet with 20 files needing minor correction. This
worksheet was then exported into 3 different .csv files for the
different types of files to be modified.
These .csv files were then reviewed by Greg. Thomas wrote a script to
parse the csv files and add the proper SPDX tag to the file, in the
format that the file expected. This script was further refined by Greg
based on the output to detect more types of files automatically and to
distinguish between header and source .c files (which need different
comment types.) Finally Greg ran the script using the .csv files to
generate the patches.
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-01 22:07:57 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifndef _LINUX_TYPES_H
|
|
|
|
#define _LINUX_TYPES_H
|
|
|
|
|
2012-10-13 17:46:48 +08:00
|
|
|
#define __EXPORTED_HEADERS__
|
|
|
|
#include <uapi/linux/types.h>
|
2009-02-08 13:30:25 +08:00
|
|
|
|
2009-02-06 23:17:58 +08:00
|
|
|
#ifndef __ASSEMBLY__
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#define DECLARE_BITMAP(name,bits) \
|
|
|
|
unsigned long name[BITS_TO_LONGS(bits)]
|
|
|
|
|
|
|
|
typedef __u32 __kernel_dev_t;
|
|
|
|
|
|
|
|
typedef __kernel_fd_set fd_set;
|
|
|
|
typedef __kernel_dev_t dev_t;
|
|
|
|
typedef __kernel_ino_t ino_t;
|
|
|
|
typedef __kernel_mode_t mode_t;
|
2011-07-27 05:04:15 +08:00
|
|
|
typedef unsigned short umode_t;
|
2012-05-19 22:25:23 +08:00
|
|
|
typedef __u32 nlink_t;
|
2005-04-17 06:20:36 +08:00
|
|
|
typedef __kernel_off_t off_t;
|
|
|
|
typedef __kernel_pid_t pid_t;
|
|
|
|
typedef __kernel_daddr_t daddr_t;
|
|
|
|
typedef __kernel_key_t key_t;
|
|
|
|
typedef __kernel_suseconds_t suseconds_t;
|
|
|
|
typedef __kernel_timer_t timer_t;
|
|
|
|
typedef __kernel_clockid_t clockid_t;
|
|
|
|
typedef __kernel_mqd_t mqd_t;
|
|
|
|
|
2006-10-01 14:27:11 +08:00
|
|
|
typedef _Bool bool;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
typedef __kernel_uid32_t uid_t;
|
|
|
|
typedef __kernel_gid32_t gid_t;
|
|
|
|
typedef __kernel_uid16_t uid16_t;
|
|
|
|
typedef __kernel_gid16_t gid16_t;
|
|
|
|
|
2007-10-29 13:11:28 +08:00
|
|
|
typedef unsigned long uintptr_t;
|
|
|
|
|
2015-11-20 19:12:21 +08:00
|
|
|
#ifdef CONFIG_HAVE_UID16
|
2005-04-17 06:20:36 +08:00
|
|
|
/* This is defined by include/asm-{arch}/posix_types.h */
|
|
|
|
typedef __kernel_old_uid_t old_uid_t;
|
|
|
|
typedef __kernel_old_gid_t old_gid_t;
|
|
|
|
#endif /* CONFIG_UID16 */
|
|
|
|
|
2008-02-08 20:21:24 +08:00
|
|
|
#if defined(__GNUC__)
|
2005-04-17 06:20:36 +08:00
|
|
|
typedef __kernel_loff_t loff_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The following typedefs are also protected by individual ifdefs for
|
|
|
|
* historical reasons:
|
|
|
|
*/
|
|
|
|
#ifndef _SIZE_T
|
|
|
|
#define _SIZE_T
|
|
|
|
typedef __kernel_size_t size_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SSIZE_T
|
|
|
|
#define _SSIZE_T
|
|
|
|
typedef __kernel_ssize_t ssize_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _PTRDIFF_T
|
|
|
|
#define _PTRDIFF_T
|
|
|
|
typedef __kernel_ptrdiff_t ptrdiff_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _TIME_T
|
|
|
|
#define _TIME_T
|
|
|
|
typedef __kernel_time_t time_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _CLOCK_T
|
|
|
|
#define _CLOCK_T
|
|
|
|
typedef __kernel_clock_t clock_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _CADDR_T
|
|
|
|
#define _CADDR_T
|
|
|
|
typedef __kernel_caddr_t caddr_t;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* bsd */
|
|
|
|
typedef unsigned char u_char;
|
|
|
|
typedef unsigned short u_short;
|
|
|
|
typedef unsigned int u_int;
|
|
|
|
typedef unsigned long u_long;
|
|
|
|
|
|
|
|
/* sysv */
|
|
|
|
typedef unsigned char unchar;
|
|
|
|
typedef unsigned short ushort;
|
|
|
|
typedef unsigned int uint;
|
|
|
|
typedef unsigned long ulong;
|
|
|
|
|
|
|
|
#ifndef __BIT_TYPES_DEFINED__
|
|
|
|
#define __BIT_TYPES_DEFINED__
|
|
|
|
|
|
|
|
typedef __u8 u_int8_t;
|
|
|
|
typedef __s8 int8_t;
|
|
|
|
typedef __u16 u_int16_t;
|
|
|
|
typedef __s16 int16_t;
|
|
|
|
typedef __u32 u_int32_t;
|
|
|
|
typedef __s32 int32_t;
|
|
|
|
|
|
|
|
#endif /* !(__BIT_TYPES_DEFINED__) */
|
|
|
|
|
|
|
|
typedef __u8 uint8_t;
|
|
|
|
typedef __u16 uint16_t;
|
|
|
|
typedef __u32 uint32_t;
|
|
|
|
|
2008-02-08 20:21:24 +08:00
|
|
|
#if defined(__GNUC__)
|
2005-04-17 06:20:36 +08:00
|
|
|
typedef __u64 uint64_t;
|
|
|
|
typedef __u64 u_int64_t;
|
|
|
|
typedef __s64 int64_t;
|
|
|
|
#endif
|
|
|
|
|
2010-10-27 05:21:10 +08:00
|
|
|
/* this is a special 64bit data type that is 8-byte aligned */
|
2008-01-31 19:57:36 +08:00
|
|
|
#define aligned_u64 __u64 __attribute__((aligned(8)))
|
2006-11-08 16:26:51 +08:00
|
|
|
#define aligned_be64 __be64 __attribute__((aligned(8)))
|
|
|
|
#define aligned_le64 __le64 __attribute__((aligned(8)))
|
2005-08-14 04:55:44 +08:00
|
|
|
|
2006-10-04 19:37:45 +08:00
|
|
|
/**
|
2005-04-17 06:20:36 +08:00
|
|
|
* The type used for indexing onto a disc or disc partition.
|
2006-10-04 19:37:45 +08:00
|
|
|
*
|
|
|
|
* Linux always considers sectors to be 512 bytes long independently
|
|
|
|
* of the devices real block size.
|
2008-12-12 16:51:16 +08:00
|
|
|
*
|
|
|
|
* blkcnt_t is the type of the inode's block count.
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
2009-06-19 14:08:50 +08:00
|
|
|
#ifdef CONFIG_LBDAF
|
2006-12-04 18:38:31 +08:00
|
|
|
typedef u64 sector_t;
|
|
|
|
typedef u64 blkcnt_t;
|
|
|
|
#else
|
2008-12-12 16:51:16 +08:00
|
|
|
typedef unsigned long sector_t;
|
2006-03-26 17:37:52 +08:00
|
|
|
typedef unsigned long blkcnt_t;
|
|
|
|
#endif
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
2015-02-13 07:01:22 +08:00
|
|
|
* The type of an index into the pagecache.
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
|
|
|
#define pgoff_t unsigned long
|
|
|
|
|
PCI: Add pci_bus_addr_t
David Ahern reported that d63e2e1f3df9 ("sparc/PCI: Clip bridge windows
to fit in upstream windows") fails to boot on sparc/T5-8:
pci 0000:06:00.0: reg 0x184: can't handle BAR above 4GB (bus address 0x110204000)
The problem is that sparc64 assumed that dma_addr_t only needed to hold DMA
addresses, i.e., bus addresses returned via the DMA API (dma_map_single(),
etc.), while the PCI core assumed dma_addr_t could hold *any* bus address,
including raw BAR values. On sparc64, all DMA addresses fit in 32 bits, so
dma_addr_t is a 32-bit type. However, BAR values can be 64 bits wide, so
they don't fit in a dma_addr_t. d63e2e1f3df9 added new checking that
tripped over this mismatch.
Add pci_bus_addr_t, which is wide enough to hold any PCI bus address,
including both raw BAR values and DMA addresses. This will be 64 bits
on 64-bit platforms and on platforms with a 64-bit dma_addr_t. Then
dma_addr_t only needs to be wide enough to hold addresses from the DMA API.
[bhelgaas: changelog, bugzilla, Kconfig to ensure pci_bus_addr_t is at
least as wide as dma_addr_t, documentation]
Fixes: d63e2e1f3df9 ("sparc/PCI: Clip bridge windows to fit in upstream windows")
Fixes: 23b13bc76f35 ("PCI: Fail safely if we can't handle BARs larger than 4GB")
Link: http://lkml.kernel.org/r/CAE9FiQU1gJY1LYrxs+ma5LCTEEe4xmtjRG0aXJ9K_Tsu+m9Wuw@mail.gmail.com
Link: http://lkml.kernel.org/r/1427857069-6789-1-git-send-email-yinghai@kernel.org
Link: https://bugzilla.kernel.org/show_bug.cgi?id=96231
Reported-by: David Ahern <david.ahern@oracle.com>
Tested-by: David Ahern <david.ahern@oracle.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: David S. Miller <davem@davemloft.net>
CC: stable@vger.kernel.org # v3.19+
2015-05-28 08:23:51 +08:00
|
|
|
/*
|
|
|
|
* A dma_addr_t can hold any valid DMA address, i.e., any address returned
|
|
|
|
* by the DMA API.
|
|
|
|
*
|
|
|
|
* If the DMA API only uses 32-bit addresses, dma_addr_t need only be 32
|
|
|
|
* bits wide. Bus addresses, e.g., PCI BARs, may be wider than 32 bits,
|
|
|
|
* but drivers do memory-mapped I/O to ioremapped kernel virtual addresses,
|
|
|
|
* so they don't care about the size of the actual bus addresses.
|
|
|
|
*/
|
2011-03-23 07:33:50 +08:00
|
|
|
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
|
|
|
typedef u64 dma_addr_t;
|
|
|
|
#else
|
|
|
|
typedef u32 dma_addr_t;
|
PCI: Add pci_bus_addr_t
David Ahern reported that d63e2e1f3df9 ("sparc/PCI: Clip bridge windows
to fit in upstream windows") fails to boot on sparc/T5-8:
pci 0000:06:00.0: reg 0x184: can't handle BAR above 4GB (bus address 0x110204000)
The problem is that sparc64 assumed that dma_addr_t only needed to hold DMA
addresses, i.e., bus addresses returned via the DMA API (dma_map_single(),
etc.), while the PCI core assumed dma_addr_t could hold *any* bus address,
including raw BAR values. On sparc64, all DMA addresses fit in 32 bits, so
dma_addr_t is a 32-bit type. However, BAR values can be 64 bits wide, so
they don't fit in a dma_addr_t. d63e2e1f3df9 added new checking that
tripped over this mismatch.
Add pci_bus_addr_t, which is wide enough to hold any PCI bus address,
including both raw BAR values and DMA addresses. This will be 64 bits
on 64-bit platforms and on platforms with a 64-bit dma_addr_t. Then
dma_addr_t only needs to be wide enough to hold addresses from the DMA API.
[bhelgaas: changelog, bugzilla, Kconfig to ensure pci_bus_addr_t is at
least as wide as dma_addr_t, documentation]
Fixes: d63e2e1f3df9 ("sparc/PCI: Clip bridge windows to fit in upstream windows")
Fixes: 23b13bc76f35 ("PCI: Fail safely if we can't handle BARs larger than 4GB")
Link: http://lkml.kernel.org/r/CAE9FiQU1gJY1LYrxs+ma5LCTEEe4xmtjRG0aXJ9K_Tsu+m9Wuw@mail.gmail.com
Link: http://lkml.kernel.org/r/1427857069-6789-1-git-send-email-yinghai@kernel.org
Link: https://bugzilla.kernel.org/show_bug.cgi?id=96231
Reported-by: David Ahern <david.ahern@oracle.com>
Tested-by: David Ahern <david.ahern@oracle.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: David S. Miller <davem@davemloft.net>
CC: stable@vger.kernel.org # v3.19+
2015-05-28 08:23:51 +08:00
|
|
|
#endif
|
2011-03-23 07:33:50 +08:00
|
|
|
|
2016-12-11 12:34:53 +08:00
|
|
|
typedef unsigned __bitwise gfp_t;
|
|
|
|
typedef unsigned __bitwise fmode_t;
|
2006-06-13 06:49:31 +08:00
|
|
|
|
2008-09-11 16:31:45 +08:00
|
|
|
#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
|
|
|
typedef u64 phys_addr_t;
|
|
|
|
#else
|
|
|
|
typedef u32 phys_addr_t;
|
|
|
|
#endif
|
|
|
|
|
2008-09-11 16:31:50 +08:00
|
|
|
typedef phys_addr_t resource_size_t;
|
|
|
|
|
2012-04-03 21:11:04 +08:00
|
|
|
/*
|
|
|
|
* This type is the placeholder for a hardware interrupt number. It has to be
|
|
|
|
* big enough to enclose whatever representation is used by a given platform.
|
|
|
|
*/
|
|
|
|
typedef unsigned long irq_hw_number_t;
|
|
|
|
|
2009-01-07 06:40:39 +08:00
|
|
|
typedef struct {
|
atomic_t: Remove volatile from atomic_t definition
When looking at a performance problem on PowerPC, I noticed some awful code
generation:
c00000000051fc98: 3b 60 00 01 li r27,1
...
c00000000051fca0: 3b 80 00 00 li r28,0
...
c00000000051fcdc: 93 61 00 70 stw r27,112(r1)
c00000000051fce0: 93 81 00 74 stw r28,116(r1)
c00000000051fce4: 81 21 00 70 lwz r9,112(r1)
c00000000051fce8: 80 01 00 74 lwz r0,116(r1)
c00000000051fcec: 7d 29 07 b4 extsw r9,r9
c00000000051fcf0: 7c 00 07 b4 extsw r0,r0
c00000000051fcf4: 7c 20 04 ac lwsync
c00000000051fcf8: 7d 60 f8 28 lwarx r11,0,r31
c00000000051fcfc: 7c 0b 48 00 cmpw r11,r9
c00000000051fd00: 40 c2 00 10 bne- c00000000051fd10
c00000000051fd04: 7c 00 f9 2d stwcx. r0,0,r31
c00000000051fd08: 40 c2 ff f0 bne+ c00000000051fcf8
c00000000051fd0c: 4c 00 01 2c isync
We create two constants, write them out to the stack, read them straight back
in and sign extend them. What a mess.
It turns out this bad code is a result of us defining atomic_t as a
volatile int.
We removed the volatile attribute from the powerpc atomic_t definition years
ago, but commit ea435467500612636f8f4fb639ff6e76b2496e4b (atomic_t: unify all
arch definitions) added it back in.
To dig up an old quote from Linus:
> The fact is, volatile on data structures is a bug. It's a wart in the C
> language. It shouldn't be used.
>
> Volatile accesses in *code* can be ok, and if we have "atomic_read()"
> expand to a "*(volatile int *)&(x)->value", then I'd be ok with that.
>
> But marking data structures volatile just makes the compiler screw up
> totally, and makes code for initialization sequences etc much worse.
And screw up it does :)
With the volatile removed, we see much more reasonable code generation:
c00000000051f5b8: 3b 60 00 01 li r27,1
...
c00000000051f5c0: 3b 80 00 00 li r28,0
...
c00000000051fc7c: 7c 20 04 ac lwsync
c00000000051fc80: 7c 00 f8 28 lwarx r0,0,r31
c00000000051fc84: 7c 00 d8 00 cmpw r0,r27
c00000000051fc88: 40 c2 00 10 bne- c00000000051fc98
c00000000051fc8c: 7f 80 f9 2d stwcx. r28,0,r31
c00000000051fc90: 40 c2 ff f0 bne+ c00000000051fc80
c00000000051fc94: 4c 00 01 2c isync
Six instructions less.
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-05-17 12:34:57 +08:00
|
|
|
int counter;
|
2009-01-07 06:40:39 +08:00
|
|
|
} atomic_t;
|
|
|
|
|
|
|
|
#ifdef CONFIG_64BIT
|
|
|
|
typedef struct {
|
atomic_t: Remove volatile from atomic_t definition
When looking at a performance problem on PowerPC, I noticed some awful code
generation:
c00000000051fc98: 3b 60 00 01 li r27,1
...
c00000000051fca0: 3b 80 00 00 li r28,0
...
c00000000051fcdc: 93 61 00 70 stw r27,112(r1)
c00000000051fce0: 93 81 00 74 stw r28,116(r1)
c00000000051fce4: 81 21 00 70 lwz r9,112(r1)
c00000000051fce8: 80 01 00 74 lwz r0,116(r1)
c00000000051fcec: 7d 29 07 b4 extsw r9,r9
c00000000051fcf0: 7c 00 07 b4 extsw r0,r0
c00000000051fcf4: 7c 20 04 ac lwsync
c00000000051fcf8: 7d 60 f8 28 lwarx r11,0,r31
c00000000051fcfc: 7c 0b 48 00 cmpw r11,r9
c00000000051fd00: 40 c2 00 10 bne- c00000000051fd10
c00000000051fd04: 7c 00 f9 2d stwcx. r0,0,r31
c00000000051fd08: 40 c2 ff f0 bne+ c00000000051fcf8
c00000000051fd0c: 4c 00 01 2c isync
We create two constants, write them out to the stack, read them straight back
in and sign extend them. What a mess.
It turns out this bad code is a result of us defining atomic_t as a
volatile int.
We removed the volatile attribute from the powerpc atomic_t definition years
ago, but commit ea435467500612636f8f4fb639ff6e76b2496e4b (atomic_t: unify all
arch definitions) added it back in.
To dig up an old quote from Linus:
> The fact is, volatile on data structures is a bug. It's a wart in the C
> language. It shouldn't be used.
>
> Volatile accesses in *code* can be ok, and if we have "atomic_read()"
> expand to a "*(volatile int *)&(x)->value", then I'd be ok with that.
>
> But marking data structures volatile just makes the compiler screw up
> totally, and makes code for initialization sequences etc much worse.
And screw up it does :)
With the volatile removed, we see much more reasonable code generation:
c00000000051f5b8: 3b 60 00 01 li r27,1
...
c00000000051f5c0: 3b 80 00 00 li r28,0
...
c00000000051fc7c: 7c 20 04 ac lwsync
c00000000051fc80: 7c 00 f8 28 lwarx r0,0,r31
c00000000051fc84: 7c 00 d8 00 cmpw r0,r27
c00000000051fc88: 40 c2 00 10 bne- c00000000051fc98
c00000000051fc8c: 7f 80 f9 2d stwcx. r28,0,r31
c00000000051fc90: 40 c2 ff f0 bne+ c00000000051fc80
c00000000051fc94: 4c 00 01 2c isync
Six instructions less.
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-05-17 12:34:57 +08:00
|
|
|
long counter;
|
2009-01-07 06:40:39 +08:00
|
|
|
} atomic64_t;
|
|
|
|
#endif
|
|
|
|
|
2010-07-03 01:41:14 +08:00
|
|
|
struct list_head {
|
|
|
|
struct list_head *next, *prev;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hlist_head {
|
|
|
|
struct hlist_node *first;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct hlist_node {
|
|
|
|
struct hlist_node *next, **pprev;
|
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct ustat {
|
|
|
|
__kernel_daddr_t f_tfree;
|
|
|
|
__kernel_ino_t f_tinode;
|
|
|
|
char f_fname[6];
|
|
|
|
char f_fpack[6];
|
|
|
|
};
|
|
|
|
|
2011-06-01 12:03:55 +08:00
|
|
|
/**
|
2012-06-27 15:07:19 +08:00
|
|
|
* struct callback_head - callback structure for use with RCU and task_work
|
2011-06-01 12:03:55 +08:00
|
|
|
* @next: next update requests in a list
|
|
|
|
* @func: actual update function to call after the grace period.
|
2015-11-06 10:44:18 +08:00
|
|
|
*
|
|
|
|
* The struct is aligned to size of pointer. On most architectures it happens
|
|
|
|
* naturally due ABI requirements, but some architectures (like CRIS) have
|
|
|
|
* weird ABI and we need to ask it explicitly.
|
|
|
|
*
|
2017-02-03 03:40:15 +08:00
|
|
|
* The alignment is required to guarantee that bit 0 of @next will be
|
2015-11-06 10:44:18 +08:00
|
|
|
* clear under normal conditions -- as long as we use call_rcu(),
|
|
|
|
* call_rcu_bh(), call_rcu_sched(), or call_srcu() to queue callback.
|
|
|
|
*
|
|
|
|
* This guarantee is important for few reasons:
|
|
|
|
* - future call_rcu_lazy() will make use of lower bits in the pointer;
|
|
|
|
* - the structure shares storage spacer in struct page with @compound_head,
|
|
|
|
* which encode PageTail() in bit 0. The guarantee is needed to avoid
|
|
|
|
* false-positive PageTail().
|
2011-06-01 12:03:55 +08:00
|
|
|
*/
|
2012-06-27 15:07:19 +08:00
|
|
|
struct callback_head {
|
|
|
|
struct callback_head *next;
|
|
|
|
void (*func)(struct callback_head *head);
|
2015-11-06 10:44:18 +08:00
|
|
|
} __attribute__((aligned(sizeof(void *))));
|
2012-06-27 15:07:19 +08:00
|
|
|
#define rcu_head callback_head
|
2011-06-01 12:03:55 +08:00
|
|
|
|
2015-06-11 03:53:06 +08:00
|
|
|
typedef void (*rcu_callback_t)(struct rcu_head *head);
|
|
|
|
typedef void (*call_rcu_func_t)(struct rcu_head *head, rcu_callback_t func);
|
|
|
|
|
2009-02-06 23:17:58 +08:00
|
|
|
#endif /* __ASSEMBLY__ */
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif /* _LINUX_TYPES_H */
|