Merge tag 'docs-4.15-2' of git://git.lwn.net/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 24 Nov 2017 07:01:32 +0000 (21:01 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 24 Nov 2017 07:01:32 +0000 (21:01 -1000)
Pull documentation updates from Jonathan Corbet:
 "A few late-arriving docs updates that have no real reason to wait.

  There's a new "Co-Developed-by" tag described by Greg, and a build
  enhancement from Willy to generate docs warnings during a kernel build
  (but only when additional warnings have been requested in general)"

* tag 'docs-4.15-2' of git://git.lwn.net/linux:
  Add optional check for bad kernel-doc comments
  Documentation: fix profile= options in kernel-parameters.txt
  documentation/svga.txt: update outdated file
  kokr/memory-barriers.txt: Fix typo in paring example
  kokr/memory-barriers/txt: Replace uses of "transitive"
  Documentation/process: add Co-Developed-by: tag for patches with multiple authors

1  2 
Documentation/admin-guide/kernel-parameters.txt
Documentation/translations/ko_KR/memory-barriers.txt
scripts/Makefile.build
scripts/kernel-doc

index 62436bd5f34a730b5e0c15e38138970605d9f8c0,a0532127807fba2454fba326740f6a0025ccc9d2..b44217290e5776ee616437bf8f1b86be93adac0a
                        It will be ignored when crashkernel=X,high is not used
                        or memory reserved is below 4G.
  
 +      crossrelease_fullstack
 +                      [KNL] Allow to record full stack trace in cross-release
 +
        cryptomgr.notests
                          [KNL] Disable crypto self-tests
  
                        The filter can be disabled or changed to another
                        driver later using sysfs.
  
 -      drm_kms_helper.edid_firmware=[<connector>:]<file>[,[<connector>:]<file>]
 +      drm.edid_firmware=[<connector>:]<file>[,[<connector>:]<file>]
                        Broken monitors, graphic adapters, KVMs and EDIDless
                        panels may send no or incorrect EDID data sets.
                        This parameter allows to specify an EDID data sets
        irqaffinity=    [SMP] Set the default irq affinity mask
                        The argument is a cpu list, as described above.
  
 +      irqchip.gicv2_force_probe=
 +                      [ARM, ARM64]
 +                      Format: <bool>
 +                      Force the kernel to look for the second 4kB page
 +                      of a GICv2 controller even if the memory range
 +                      exposed by the device tree is too small.
 +
        irqfixup        [HW]
                        When an interrupt is not handled search all handlers
                        for it. Intended to get systems with badly broken
        isapnp=         [ISAPNP]
                        Format: <RDP>,<reset>,<pci_scan>,<verbosity>
  
 -      isolcpus=       [KNL,SMP] Isolate CPUs from the general scheduler.
 -                      The argument is a cpu list, as described above.
 +      isolcpus=       [KNL,SMP] Isolate a given set of CPUs from disturbance.
 +                      [Deprecated - use cpusets instead]
 +                      Format: [flag-list,]<cpu-list>
 +
 +                      Specify one or more CPUs to isolate from disturbances
 +                      specified in the flag list (default: domain):
 +
 +                      nohz
 +                        Disable the tick when a single task runs.
 +                      domain
 +                        Isolate from the general SMP balancing and scheduling
 +                        algorithms. Note that performing domain isolation this way
 +                        is irreversible: it's not possible to bring back a CPU to
 +                        the domains once isolated through isolcpus. It's strongly
 +                        advised to use cpusets instead to disable scheduler load
 +                        balancing through the "cpuset.sched_load_balance" file.
 +                        It offers a much more flexible interface where CPUs can
 +                        move in and out of an isolated set anytime.
 +
 +                        You can move a process onto or off an "isolated" CPU via
 +                        the CPU affinity syscalls or cpuset.
 +                        <cpu number> begins at 0 and the maximum value is
 +                        "number of CPUs in system - 1".
 +
 +                      The format of <cpu-list> is described above.
  
 -                      This option can be used to specify one or more CPUs
 -                      to isolate from the general SMP balancing and scheduling
 -                      algorithms. You can move a process onto or off an
 -                      "isolated" CPU via the CPU affinity syscalls or cpuset.
 -                      <cpu number> begins at 0 and the maximum value is
 -                      "number of CPUs in system - 1".
  
 -                      This option is the preferred way to isolate CPUs. The
 -                      alternative -- manually setting the CPU mask of all
 -                      tasks in the system -- can cause problems and
 -                      suboptimal load balancer performance.
  
        iucv=           [HW,NET]
  
                        Built with CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y,
                        the default is off.
  
 -      kmemcheck=      [X86] Boot-time kmemcheck enable/disable/one-shot mode
 -                      Valid arguments: 0, 1, 2
 -                      kmemcheck=0 (disabled)
 -                      kmemcheck=1 (enabled)
 -                      kmemcheck=2 (one-shot mode)
 -                      Default: 2 (one-shot mode)
 -
        kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs.
                        Default is 0 (don't ignore, but inject #GP)
  
  
        noalign         [KNL,ARM]
  
 +      noaltinstr      [S390] Disables alternative instructions patching
 +                      (CPU alternatives feature).
 +
        noapic          [SMP,APIC] Tells the kernel to not make use of any
                        IOAPICs that may be present in the system.
  
                        allowed (eg kernel_enable_fpu()/kernel_disable_fpu()).
                        There is some performance impact when enabling this.
  
 +      ppc_tm=         [PPC]
 +                      Format: {"off"}
 +                      Disable Hardware Transactional Memory
 +
        print-fatal-signals=
                        [KNL] debug: print fatal signals
  
                        instead using the legacy FADT method
  
        profile=        [KNL] Enable kernel profiling via /proc/profile
-                       Format: [schedule,]<number>
+                       Format: [<profiletype>,]<number>
+                       Param: <profiletype>: "schedule", "sleep", or "kvm"
+                               [defaults to kernel profiling]
                        Param: "schedule" - profile schedule points.
-                       Param: <number> - step/bucket size as a power of 2 for
-                               statistical time based profiling.
                        Param: "sleep" - profile D-state sleeping (millisecs).
                                Requires CONFIG_SCHEDSTATS
                        Param: "kvm" - profile VM exits.
+                       Param: <number> - step/bucket size as a power of 2 for
+                               statistical time based profiling.
  
        prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk
                        before loading.
        rcutorture.stall_cpu_holdoff= [KNL]
                        Time to wait (s) after boot before inducing stall.
  
 +      rcutorture.stall_cpu_irqsoff= [KNL]
 +                      Disable interrupts while stalling if set.
 +
        rcutorture.stat_interval= [KNL]
                        Time (s) between statistics printk()s.
  
                        Used to run time disable IRQ_TIME_ACCOUNTING on any
                        platforms where RDTSC is slow and this accounting
                        can add overhead.
 +                      [x86] unstable: mark the TSC clocksource as unstable, this
 +                      marks the TSC unconditionally unstable at bootup and
 +                      avoids any further wobbles once the TSC watchdog notices.
  
        turbografx.map[2|3]=    [HW,JOY]
                        TurboGraFX parallel port interface
index ec3b46e27b7aa3aeca361d169bfda8ea09bf91fb,1f99331aeb3948fe91577781de24c3e2b2701dfd..0a0930ab415668a97ef649931f4af58c6fb2e2c1
@@@ -82,7 -82,7 +82,7 @@@ Documentation/memory-barriers.tx
       - SMP 배리어 짝맞추기.
       - 메모리 배리어 시퀀스의 예.
       - 읽기 메모리 배리어 vs 로드 예측.
-      - 이행성
+      - Multicopy 원자성.
  
   (*) 명시적 커널 배리어.
  
@@@ -656,6 -656,11 +656,11 @@@ Documentation/RCU/rcu_dereference.txt í
  해줍니다.
  
  
+ 데이터 의존성에 의해 제공되는 이 순서규칙은 이를 포함하고 있는 CPU 에
+ 지역적임을 알아두시기 바랍니다.  더 많은 정보를 위해선 "Multicopy 원자성"
+ 섹션을 참고하세요.
  데이터 의존성 배리어는 매우 중요한데, 예를 들어 RCU 시스템에서 그렇습니다.
  include/linux/rcupdate.h 의 rcu_assign_pointer() 와 rcu_dereference() 를
  참고하세요.  여기서 데이터 의존성 배리어는 RCU 로 관리되는 포인터의 타겟을 현재
@@@ -864,38 -869,10 +869,10 @@@ CPU 는 b 로부터의 로드 오퍼레
  주어진 if 문의 then 절과 else 절에게만 (그리고 이 두 절 내에서 호출되는
  함수들에게까지) 적용되지, 이 if 문을 뒤따르는 코드에는 적용되지 않습니다.
  
- 마지막으로, 컨트롤 의존성은 이행성 (transitivity) 을 제공하지 -않습니다-.  이건
- 'x' 와 'y' 가 둘 다 0 이라는 초기값을 가졌다는 가정 하의 두개의 예제로
- 보이겠습니다:
-       CPU 0                     CPU 1
-       =======================   =======================
-       r1 = READ_ONCE(x);        r2 = READ_ONCE(y);
-       if (r1 > 0)               if (r2 > 0)
-         WRITE_ONCE(y, 1);         WRITE_ONCE(x, 1);
-       assert(!(r1 == 1 && r2 == 1));
- 이 두 CPU 예제에서 assert() 의 조건은 항상 참일 것입니다.  그리고, 만약 컨트롤
- 의존성이 이행성을 (실제로는 그러지 않지만) 보장한다면, 다음의 CPU 가 추가되어도
- 아래의 assert() 조건은 참이 될것입니다:
  
-       CPU 2
-       =====================
-       WRITE_ONCE(x, 2);
+ 컨트롤 의존성에 의해 제공되는 이 순서규칙은 이를 포함하고 있는 CPU 에
+ 지역적입니다.  더 많은 정보를 위해선 "Multicopy 원자성" 섹션을 참고하세요.
  
-       assert(!(r1 == 2 && r2 == 1 && x == 2)); /* FAILS!!! */
- 하지만 컨트롤 의존성은 이행성을 제공하지 -않기- 때문에, 세개의 CPU 예제가 실행
- 완료된 후에 위의 assert() 의 조건은 거짓으로 평가될 수 있습니다.  세개의 CPU
- 예제가 순서를 지키길 원한다면, CPU 0 와 CPU 1 코드의 로드와 스토어 사이, "if"
- 문 바로 다음에 smp_mb()를 넣어야 합니다.  더 나아가서, 최초의 두 CPU 예제는
- 매우 위험하므로 사용되지 않아야 합니다.
- 이 두개의 예제는 다음 논문:
- http://www.cl.cam.ac.uk/users/pes20/ppc-supplemental/test6.pdf 와
- 이 사이트: https://www.cl.cam.ac.uk/~pes20/ppcmem/index.html 에 나온 LB 와 WWC
- 리트머스 테스트입니다.
  
  요약하자면:
  
  
    (*) 컨트롤 의존성은 보통 다른 타입의 배리어들과 짝을 맞춰 사용됩니다.
  
-   (*) 컨트롤 의존성은 이행성을 제공하지 -않습니다-.  이행성이 필요하다면,
-       smp_mb() 를 사용하세요.
+   (*) 컨트롤 의존성은 multicopy 원자성을 제공하지 -않습니다-.  모든 CPU 들이
+       특정 스토어를 동시에 보길 원한다면, smp_mb() 를 사용하세요.
  
    (*) 컴파일러는 컨트롤 의존성을 이해하고 있지 않습니다.  따라서 컴파일러가
        여러분의 코드를 망가뜨리지 않도록 하는건 여러분이 해야 하는 일입니다.
@@@ -943,13 -920,14 +920,14 @@@ SMP ë°°ë¦¬ì\96´ ì§\9dë§\9eì¶\94ê¸
  CPU 간 상호작용을 다룰 때에 일부 타입의 메모리 배리어는 항상 짝을 맞춰
  사용되어야 합니다.  적절하게 짝을 맞추지 않은 코드는 사실상 에러에 가깝습니다.
  
- 범용 배리어들은 범용 배리어끼리도 짝을 맞추지만 이행성이 없는 대부분의 다른
- 타입의 배리어들과도 짝을 맞춥니다.  ACQUIRE 배리어는 RELEASE 배리어와 짝을
- 맞춥니다만, 둘 다 범용 배리어를 포함해 다른 배리어들과도 짝을 맞출 수 있습니다.
- 쓰기 배리어는 데이터 의존성 배리어나 컨트롤 의존성, ACQUIRE 배리어, RELEASE
- 배리어, 읽기 배리어, 또는 범용 배리어와 짝을 맞춥니다.  비슷하게 읽기 배리어나
- 컨트롤 의존성, 또는 데이터 의존성 배리어는 쓰기 배리어나 ACQUIRE 배리어,
- RELEASE 배리어, 또는 범용 배리어와 짝을 맞추는데, 다음과 같습니다:
+ 범용 배리어들은 범용 배리어끼리도 짝을 맞추지만 multicopy 원자성이 없는
+ 대부분의 다른 타입의 배리어들과도 짝을 맞춥니다.  ACQUIRE 배리어는 RELEASE
+ 배리어와 짝을 맞춥니다만, 둘 다 범용 배리어를 포함해 다른 배리어들과도 짝을
+ 맞출 수 있습니다.  쓰기 배리어는 데이터 의존성 배리어나 컨트롤 의존성, ACQUIRE
+ 배리어, RELEASE 배리어, 읽기 배리어, 또는 범용 배리어와 짝을 맞춥니다.
+ 비슷하게 읽기 배리어나 컨트롤 의존성, 또는 데이터 의존성 배리어는 쓰기 배리어나
+ ACQUIRE 배리어, RELEASE 배리어, 또는 범용 배리어와 짝을 맞추는데, 다음과
+ 같습니다:
  
        CPU 1                 CPU 2
        ===============       ===============
        ===============       ===============================
        r1 = READ_ONCE(y);
        <범용 배리어>
-       WRITE_ONCE(y, 1);     if (r2 = READ_ONCE(x)) {
+       WRITE_ONCE(x, 1);     if (r2 = READ_ONCE(x)) {
                                 <묵시적 컨트롤 의존성>
                                 WRITE_ONCE(y, 1);
                              }
@@@ -1361,57 -1339,74 +1339,74 @@@ A 의 로드 두개가 모두 B 의 로
                                                :       :       +-------+
  
  
이행
- ------
MULTICOPY 원자
+ ----------------
  
- 이행성(transitivity)은 실제의 컴퓨터 시스템에서 항상 제공되지는 않는, 순서
- 맞추기에 대한 상당히 직관적인 개념입니다.  다음의 예가 이행성을 보여줍니다:
+ Multicopy 원자성은 실제의 컴퓨터 시스템에서 항상 제공되지는 않는, 순서 맞추기에
+ 대한 상당히 직관적인 개념으로, 특정 스토어가 모든 CPU 들에게 동시에 보여지게
+ 됨을, 달리 말하자면 모든 CPU 들이 모든 스토어들이 보여지는 순서를 동의하게 되는
+ 것입니다.  하지만, 완전한 multicopy 원자성의 사용은 가치있는 하드웨어
+ 최적화들을 무능하게 만들어버릴 수 있어서, 보다 완화된 형태의 ``다른 multicopy
+ 원자성'' 라는 이름의, 특정 스토어가 모든 -다른- CPU 들에게는 동시에 보여지게
+ 하는 보장을 대신 제공합니다.  이 문서의 뒷부분들은 이 완화된 형태에 대해 논하게
+ 됩니다만, 단순히 ``multicopy 원자성'' 이라고 부르겠습니다.
+ 다음의 예가 multicopy 원자성을 보입니다:
  
        CPU 1                   CPU 2                   CPU 3
        ======================= ======================= =======================
                { X = 0, Y = 0 }
-       STORE X=1               LOAD X                  STORE Y=1
-                               <범용 배리어>              <범용 배리어>
-                               LOAD Y                  LOAD X
- CPU 2 의 X 로드가 1을 리턴했고 Y 로드가 0을 리턴했다고 해봅시다.  이는 CPU 2 의
- X 로드가 CPU 1 의 X 스토어 뒤에 이루어졌고 CPU 2 의 Y 로드는 CPU 3 의 Y 스토어
- 전에 이루어졌음을 의미합니다.  그럼 "CPU 3 의 X 로드는 0을 리턴할 수 있나요?"
- CPU 2 의 X 로드는 CPU 1 의 스토어 후에 이루어졌으니, CPU 3 의 X 로드는 1을
- 리턴하는게 자연스럽습니다.  이런 생각이 이행성의 한 예입니다: CPU A 에서 실행된
- 로드가 CPU B 에서의 같은 변수에 대한 로드를 뒤따른다면, CPU A 의 로드는 CPU B
- 의 로드가 내놓은 값과 같거나 그 후의 값을 내놓아야 합니다.
- 리눅스 커널에서 범용 배리어의 사용은 이행성을 보장합니다.  따라서, 앞의 예에서
- CPU 2 의 X 로드가 1을, Y 로드는 0을 리턴했다면, CPU 3 의 X 로드는 반드시 1을
- 리턴합니다.
- 하지만, 읽기나 쓰기 배리어에 대해서는 이행성이 보장되지 -않습니다-.  예를 들어,
- 앞의 예에서 CPU 2 의 범용 배리어가 아래처럼 읽기 배리어로 바뀐 경우를 생각해
- 봅시다:
+       STORE X=1               r1=LOAD X (reads 1)     LOAD Y (reads 1)
+                               <범용 배리어>              <읽기 배리어>
+                               STORE Y=r1              LOAD X
+ CPU 2 의 Y 로의 스토어에 사용되는 X 로드의 결과가 1 이었고 CPU 3 의 Y 로드가
+ 1을 리턴했다고 해봅시다.  이는 CPU 1 의 X 로의 스토어가 CPU 2 의 X 로부터의
+ 로드를 앞서고 CPU 2 의 Y 로의 스토어가 CPU 3 의 Y 로부터의 로드를 앞섬을
+ 의미합니다.  또한, 여기서의 메모리 배리어들은 CPU 2 가 자신의 로드를 자신의
+ 스토어 전에 수행하고, CPU 3 가 Y 로부터의 로드를 X 로부터의 로드 전에 수행함을
+ 보장합니다.  그럼 "CPU 3 의 X 로부터의 로드는 0 을 리턴할 수 있을까요?"
+ CPU 3 의 X 로드가 CPU 2 의 로드보다 뒤에 이루어졌으므로, CPU 3 의 X 로부터의
+ 로드는 1 을 리턴한다고 예상하는게 당연합니다.  이런 예상은 multicopy
+ 원자성으로부터 나옵니다: CPU B 에서 수행된 로드가 CPU A 의 같은 변수로부터의
+ 로드를 뒤따른다면 (그리고 CPU A 가 자신이 읽은 값으로 먼저 해당 변수에 스토어
+ 하지 않았다면) multicopy 원자성을 제공하는 시스템에서는, CPU B 의 로드가 CPU A
+ 의 로드와 같은 값 또는 그 나중 값을 리턴해야만 합니다.  하지만, 리눅스 커널은
+ 시스템들이 multicopy 원자성을 제공할 것을 요구하지 않습니다.
+ 앞의 범용 메모리 배리어의 사용은 모든 multicopy 원자성의 부족을 보상해줍니다.
+ 앞의 예에서, CPU 2 의 X 로부터의 로드가 1 을 리턴했고 CPU 3 의 Y 로부터의
+ 로드가 1 을 리턴했다면, CPU 3 의 X 로부터의 로드는 1을 리턴해야만 합니다.
+ 하지만, 의존성, 읽기 배리어, 쓰기 배리어는 항상 non-multicopy 원자성을 보상해
+ 주지는 않습니다.  예를 들어, CPU 2 의 범용 배리어가 앞의 예에서 사라져서
+ 아래처럼 데이터 의존성만 남게 되었다고 해봅시다:
  
        CPU 1                   CPU 2                   CPU 3
        ======================= ======================= =======================
                { X = 0, Y = 0 }
-       STORE X=1               LOAD X                  STORE Y=1
-                               <읽기 배리어>              <범용 배리어>
-                               LOAD Y                  LOAD X
- 이 코드는 이행성을 갖지 않습니다: 이 예에서는, CPU 2 의 X 로드가 1을
- 리턴하고, Y 로드는 0을 리턴하지만 CPU 3 의 X 로드가 0을 리턴하는 것도 완전히
- 합법적입니다.
- CPU 2 의 읽기 배리어가 자신의 읽기는 순서를 맞춰줘도, CPU 1 의 스토어와의
- 순서를 맞춰준다고는 보장할 수 없다는게 핵심입니다.  따라서, CPU 1 과 CPU 2 가
- 버퍼나 캐시를 공유하는 시스템에서 이 예제 코드가 실행된다면, CPU 2 는 CPU 1 이
- 쓴 값에 좀 빨리 접근할 수 있을 것입니다.  따라서 CPU 1 과 CPU 2 의 접근으로
- 조합된 순서를 모든 CPU 가 동의할 수 있도록 하기 위해 범용 배리어가 필요합니다.
- 범용 배리어는 "글로벌 이행성"을 제공해서, 모든 CPU 들이 오퍼레이션들의 순서에
- 동의하게 할 것입니다.  반면, release-acquire 조합은 "로컬 이행성" 만을
- 제공해서, 해당 조합이 사용된 CPU 들만이 해당 액세스들의 조합된 순서에 동의함이
- 보장됩니다.  예를 들어, 존경스런 Herman Hollerith 의 C 코드로 보면:
+       STORE X=1               r1=LOAD X (reads 1)     LOAD Y (reads 1)
+                               <데이터 의존성>           <읽기 배리어>
+                               STORE Y=r1              LOAD X (reads 0)
+ 이 변화는 non-multicopy 원자성이 만연하게 합니다: 이 예에서, CPU 2 의 X
+ 로부터의 로드가 1을 리턴하고, CPU 3 의 Y 로부터의 로드가 1 을 리턴하는데, CPU 3
+ 의 X 로부터의 로드가 0 을 리턴하는게 완전히 합법적입니다.
+ 핵심은, CPU 2 의 데이터 의존성이 자신의 로드와 스토어를 순서짓지만, CPU 1 의
+ 스토어에 대한 순서는 보장하지 않는다는 것입니다.  따라서, 이 예제가 CPU 1 과
+ CPU 2 가 스토어 버퍼나 한 수준의 캐시를 공유하는, multicopy 원자성을 제공하지
+ 않는 시스템에서 수행된다면 CPU 2 는 CPU 1 의 쓰기에 이른 접근을 할 수도
+ 있습니다.  따라서, 모든 CPU 들이 여러 접근들의 조합된 순서에 대해서 동의하게
+ 하기 위해서는 범용 배리어가 필요합니다.
+ 범용 배리어는 non-multicopy 원자성만 보상할 수 있는게 아니라, -모든- CPU 들이
+ -모든- 오퍼레이션들의 순서를 동일하게 인식하게 하는 추가적인 순서 보장을
+ 만들어냅니다.  반대로, release-acquire 짝의 연결은 이런 추가적인 순서는
+ 제공하지 않는데, 해당 연결에 들어있는 CPU 들만이 메모리 접근의 조합된 순서에
+ 대해 동의할 것으로 보장됨을 의미합니다.  예를 들어, 존경스런 Herman Hollerith
+ 의 코드를 C 코드로 변환하면:
  
        int u, v, x, y, z;
  
        }
  
  cpu0(), cpu1(), 그리고 cpu2() 는 smp_store_release()/smp_load_acquire() 쌍의
- 연결을 통한 로컬 이행성에 동참하고 있으므로, 다음과 같은 결과는 나오지 않을
- 겁니다:
+ 연결에 참여되어 있으므로, 다음과 같은 결과는 나오지 않을 겁니다:
  
        r0 == 1 && r1 == 1 && r2 == 1
  
@@@ -1454,8 -1448,9 +1448,9 @@@ cpu0() ì\9d\98 ì\93°ê¸°ë¥¼ ë´\90ì\95¼ë§\8c í\95\98ë¯\80ë¡
  
        r1 == 1 && r5 == 0
  
- 하지만, release-acquire 타동성은 동참한 CPU 들에만 적용되므로 cpu3() 에는
- 적용되지 않습니다.  따라서, 다음과 같은 결과가 가능합니다:
+ 하지만, release-acquire 에 의해 제공되는 순서는 해당 연결에 동참한 CPU 들에만
+ 적용되므로 cpu3() 에, 적어도 스토어들 외에는 적용되지 않습니다.  따라서, 다음과
+ 같은 결과가 가능합니다:
  
        r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0
  
@@@ -1482,8 -1477,8 +1477,8 @@@ u ë¡\9cì\9d\98 ì\8a¤í\86 ì\96´ë¥¼ cpu1() ì\9d\98 v ë¡\9cë
  이런 결과는 어떤 것도 재배치 되지 않는, 순차적 일관성을 가진 가상의
  시스템에서도 일어날 수 있음을 기억해 두시기 바랍니다.
  
- 다시 말하지만, 당신의 코드가 글로벌 이행성을 필요로 한다면, 범용 배리어를
- 사용하십시오.
+ 다시 말하지만, 당신의 코드가 모든 오퍼레이션들의 완전한 순서를 필요로 한다면,
범용 배리어를 사용하십시오.
  
  
  ==================
@@@ -1858,6 -1853,18 +1853,6 @@@ Mandatory 배리어들은 SMP 시스템
       참고하세요.
  
  
 - (*) lockless_dereference();
 -
 -     이 함수는 smp_read_barrier_depends() 데이터 의존성 배리어를 사용하는
 -     포인터 읽어오기 래퍼(wrapper) 함수로 생각될 수 있습니다.
 -
 -     객체의 라이프타임이 RCU 외의 메커니즘으로 관리된다는 점을 제외하면
 -     rcu_dereference() 와도 유사한데, 예를 들면 객체가 시스템이 꺼질 때에만
 -     제거되는 경우 등입니다.  또한, lockless_dereference() 은 RCU 와 함께
 -     사용될수도, RCU 없이 사용될 수도 있는 일부 데이터 구조에 사용되고
 -     있습니다.
 -
 -
   (*) dma_wmb();
   (*) dma_rmb();
  
@@@ -3046,6 -3053,9 +3041,9 @@@ AMD64 Architecture Programmer's Manual 
        Chapter 7.1: Memory-Access Ordering
        Chapter 7.4: Buffering and Combining Memory Writes
  
+ ARM Architecture Reference Manual (ARMv8, for ARMv8-A architecture profile)
+       Chapter B2: The AArch64 Application Level Memory Model
  IA-32 Intel Architecture Software Developer's Manual, Volume 3:
  System Programming Guide
        Chapter 7.1: Locked Atomic Operations
@@@ -3057,6 -3067,8 +3055,8 @@@ The SPARC Architecture Manual, Version 
        Appendix D: Formal Specification of the Memory Models
        Appendix J: Programming with the Memory Models
  
+ Storage in the PowerPC (Stone and Fitzgerald)
  UltraSPARC Programmer Reference Manual
        Chapter 5: Memory Accesses and Cacheability
        Chapter 15: Sparc-V9 Memory Models
diff --combined scripts/Makefile.build
index f171225383cc4afc6c44cf42242ffffe36417404,aceac0ba07451f051cc8c49738e5446a04588ce5..65ea1e6aaaf6cdc30f0700c4f5d44138737ae84f
@@@ -1,4 -1,3 +1,4 @@@
 +# SPDX-License-Identifier: GPL-2.0
  # ==========================================================================
  # Building
  # ==========================================================================
@@@ -65,6 -64,15 +65,6 @@@ ifneq ($(hostprogs-y)$(hostprogs-m)$(ho
  include scripts/Makefile.host
  endif
  
 -ifneq ($(KBUILD_SRC),)
 -# Create output directory if not already present
 -_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
 -
 -# Create directories for object files if directory does not exist
 -# Needed when obj-y := dir/file.o syntax is used
 -_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
 -endif
 -
  ifndef obj
  $(warning kbuild: Makefile.build is included improperly)
  endif
@@@ -100,6 -108,10 +100,10 @@@ ifneq ($(KBUILD_CHECKSRC),0
    endif
  endif
  
+ ifneq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),)
+   cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $< ;
+ endif
  # Do section mismatch analysis for each module/built-in.o
  ifdef CONFIG_DEBUG_SECTION_MISMATCH
    cmd_secanalysis = ; scripts/mod/modpost $@
@@@ -250,15 -262,13 +254,15 @@@ ifneq ($(SKIP_STACK_VALIDATION),1
  
  __objtool_obj := $(objtree)/tools/objtool/objtool
  
 -objtool_args = $(if $(CONFIG_ORC_UNWINDER),orc generate,check)
 +objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check)
  
  ifndef CONFIG_FRAME_POINTER
  objtool_args += --no-fp
  endif
  ifdef CONFIG_GCOV_KERNEL
  objtool_args += --no-unreachable
 +else
 +objtool_args += $(call cc-ifversion, -lt, 0405, --no-unreachable)
  endif
  
  # 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
@@@ -283,6 -293,7 +287,7 @@@ define rule_cc_o_
        $(call echo-cmd,checksrc) $(cmd_checksrc)                         \
        $(call cmd_and_fixdep,cc_o_c)                                     \
        $(cmd_modversions_c)                                              \
+       $(cmd_checkdoc)                                                   \
        $(call echo-cmd,objtool) $(cmd_objtool)                           \
        $(call echo-cmd,record_mcount) $(cmd_record_mcount)
  endef
@@@ -411,7 -422,7 +416,7 @@@ targets += $(extra-y) $(MAKECMDGOALS) $
  # Linker scripts preprocessor (.lds.S -> .lds)
  # ---------------------------------------------------------------------------
  quiet_cmd_cpp_lds_S = LDS     $@
 -      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
 +      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
                             -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
  
  $(obj)/%.lds: $(src)/%.lds.S FORCE
@@@ -554,7 -565,7 +559,7 @@@ $(multi-used-m): FORC
  $(call multi_depend, $(multi-used-m), .o, -objs -y -m)
  
  targets += $(multi-used-y) $(multi-used-m)
 -
 +targets := $(filter-out $(PHONY), $(targets))
  
  # Descending
  # ---------------------------------------------------------------------------
@@@ -575,23 -586,13 +580,23 @@@ FORCE
  # optimization, we don't need to read them if the target does not
  # exist, we will rebuild anyway in that case.
  
 -targets := $(wildcard $(sort $(targets)))
 -cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
 +cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd))
  
  ifneq ($(cmd_files),)
    include $(cmd_files)
  endif
  
 +ifneq ($(KBUILD_SRC),)
 +# Create directories for object files if they do not exist
 +obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
 +# If cmd_files exist, their directories apparently exist.  Skip mkdir.
 +exist-dirs := $(sort $(patsubst %/,%, $(dir $(cmd_files))))
 +obj-dirs := $(strip $(filter-out $(exist-dirs), $(obj-dirs)))
 +ifneq ($(obj-dirs),)
 +$(shell mkdir -p $(obj-dirs))
 +endif
 +endif
 +
  # Declare the contents of the .PHONY variable as phony.  We keep that
  # information in a variable se we can use it in if_changed and friends.
  
