Read - Copy - Update
This document, dated the 23rd day of October 20003 (sic), listed 591 files "which may, on information and belief, include information (including methods) that IBM was required to maintain as confidential or proprietary pursuant to contract with SCO and/or which constitute trade secrets misused by IBM are found within Linux 2.4 and/or Linux 2.5 kernels under the following source file headings". There followed what was apparently a lightly filtered list of every file in the Linux 2.5.69 kernel [download] that contain the words "SMP", "RCU" and "NUMA", plus all the JFS files. See Frank Sorenson's superb analysis. Of those 591 files, the 11 files listed below are those that contain the word "RCU".
fs/compat.c fs/dcache.c fs/namei.c include/linux/list.h include/linux/rcupdate.h ipc/util.c ipc/util.h kernel/rcupdate.c net/bridge/br_if.c net/bridge/br_private.h net/decnet/dn_route.c
Total 11 files
The files listed are from the first rclock patch (for Linux 2.4.1) [download] from the Linux Scalability Effort rclock project. The patch was released on 9 April 2001. The patch touches a total of 14 files, of which nine are listed in the document. The other files are Documentation/rclock.txt, arch/i386/config.in, kernel/Makefile, kernel/ksyms.c and kernel/sched.c.
| DynixV v4.6.1 file | lines | 2.4.1-01 file | lines |
|---|---|---|---|
| kernel/sys/rclock.h | unspecified | include/linux/rclock.h | all |
| kernel/os/rclock.c | unspecified | kernel/rclock.c | all |
| kernel/sys/kma_defer.h | unspecified | include/linux/kmemdef.h | all |
| kernel/os/kma_defer.c | unspecified | kernel/kmemdef.c | all |
| kernel/os/kern_clock.c | 2028-2059 | arch/i386/kernel/apic.c | 25-28 662-664 676-684 |
| kernel/timer.c | 26-29 681-683 688-697 | ||
| kernel/i386/locore.s | 1487-1497 | arch/i386/kernel/entry.S | 199-205 |
| kernel/i386/trap.c | 1554-1563 | arch/i386/kernel/traps.c | 52-54 244-247 331-334 542-545 659-662 718-721 |
| kernel/i386/startup.c | 2054 | init/main.c | 30-33 609-616 |
Total 9 files
The same information is present in the subsequent Second Amended Complaint of 27 February 2004 (108), which remains in effect today, and also in the rejected Third Amended Complaint of 14 October 2004 (323-1).
The inclusion of arch/i386/kernel/apic.c may explain the subsequent bizarre objection to a patch against it - see Item 236.
The files listed are from Linux 2.6.0 [download] [copying]. It was released on 18 December 2003. The next release was 2.6.1 on 9 January 2004. This document is dated 15 January 2004. It catalogues use of RCU in the Kernel - "These files use RCU functions and macros - and if they are used, then the RCU functionality is used, too. The number of lines and number of files, although substantial, is less significant than the impact of the changes, which is dramatic for networking, device drivers, lists, and directory access."
| Structure / Sequence | DynixV file | Lines | Linux 2.6.0 file | Lines |
|---|---|---|---|---|
| Register an RCU callback | kernel/sys/rclock.h | 412 | include/linux/rcupdate.h | 131-132 |
| Register an RCU callback | kernel/os/rclock.c | 503-613 | kernel/rcupdate.c | 58-80 |
| RCU callback control structure | kernel/sys/rclock.h | 217-228 | include/linux/rcupdate.h | 66-72 |
| RCU callback lists | kernel/sys/rclock.h | 238-241 | include/linux/rcupdate.h | 87-108 |
| RCU callback lists | kernel/i386/plocal.h | 1517-1537 | include/linux/rcupdate.h | 87-108 |
| RCU comparison operators | kernel/sys/rclock.h | 300-312 | include/linux/rcupdate.h | 75-85 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-alpha/system.h | 152-153 159 164 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-arm/system.h | 104 228 235 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-arm26/system.h | 197 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-cris/system.h | 3 27 32 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-h8300/system.h | 97 102 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-i386/system.h | 368-420 434 440 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-ia64/system.h | 83 89 94 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-m68k/system.h | 80 87 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-m68knommu/system.h | 105 110 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-mips/system.h | 145-197 256 261 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-parisc/system.h | 134-135 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-ppc/system.h | 24-25 34 43 48 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-ppc64/system.h | 28-29 38 47 52 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-s390/system.h | 255 259 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-sh/system.h | 80 86 91 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-sparc/system.h | 281 287 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-sparc64/system.h | 86 96 101 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-v850/system.h | 70 78 |
| Force cache write | kernel/sys/rclock.h | 331-358 | include/asm-x86_64/system.h | 283 288 305 |
| RCU read protect | kernel/sys/rclock.h | 373-387 | include/linux/rcupdate.h | 124-125 |
| RCU read protect | kernel/os/rclock.c | 1758-1825 | include/linux/rcupdate.h | 124-125 |
| RCU read protect | kernel/os/rclock.c | 503-613 | kernel/rcupdate.c | 58-80 |
| Call checker | kernel/os/kern_clock.c | 2028-2059 | include/linux/rcupdate.h | 112-122 |
| Call checker | kernel/os/kern_clock.c | 2028-2059 | kernel/sched.c | 1364-1365 |
| RCU checker | kernel/sys/rclock.h | 411 415 | include/linux/rcupdate.h | 128 |
| RCU checker | kernel/os/rclock.c | 385-468 659-752 1314-1494 | kernel/rcupdate.c | 82-207 |
| RCU initialization | kernel/sys/rclock.h | 414 | include/linux/rcupdate.h | 127 |
| RCU initialization | kernel/os/rclock.c | 1222-1311 | kernel/rcupdate.c | 201-240 |
| RCU use | — | — | net/core/netfilter.c | 73 83 357 516-517 548 558 575 612 |
| RCU use | — | — | net/core/dev.c | 239 242 238 995-996 1027 1580-1581 1594 1614 2893 |
| RCU use | — | — | net/ipv4/ip_input.c | 220 241 266 |
| RCU use | — | — | net/ipv4/af_inet.c | 340-341 375 430 1012 1040 |
| RCU use | — | — | net/ipv4/icmp.c | 707-712 |
| RCU use | — | — | net/ipv4/route.c | 227 231 240 243 246 282 440 446 1004 1008 1026 1037 1076 1257 1260 1296 1852 1854 1867 1873 2219 2221 2235 2241 2451 2454 2462 2467 |
| RCU use | — | — | net/bridge/br_device.c | 79 81 |
| RCU use | — | — | net/bridge/br_ioctl.c | 78 97 159 161 179 |
| RCU use | — | — | net/bridge/br_stp.c | 43 |
| RCU use | — | — | net/bridge/br_private.h | 77 |
| RCU use | — | — | net/bridge/br_input.c | 59 61 106 117 135 142 151 156 |
| RCU use | — | — | net/bridge/br_forward.c | 77-97 120 147 151 |
| RCU use | — | — | net/bridge/br_if.c | 64 72 160 269-270 273 |
| RCU use | — | — | net/irda/irlan/irlan_common.c | 230 275 1083 1113 |
| RCU use | — | — | net/irda/irlan/irlan_client.c | 172 182 |
| RCU use | — | — | net/ipv6/icmp.c | 532 534 537 |
| RCU use | — | — | net/ipv6/af_inet6.c | 173-174 208 271 275 279 614 640 |
| RCU use | — | — | net/ipv6/ip6_input.c | 155 169 197 201 |
| RCU use | — | — | net/802/psnap.c | 36 58 71 136 151 |
| RCU use | — | — | net/decnet/dn_route.c | 149 156 1171 1173 1184 1189 1450 1452 1463 1468 1644 1646 1653 1658 1678 1682 1691 1694 1697 1723 |
| RCU use | — | — | drivers/net/wireless/strip.c | 973 983 998 1006 2562 |
| RCU use | — | — | drivers/net/wan/lapbether.c | 70 98 118 379 395 411 431 |
| RCU use | — | — | drivers/net/hamradio/bpqether.c | 183 225 408 437 545 560 575 595 |
| RCU use | — | — | drivers/char/ipmi/ipmi_kcs_intf.c | 1203 |
| RCU use | — | — | arch/i386/oprofile/nmi_timer_int.c | 41 |
| RCU use | — | — | include/linux/dcache.h | 96 180 |
| RCU use | — | — | include/linux/list.h | 83-124 152-167 367-414 462-477 487 499-508 |
| RCU use | — | — | include/net/dst.h | 77 |
| RCU use | — | — | fs/dcache.c | 81 986 993 1015 1038 1146 1232 1235 |
| RCU use | — | — | kernel/module.c | 1738 |
| RCU use | — | — | ipc/util.c | 197 282 289 349 354 459 461 475 478 488 497 |
| RCU use | — | — | init/main.c | 414 |
Total 55 files
As in the previous Revised Supplemental Response of 15 January 2004 (103-1 discussed above), the files listed are from the first rclock patch (for Linux 2.4.1) [download] from the Linux Scalability Effort rclock project which was released on 9 April 2001. This document supplements the previous one by providing specific line numbers for the four files previously objected to in their entirety. In three out of four cases, an considerable discrepancy is revealed between the number of lines said to have been directly copied from Dynix/ptx and the number of lines said to be in Linux.
| Files & lines in Dynix v4.6.1 tree | Files & lines in code drop for Linux 2.4.1 | ||
|---|---|---|---|
| kernel/sys/rclock.h | 175-228 243-423 (total 235) |
include/linux/rclock.h | 40-132 137-162 190-195 230-305 307-310 (total 205, 66%) |
| kernel/os/rclock.c | 303-317 383-588 616-1825 (total 1431) |
kernel/rclock.c | 48-80 85-187 189-1011 (total 823, 81%) |
| kernel/sys/kma_defer.h | 46-52 95-119 129-132 140 (total 37) |
include/linux/kmemdef.h | 38-72 (total 35, 49%) |
| kernel/os/kma_defer.c | 191-353 370-427 550-582 603-703 (total 355) |
kernel/kmemdef.c | 61-245 (total 185, 76%) |
Total 4 files, 1248 lines
Gupta attempts to demonstrate substantial similarity between RCU in the Linux kernel version 2.6.5 and RCU in UNIX SVR4.2 MP (aka 4.2 ES/MP). The five acts he names are (i) "allocating a new data structure of a certain size", and, as revealed in IBM's reply (247 page 8), (ii) "copying the contents of the old data structure to the new data structure", (iii) "updating the new data structure", (iv) "updating or redirecting a pointer to point to the new data structure", and (v) arranging for deferred deletion of the old data structure". He goes on to complain of the first rclock patch for Linux 2.4.1 discussed above [download]. The entire patch is printed, in its unexpurgated unified diff glory, as Gupta's Exhibit E (497 p73-116).
At paragraph 29 Gupta states: "Another patch was also provided to Linux version 2.5.44 by IBM employee Mingming Cao. See Exhibit G. This patch appears to be incorporated into the Linux version 2.6." The patch printed in Exhibit G (497 p141-158) is in fact the Linux Scalability Effort's IPC Locks Breakup patch ipc-rcu-2544.patch [download]. The patch touches the following files:
include/linux/ipc.h
ipc/msg.c
ipc/sem.c
ipc/shm.c
ipc/util.c
ipc/util.h
Item 2 (ongoing): Read-Copy-Update code [SCO 724 p.8]. Line-for-line copied code from derived works of System V created by IBM (or otherwise protected under the contracts) and contributed to Linux in violations of the IBM and Sequent Software Agreements [SCO 724 Appx A pp.2-3].