diff --combined scripts/kernel-doc
index 7bd52b8f63d48667cdb1d8ebe63896f2d8e3d176,3bb43cb014b7cb488d6e40c306f06b05997173a8..bd29a92b4b48aa1648f8c892c980f1a72c2ad67e
@@@ -58,6 -58,7 +58,7 @@@ Output format selection (mutually exclu
    -man                        Output troff manual page format. This is the default.
    -rst                        Output reStructuredText format.
    -text                       Output plain text format.
+   -none                       Do not output documentation, only warnings.
  
  Output selection (mutually exclusive):
    -export             Only output documentation for symbols that have been
@@@ -532,6 -533,8 +533,8 @@@ while ($ARGV[0] =~ m/^-(.*)/) 
        $output_mode = "gnome";
        @highlights = @highlights_gnome;
        $blankline = $blankline_gnome;
+     } elsif ($cmd eq "-none") {
+       $output_mode = "none";
      } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document
        $modulename = shift @ARGV;
      } elsif ($cmd eq "-function") { # to only output specific functions
@@@ -2117,6 -2120,24 +2120,24 @@@ sub output_blockhead_list(%) 
      }
  }
  
+ ## none mode output functions
+ sub output_function_none(%) {
+ }
+ sub output_enum_none(%) {
+ }
+ sub output_typedef_none(%) {
+ }
+ sub output_struct_none(%) {
+ }
+ sub output_blockhead_none(%) {
+ }
  ##
  # generic output function for all types (function, struct/union, typedef, enum);
  # calls the generated, variable output_ function name based on
@@@ -2182,6 -2203,8 +2203,6 @@@ sub dump_struct($$) 
        # strip comments:
        $members =~ s/\/\*.*?\*\///gos;
        $nested =~ s/\/\*.*?\*\///gos;
 -      # strip kmemcheck_bitfield_{begin,end}.*;
 -      $members =~ s/kmemcheck_bitfield_.*?;//gos;
        # strip attributes
        $members =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i;
        $members =~ s/__aligned\s*\([^;]*\)//gos;
@@@ -3143,7 -3166,9 +3164,9 @@@ sub process_file($) 
        }
      }
      if ($initial_section_counter == $section_counter) {
-       print STDERR "${file}:1: warning: no structured comments found\n";
+       if ($output_mode ne "none") {
+           print STDERR "${file}:1: warning: no structured comments found\n";
+       }
        if (($output_selection == OUTPUT_INCLUDE) && ($show_not_found == 1)) {
            print STDERR "    Was looking for '$_'.\n" for keys %function_table;
        }