diff options
| -rw-r--r-- | Documentation/sysctl/kernel.txt | 32 | ||||
| -rw-r--r-- | MAINTAINERS | 199 | ||||
| -rw-r--r-- | drivers/rtc/Kconfig | 8 | ||||
| -rw-r--r-- | drivers/rtc/Makefile | 1 | ||||
| -rw-r--r-- | drivers/rtc/rtc-tegra.c | 7 | ||||
| -rw-r--r-- | drivers/rtc/rtc-tps6586x.c | 356 | ||||
| -rw-r--r-- | drivers/rtc/rtc-vt8500.c | 11 | ||||
| -rw-r--r-- | include/asm-generic/tlb.h | 9 | ||||
| -rw-r--r-- | include/linux/ipc_namespace.h | 1 | ||||
| -rw-r--r-- | include/linux/mmzone.h | 8 | ||||
| -rw-r--r-- | include/linux/msg.h | 6 | ||||
| -rw-r--r-- | include/uapi/linux/msg.h | 1 | ||||
| -rw-r--r-- | ipc/compat.c | 46 | ||||
| -rw-r--r-- | ipc/ipc_sysctl.c | 32 | ||||
| -rw-r--r-- | ipc/msg.c | 123 | ||||
| -rw-r--r-- | ipc/msgutil.c | 43 | ||||
| -rw-r--r-- | ipc/util.c | 16 | ||||
| -rw-r--r-- | ipc/util.h | 2 | ||||
| -rw-r--r-- | kernel/printk.c | 5 | ||||
| -rw-r--r-- | mm/memory.c | 5 | ||||
| -rw-r--r-- | mm/page_alloc.c | 27 | ||||
| -rw-r--r-- | mm/page_isolation.c | 26 | ||||
| -rw-r--r-- | tools/testing/selftests/ipc/Makefile | 25 | ||||
| -rw-r--r-- | tools/testing/selftests/ipc/msgque.c | 246 |
24 files changed, 1035 insertions, 200 deletions
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 2907ba6c3607..ccd42589e124 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt | |||
| @@ -38,6 +38,7 @@ show up in /proc/sys/kernel: | |||
| 38 | - l2cr [ PPC only ] | 38 | - l2cr [ PPC only ] |
| 39 | - modprobe ==> Documentation/debugging-modules.txt | 39 | - modprobe ==> Documentation/debugging-modules.txt |
| 40 | - modules_disabled | 40 | - modules_disabled |
| 41 | - msg_next_id [ sysv ipc ] | ||
| 41 | - msgmax | 42 | - msgmax |
| 42 | - msgmnb | 43 | - msgmnb |
| 43 | - msgmni | 44 | - msgmni |
| @@ -62,7 +63,9 @@ show up in /proc/sys/kernel: | |||
| 62 | - rtsig-max | 63 | - rtsig-max |
| 63 | - rtsig-nr | 64 | - rtsig-nr |
| 64 | - sem | 65 | - sem |
| 66 | - sem_next_id [ sysv ipc ] | ||
| 65 | - sg-big-buff [ generic SCSI device (sg) ] | 67 | - sg-big-buff [ generic SCSI device (sg) ] |
| 68 | - shm_next_id [ sysv ipc ] | ||
| 66 | - shm_rmid_forced | 69 | - shm_rmid_forced |
| 67 | - shmall | 70 | - shmall |
| 68 | - shmmax [ sysv ipc ] | 71 | - shmmax [ sysv ipc ] |
| @@ -320,6 +323,22 @@ to false. | |||
| 320 | 323 | ||
| 321 | ============================================================== | 324 | ============================================================== |
| 322 | 325 | ||
| 326 | msg_next_id, sem_next_id, and shm_next_id: | ||
| 327 | |||
| 328 | These three toggles allows to specify desired id for next allocated IPC | ||
| 329 | object: message, semaphore or shared memory respectively. | ||
| 330 | |||
| 331 | By default they are equal to -1, which means generic allocation logic. | ||
| 332 | Possible values to set are in range {0..INT_MAX}. | ||
| 333 | |||
| 334 | Notes: | ||
| 335 | 1) kernel doesn't guarantee, that new object will have desired id. So, | ||
| 336 | it's up to userspace, how to handle an object with "wrong" id. | ||
| 337 | 2) Toggle with non-default value will be set back to -1 by kernel after | ||
| 338 | successful IPC object allocation. | ||
| 339 | |||
| 340 | ============================================================== | ||
| 341 | |||
| 323 | nmi_watchdog: | 342 | nmi_watchdog: |
| 324 | 343 | ||
| 325 | Enables/Disables the NMI watchdog on x86 systems. When the value is | 344 | Enables/Disables the NMI watchdog on x86 systems. When the value is |
| @@ -542,6 +561,19 @@ are doing anyway :) | |||
| 542 | 561 | ||
| 543 | ============================================================== | 562 | ============================================================== |
| 544 | 563 | ||
| 564 | shmall: | ||
| 565 | |||
| 566 | This parameter sets the total amount of shared memory pages that | ||
| 567 | can be used system wide. Hence, SHMALL should always be at least | ||
| 568 | ceil(shmmax/PAGE_SIZE). | ||
| 569 | |||
| 570 | If you are not sure what the default PAGE_SIZE is on your Linux | ||
| 571 | system, you can run the following command: | ||
| 572 | |||
| 573 | # getconf PAGE_SIZE | ||
| 574 | |||
| 575 | ============================================================== | ||
| 576 | |||
| 545 | shmmax: | 577 | shmmax: |
| 546 | 578 | ||
| 547 | This value can be used to query and set the run time limit | 579 | This value can be used to query and set the run time limit |
diff --git a/MAINTAINERS b/MAINTAINERS index 7a58a25a6e7c..915564eda145 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -449,6 +449,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | |||
| 449 | S: Maintained | 449 | S: Maintained |
| 450 | F: drivers/char/agp/ | 450 | F: drivers/char/agp/ |
| 451 | F: include/linux/agp* | 451 | F: include/linux/agp* |
| 452 | F: include/uapi/linux/agp* | ||
| 452 | 453 | ||
| 453 | AHA152X SCSI DRIVER | 454 | AHA152X SCSI DRIVER |
| 454 | M: "Juergen E. Fischer" <fischer@norbit.de> | 455 | M: "Juergen E. Fischer" <fischer@norbit.de> |
| @@ -589,6 +590,7 @@ M: Jiri Kosina <jkosina@suse.cz> | |||
| 589 | S: Odd fixes | 590 | S: Odd fixes |
| 590 | F: arch/x86/kernel/apm_32.c | 591 | F: arch/x86/kernel/apm_32.c |
| 591 | F: include/linux/apm_bios.h | 592 | F: include/linux/apm_bios.h |
| 593 | F: include/uapi/linux/apm_bios.h | ||
| 592 | F: drivers/char/apm-emulation.c | 594 | F: drivers/char/apm-emulation.c |
| 593 | 595 | ||
| 594 | APPLE BCM5974 MULTITOUCH DRIVER | 596 | APPLE BCM5974 MULTITOUCH DRIVER |
| @@ -1005,7 +1007,6 @@ F: drivers/mmc/host/msm_sdcc.c | |||
| 1005 | F: drivers/mmc/host/msm_sdcc.h | 1007 | F: drivers/mmc/host/msm_sdcc.h |
| 1006 | F: drivers/tty/serial/msm_serial.h | 1008 | F: drivers/tty/serial/msm_serial.h |
| 1007 | F: drivers/tty/serial/msm_serial.c | 1009 | F: drivers/tty/serial/msm_serial.c |
| 1008 | F: drivers/platform/msm/ | ||
| 1009 | F: drivers/*/pm8???-* | 1010 | F: drivers/*/pm8???-* |
| 1010 | F: include/linux/mfd/pm8xxx/ | 1011 | F: include/linux/mfd/pm8xxx/ |
| 1011 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git | 1012 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git |
| @@ -1069,7 +1070,6 @@ M: Russell King <linux@arm.linux.org.uk> | |||
| 1069 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1070 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1070 | W: http://www.arm.linux.org.uk/ | 1071 | W: http://www.arm.linux.org.uk/ |
| 1071 | S: Maintained | 1072 | S: Maintained |
| 1072 | F: arch/arm/common/time-acorn.c | ||
| 1073 | F: arch/arm/include/asm/hardware/entry-macro-iomd.S | 1073 | F: arch/arm/include/asm/hardware/entry-macro-iomd.S |
| 1074 | F: arch/arm/include/asm/hardware/ioc.h | 1074 | F: arch/arm/include/asm/hardware/ioc.h |
| 1075 | F: arch/arm/include/asm/hardware/iomd.h | 1075 | F: arch/arm/include/asm/hardware/iomd.h |
| @@ -1094,7 +1094,6 @@ W: http://www.fluff.org/ben/linux/ | |||
| 1094 | S: Maintained | 1094 | S: Maintained |
| 1095 | F: arch/arm/plat-samsung/ | 1095 | F: arch/arm/plat-samsung/ |
| 1096 | F: arch/arm/plat-s3c24xx/ | 1096 | F: arch/arm/plat-s3c24xx/ |
| 1097 | F: arch/arm/plat-s5p/ | ||
| 1098 | F: arch/arm/mach-s3c24*/ | 1097 | F: arch/arm/mach-s3c24*/ |
| 1099 | F: arch/arm/mach-s3c64xx/ | 1098 | F: arch/arm/mach-s3c64xx/ |
| 1100 | F: drivers/*/*s3c2410* | 1099 | F: drivers/*/*s3c2410* |
| @@ -1125,7 +1124,6 @@ M: Sylwester Nawrocki <s.nawrocki@samsung.com> | |||
| 1125 | L: linux-arm-kernel@lists.infradead.org | 1124 | L: linux-arm-kernel@lists.infradead.org |
| 1126 | L: linux-media@vger.kernel.org | 1125 | L: linux-media@vger.kernel.org |
| 1127 | S: Maintained | 1126 | S: Maintained |
| 1128 | F: arch/arm/plat-s5p/dev-fimc* | ||
| 1129 | F: arch/arm/plat-samsung/include/plat/*fimc* | 1127 | F: arch/arm/plat-samsung/include/plat/*fimc* |
| 1130 | F: drivers/media/platform/s5p-fimc/ | 1128 | F: drivers/media/platform/s5p-fimc/ |
| 1131 | 1129 | ||
| @@ -1136,7 +1134,7 @@ M: Jeongtae Park <jtp.park@samsung.com> | |||
| 1136 | L: linux-arm-kernel@lists.infradead.org | 1134 | L: linux-arm-kernel@lists.infradead.org |
| 1137 | L: linux-media@vger.kernel.org | 1135 | L: linux-media@vger.kernel.org |
| 1138 | S: Maintained | 1136 | S: Maintained |
| 1139 | F: arch/arm/plat-s5p/dev-mfc.c | 1137 | F: arch/arm/plat-samsung/s5p-dev-mfc.c |
| 1140 | F: drivers/media/platform/s5p-mfc/ | 1138 | F: drivers/media/platform/s5p-mfc/ |
| 1141 | 1139 | ||
| 1142 | ARM/SAMSUNG S5P SERIES TV SUBSYSTEM SUPPORT | 1140 | ARM/SAMSUNG S5P SERIES TV SUBSYSTEM SUPPORT |
| @@ -1254,7 +1252,7 @@ F: drivers/video/vt8500lcdfb.* | |||
| 1254 | F: drivers/video/wm8505fb* | 1252 | F: drivers/video/wm8505fb* |
| 1255 | F: drivers/video/wmt_ge_rops.* | 1253 | F: drivers/video/wmt_ge_rops.* |
| 1256 | F: drivers/tty/serial/vt8500_serial.c | 1254 | F: drivers/tty/serial/vt8500_serial.c |
| 1257 | F: drivers/rtc/rtc-vt8500-c | 1255 | F: drivers/rtc/rtc-vt8500.c |
| 1258 | F: drivers/mmc/host/wmt-sdmmc.c | 1256 | F: drivers/mmc/host/wmt-sdmmc.c |
| 1259 | 1257 | ||
| 1260 | ARM/ZIPIT Z2 SUPPORT | 1258 | ARM/ZIPIT Z2 SUPPORT |
| @@ -1388,6 +1386,7 @@ W: http://linux-atm.sourceforge.net | |||
| 1388 | S: Maintained | 1386 | S: Maintained |
| 1389 | F: drivers/atm/ | 1387 | F: drivers/atm/ |
| 1390 | F: include/linux/atm* | 1388 | F: include/linux/atm* |
| 1389 | F: include/uapi/linux/atm* | ||
| 1391 | 1390 | ||
| 1392 | ATMEL AT91 / AT32 MCI DRIVER | 1391 | ATMEL AT91 / AT32 MCI DRIVER |
| 1393 | M: Ludovic Desroches <ludovic.desroches@atmel.com> | 1392 | M: Ludovic Desroches <ludovic.desroches@atmel.com> |
| @@ -1406,13 +1405,13 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | |||
| 1406 | S: Supported | 1405 | S: Supported |
| 1407 | F: drivers/dma/at_hdmac.c | 1406 | F: drivers/dma/at_hdmac.c |
| 1408 | F: drivers/dma/at_hdmac_regs.h | 1407 | F: drivers/dma/at_hdmac_regs.h |
| 1409 | F: arch/arm/mach-at91/include/mach/at_hdmac.h | 1408 | F: include/linux/platform_data/dma-atmel.h |
| 1410 | 1409 | ||
| 1411 | ATMEL ISI DRIVER | 1410 | ATMEL ISI DRIVER |
| 1412 | M: Josh Wu <josh.wu@atmel.com> | 1411 | M: Josh Wu <josh.wu@atmel.com> |
| 1413 | L: linux-media@vger.kernel.org | 1412 | L: linux-media@vger.kernel.org |
| 1414 | S: Supported | 1413 | S: Supported |
| 1415 | F: drivers/media/platform/atmel-isi.c | 1414 | F: drivers/media/platform/soc_camera/atmel-isi.c |
| 1416 | F: include/media/atmel-isi.h | 1415 | F: include/media/atmel-isi.h |
| 1417 | 1416 | ||
| 1418 | ATMEL LCDFB DRIVER | 1417 | ATMEL LCDFB DRIVER |
| @@ -1467,6 +1466,7 @@ W: http://people.redhat.com/sgrubb/audit/ | |||
| 1467 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git | 1466 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git |
| 1468 | S: Maintained | 1467 | S: Maintained |
| 1469 | F: include/linux/audit.h | 1468 | F: include/linux/audit.h |
| 1469 | F: include/uapi/linux/audit.h | ||
| 1470 | F: kernel/audit* | 1470 | F: kernel/audit* |
| 1471 | 1471 | ||
| 1472 | AUXILIARY DISPLAY DRIVERS | 1472 | AUXILIARY DISPLAY DRIVERS |
| @@ -1497,7 +1497,7 @@ M: Ralf Baechle <ralf@linux-mips.org> | |||
| 1497 | L: linux-hams@vger.kernel.org | 1497 | L: linux-hams@vger.kernel.org |
| 1498 | W: http://www.linux-ax25.org/ | 1498 | W: http://www.linux-ax25.org/ |
| 1499 | S: Maintained | 1499 | S: Maintained |
| 1500 | F: include/linux/ax25.h | 1500 | F: include/uapi/linux/ax25.h |
| 1501 | F: include/net/ax25.h | 1501 | F: include/net/ax25.h |
| 1502 | F: net/ax25/ | 1502 | F: net/ax25/ |
| 1503 | 1503 | ||
| @@ -1558,7 +1558,7 @@ M: "Tigran A. Aivazian" <tigran@aivazian.fsnet.co.uk> | |||
| 1558 | S: Maintained | 1558 | S: Maintained |
| 1559 | F: Documentation/filesystems/bfs.txt | 1559 | F: Documentation/filesystems/bfs.txt |
| 1560 | F: fs/bfs/ | 1560 | F: fs/bfs/ |
| 1561 | F: include/linux/bfs_fs.h | 1561 | F: include/uapi/linux/bfs_fs.h |
| 1562 | 1562 | ||
| 1563 | BLACKFIN ARCHITECTURE | 1563 | BLACKFIN ARCHITECTURE |
| 1564 | M: Mike Frysinger <vapier@gentoo.org> | 1564 | M: Mike Frysinger <vapier@gentoo.org> |
| @@ -1655,7 +1655,7 @@ L: netdev@vger.kernel.org | |||
| 1655 | W: http://sourceforge.net/projects/bonding/ | 1655 | W: http://sourceforge.net/projects/bonding/ |
| 1656 | S: Supported | 1656 | S: Supported |
| 1657 | F: drivers/net/bonding/ | 1657 | F: drivers/net/bonding/ |
| 1658 | F: include/linux/if_bonding.h | 1658 | F: include/uapi/linux/if_bonding.h |
| 1659 | 1659 | ||
| 1660 | BROADCOM B44 10/100 ETHERNET DRIVER | 1660 | BROADCOM B44 10/100 ETHERNET DRIVER |
| 1661 | M: Gary Zambrano <zambrano@broadcom.com> | 1661 | M: Gary Zambrano <zambrano@broadcom.com> |
| @@ -1734,6 +1734,7 @@ L: linux-scsi@vger.kernel.org | |||
| 1734 | S: Supported | 1734 | S: Supported |
| 1735 | F: block/bsg.c | 1735 | F: block/bsg.c |
| 1736 | F: include/linux/bsg.h | 1736 | F: include/linux/bsg.h |
| 1737 | F: include/uapi/linux/bsg.h | ||
| 1737 | 1738 | ||
| 1738 | BT87X AUDIO DRIVER | 1739 | BT87X AUDIO DRIVER |
| 1739 | M: Clemens Ladisch <clemens@ladisch.de> | 1740 | M: Clemens Ladisch <clemens@ladisch.de> |
| @@ -1804,7 +1805,7 @@ L: netdev@vger.kernel.org | |||
| 1804 | S: Supported | 1805 | S: Supported |
| 1805 | F: Documentation/networking/caif/ | 1806 | F: Documentation/networking/caif/ |
| 1806 | F: drivers/net/caif/ | 1807 | F: drivers/net/caif/ |
| 1807 | F: include/linux/caif/ | 1808 | F: include/uapi/linux/caif/ |
| 1808 | F: include/net/caif/ | 1809 | F: include/net/caif/ |
| 1809 | F: net/caif/ | 1810 | F: net/caif/ |
| 1810 | 1811 | ||
| @@ -1825,11 +1826,11 @@ W: http://gitorious.org/linux-can | |||
| 1825 | T: git git://gitorious.org/linux-can/linux-can-next.git | 1826 | T: git git://gitorious.org/linux-can/linux-can-next.git |
| 1826 | S: Maintained | 1827 | S: Maintained |
| 1827 | F: net/can/ | 1828 | F: net/can/ |
| 1828 | F: include/linux/can.h | ||
| 1829 | F: include/linux/can/core.h | 1829 | F: include/linux/can/core.h |
| 1830 | F: include/linux/can/bcm.h | 1830 | F: include/uapi/linux/can.h |
| 1831 | F: include/linux/can/raw.h | 1831 | F: include/uapi/linux/can/bcm.h |
| 1832 | F: include/linux/can/gw.h | 1832 | F: include/uapi/linux/can/raw.h |
| 1833 | F: include/uapi/linux/can/gw.h | ||
| 1833 | 1834 | ||
| 1834 | CAN NETWORK DRIVERS | 1835 | CAN NETWORK DRIVERS |
| 1835 | M: Wolfgang Grandegger <wg@grandegger.com> | 1836 | M: Wolfgang Grandegger <wg@grandegger.com> |
| @@ -1840,15 +1841,16 @@ T: git git://gitorious.org/linux-can/linux-can-next.git | |||
| 1840 | S: Maintained | 1841 | S: Maintained |
| 1841 | F: drivers/net/can/ | 1842 | F: drivers/net/can/ |
| 1842 | F: include/linux/can/dev.h | 1843 | F: include/linux/can/dev.h |
| 1843 | F: include/linux/can/error.h | ||
| 1844 | F: include/linux/can/netlink.h | ||
| 1845 | F: include/linux/can/platform/ | 1844 | F: include/linux/can/platform/ |
| 1845 | F: include/uapi/linux/can/error.h | ||
| 1846 | F: include/uapi/linux/can/netlink.h | ||
| 1846 | 1847 | ||
| 1847 | CAPABILITIES | 1848 | CAPABILITIES |
| 1848 | M: Serge Hallyn <serge.hallyn@canonical.com> | 1849 | M: Serge Hallyn <serge.hallyn@canonical.com> |
| 1849 | L: linux-security-module@vger.kernel.org | 1850 | L: linux-security-module@vger.kernel.org |
| 1850 | S: Supported | 1851 | S: Supported |
| 1851 | F: include/linux/capability.h | 1852 | F: include/linux/capability.h |
| 1853 | F: include/uapi/linux/capability.h | ||
| 1852 | F: security/capability.c | 1854 | F: security/capability.c |
| 1853 | F: security/commoncap.c | 1855 | F: security/commoncap.c |
| 1854 | F: kernel/capability.c | 1856 | F: kernel/capability.c |
| @@ -1861,6 +1863,7 @@ W: http://www.ibm.com/developerworks/power/cell/ | |||
| 1861 | S: Supported | 1863 | S: Supported |
| 1862 | F: arch/powerpc/include/asm/cell*.h | 1864 | F: arch/powerpc/include/asm/cell*.h |
| 1863 | F: arch/powerpc/include/asm/spu*.h | 1865 | F: arch/powerpc/include/asm/spu*.h |
| 1866 | F: arch/powerpc/include/uapi/asm/spu*.h | ||
| 1864 | F: arch/powerpc/oprofile/*cell* | 1867 | F: arch/powerpc/oprofile/*cell* |
| 1865 | F: arch/powerpc/platforms/cell/ | 1868 | F: arch/powerpc/platforms/cell/ |
| 1866 | 1869 | ||
| @@ -1909,7 +1912,7 @@ W: http://wireless.kernel.org/ | |||
| 1909 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git | 1912 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git |
| 1910 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git | 1913 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git |
| 1911 | S: Maintained | 1914 | S: Maintained |
| 1912 | F: include/linux/nl80211.h | 1915 | F: include/uapi/linux/nl80211.h |
| 1913 | F: include/net/cfg80211.h | 1916 | F: include/net/cfg80211.h |
| 1914 | F: net/wireless/* | 1917 | F: net/wireless/* |
| 1915 | X: net/wireless/wext* | 1918 | X: net/wireless/wext* |
| @@ -2012,6 +2015,7 @@ S: Maintained | |||
| 2012 | F: Documentation/filesystems/coda.txt | 2015 | F: Documentation/filesystems/coda.txt |
| 2013 | F: fs/coda/ | 2016 | F: fs/coda/ |
| 2014 | F: include/linux/coda*.h | 2017 | F: include/linux/coda*.h |
| 2018 | F: include/uapi/linux/coda*.h | ||
| 2015 | 2019 | ||
| 2016 | COMMON CLK FRAMEWORK | 2020 | COMMON CLK FRAMEWORK |
| 2017 | M: Mike Turquette <mturquette@linaro.org> | 2021 | M: Mike Turquette <mturquette@linaro.org> |
| @@ -2266,6 +2270,7 @@ W: http://www.cyclades.com/ | |||
| 2266 | S: Orphan | 2270 | S: Orphan |
| 2267 | F: drivers/tty/cyclades.c | 2271 | F: drivers/tty/cyclades.c |
| 2268 | F: include/linux/cyclades.h | 2272 | F: include/linux/cyclades.h |
| 2273 | F: include/uapi/linux/cyclades.h | ||
| 2269 | 2274 | ||
| 2270 | CYCLADES PC300 DRIVER | 2275 | CYCLADES PC300 DRIVER |
| 2271 | W: http://www.cyclades.com/ | 2276 | W: http://www.cyclades.com/ |
| @@ -2323,6 +2328,7 @@ L: dccp@vger.kernel.org | |||
| 2323 | W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp | 2328 | W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp |
| 2324 | S: Maintained | 2329 | S: Maintained |
| 2325 | F: include/linux/dccp.h | 2330 | F: include/linux/dccp.h |
| 2331 | F: include/uapi/linux/dccp.h | ||
| 2326 | F: include/linux/tfrc.h | 2332 | F: include/linux/tfrc.h |
| 2327 | F: net/dccp/ | 2333 | F: net/dccp/ |
| 2328 | 2334 | ||
| @@ -2349,7 +2355,7 @@ M: Massimo Dal Zotto <dz@debian.org> | |||
| 2349 | W: http://www.debian.org/~dz/i8k/ | 2355 | W: http://www.debian.org/~dz/i8k/ |
| 2350 | S: Maintained | 2356 | S: Maintained |
| 2351 | F: drivers/char/i8k.c | 2357 | F: drivers/char/i8k.c |
| 2352 | F: include/linux/i8k.h | 2358 | F: include/uapi/linux/i8k.h |
| 2353 | 2359 | ||
| 2354 | DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) | 2360 | DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) |
| 2355 | M: Doug Warzecha <Douglas_Warzecha@dell.com> | 2361 | M: Doug Warzecha <Douglas_Warzecha@dell.com> |
| @@ -2422,6 +2428,7 @@ S: Maintained | |||
| 2422 | F: Documentation/filesystems/quota.txt | 2428 | F: Documentation/filesystems/quota.txt |
| 2423 | F: fs/quota/ | 2429 | F: fs/quota/ |
| 2424 | F: include/linux/quota*.h | 2430 | F: include/linux/quota*.h |
| 2431 | F: include/uapi/linux/quota*.h | ||
| 2425 | 2432 | ||
| 2426 | DISPLAYLINK USB 2.0 FRAMEBUFFER DRIVER (UDLFB) | 2433 | DISPLAYLINK USB 2.0 FRAMEBUFFER DRIVER (UDLFB) |
| 2427 | M: Bernie Thompson <bernie@plugable.com> | 2434 | M: Bernie Thompson <bernie@plugable.com> |
| @@ -2528,6 +2535,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git | |||
| 2528 | S: Maintained | 2535 | S: Maintained |
| 2529 | F: drivers/gpu/drm/ | 2536 | F: drivers/gpu/drm/ |
| 2530 | F: include/drm/ | 2537 | F: include/drm/ |
| 2538 | F: include/uapi/drm/ | ||
| 2531 | 2539 | ||
| 2532 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) | 2540 | INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets) |
| 2533 | M: Daniel Vetter <daniel.vetter@ffwll.ch> | 2541 | M: Daniel Vetter <daniel.vetter@ffwll.ch> |
| @@ -2537,6 +2545,7 @@ T: git git://people.freedesktop.org/~danvet/drm-intel | |||
| 2537 | S: Supported | 2545 | S: Supported |
| 2538 | F: drivers/gpu/drm/i915 | 2546 | F: drivers/gpu/drm/i915 |
| 2539 | F: include/drm/i915* | 2547 | F: include/drm/i915* |
| 2548 | F: include/uapi/drm/i915* | ||
| 2540 | 2549 | ||
| 2541 | DRM DRIVERS FOR EXYNOS | 2550 | DRM DRIVERS FOR EXYNOS |
| 2542 | M: Inki Dae <inki.dae@samsung.com> | 2551 | M: Inki Dae <inki.dae@samsung.com> |
| @@ -2548,6 +2557,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git | |||
| 2548 | S: Supported | 2557 | S: Supported |
| 2549 | F: drivers/gpu/drm/exynos | 2558 | F: drivers/gpu/drm/exynos |
| 2550 | F: include/drm/exynos* | 2559 | F: include/drm/exynos* |
| 2560 | F: include/uapi/drm/exynos* | ||
| 2551 | 2561 | ||
| 2552 | DRM DRIVERS FOR NVIDIA TEGRA | 2562 | DRM DRIVERS FOR NVIDIA TEGRA |
| 2553 | M: Thierry Reding <thierry.reding@avionic-design.de> | 2563 | M: Thierry Reding <thierry.reding@avionic-design.de> |
| @@ -2622,7 +2632,7 @@ W: http://github.com/mkrufky | |||
| 2622 | Q: http://patchwork.linuxtv.org/project/linux-media/list/ | 2632 | Q: http://patchwork.linuxtv.org/project/linux-media/list/ |
| 2623 | T: git git://linuxtv.org/media_tree.git | 2633 | T: git git://linuxtv.org/media_tree.git |
| 2624 | S: Maintained | 2634 | S: Maintained |
| 2625 | F: drivers/media/usb/dvb-usb-v2/cxusb* | 2635 | F: drivers/media/usb/dvb-usb/cxusb* |
| 2626 | 2636 | ||
| 2627 | DVB_USB_CYPRESS_FIRMWARE MEDIA DRIVER | 2637 | DVB_USB_CYPRESS_FIRMWARE MEDIA DRIVER |
| 2628 | M: Antti Palosaari <crope@iki.fi> | 2638 | M: Antti Palosaari <crope@iki.fi> |
| @@ -2722,6 +2732,7 @@ L: netfilter-devel@vger.kernel.org | |||
| 2722 | W: http://ebtables.sourceforge.net/ | 2732 | W: http://ebtables.sourceforge.net/ |
| 2723 | S: Maintained | 2733 | S: Maintained |
| 2724 | F: include/linux/netfilter_bridge/ebt_*.h | 2734 | F: include/linux/netfilter_bridge/ebt_*.h |
| 2735 | F: include/uapi/linux/netfilter_bridge/ebt_*.h | ||
| 2725 | F: net/bridge/netfilter/ebt*.c | 2736 | F: net/bridge/netfilter/ebt*.c |
| 2726 | 2737 | ||
| 2727 | EC100 MEDIA DRIVER | 2738 | EC100 MEDIA DRIVER |
| @@ -2933,12 +2944,6 @@ M: Maxim Levitsky <maximlevitsky@gmail.com> | |||
| 2933 | S: Maintained | 2944 | S: Maintained |
| 2934 | F: drivers/media/rc/ene_ir.* | 2945 | F: drivers/media/rc/ene_ir.* |
| 2935 | 2946 | ||
| 2936 | EPSON 1355 FRAMEBUFFER DRIVER | ||
| 2937 | M: Christopher Hoover <ch@murgatroid.com> | ||
| 2938 | M: Christopher Hoover <ch@hpl.hp.com> | ||
| 2939 | S: Maintained | ||
| 2940 | F: drivers/video/epson1355fb.c | ||
| 2941 | |||
| 2942 | EPSON S1D13XXX FRAMEBUFFER DRIVER | 2947 | EPSON S1D13XXX FRAMEBUFFER DRIVER |
| 2943 | M: Kristoffer Ericson <kristoffer.ericson@gmail.com> | 2948 | M: Kristoffer Ericson <kristoffer.ericson@gmail.com> |
| 2944 | S: Maintained | 2949 | S: Maintained |
| @@ -3051,6 +3056,7 @@ M: Eric Paris <eparis@redhat.com> | |||
| 3051 | S: Maintained | 3056 | S: Maintained |
| 3052 | F: fs/notify/fanotify/ | 3057 | F: fs/notify/fanotify/ |
| 3053 | F: include/linux/fanotify.h | 3058 | F: include/linux/fanotify.h |
| 3059 | F: include/uapi/linux/fanotify.h | ||
| 3054 | 3060 | ||
| 3055 | FARSYNC SYNCHRONOUS DRIVER | 3061 | FARSYNC SYNCHRONOUS DRIVER |
| 3056 | M: Kevin Curtis <kevin.curtis@farsite.co.uk> | 3062 | M: Kevin Curtis <kevin.curtis@farsite.co.uk> |
| @@ -3074,6 +3080,7 @@ F: drivers/scsi/fcoe/ | |||
| 3074 | F: include/scsi/fc/ | 3080 | F: include/scsi/fc/ |
| 3075 | F: include/scsi/libfc.h | 3081 | F: include/scsi/libfc.h |
| 3076 | F: include/scsi/libfcoe.h | 3082 | F: include/scsi/libfcoe.h |
| 3083 | F: include/uapi/scsi/fc/ | ||
| 3077 | 3084 | ||
| 3078 | FILE LOCKING (flock() and fcntl()/lockf()) | 3085 | FILE LOCKING (flock() and fcntl()/lockf()) |
| 3079 | M: Matthew Wilcox <matthew@wil.cx> | 3086 | M: Matthew Wilcox <matthew@wil.cx> |
| @@ -3081,6 +3088,8 @@ L: linux-fsdevel@vger.kernel.org | |||
| 3081 | S: Maintained | 3088 | S: Maintained |
| 3082 | F: include/linux/fcntl.h | 3089 | F: include/linux/fcntl.h |
| 3083 | F: include/linux/fs.h | 3090 | F: include/linux/fs.h |
| 3091 | F: include/uapi/linux/fcntl.h | ||
| 3092 | F: include/uapi/linux/fs.h | ||
| 3084 | F: fs/fcntl.c | 3093 | F: fs/fcntl.c |
| 3085 | F: fs/locks.c | 3094 | F: fs/locks.c |
| 3086 | 3095 | ||
| @@ -3170,6 +3179,8 @@ F: Documentation/devicetree/bindings/fb/ | |||
| 3170 | F: drivers/video/ | 3179 | F: drivers/video/ |
| 3171 | F: include/video/ | 3180 | F: include/video/ |
| 3172 | F: include/linux/fb.h | 3181 | F: include/linux/fb.h |
| 3182 | F: include/uapi/video/ | ||
| 3183 | F: include/uapi/linux/fb.h | ||
| 3173 | 3184 | ||
| 3174 | FREESCALE DIU FRAMEBUFFER DRIVER | 3185 | FREESCALE DIU FRAMEBUFFER DRIVER |
| 3175 | M: Timur Tabi <timur@freescale.com> | 3186 | M: Timur Tabi <timur@freescale.com> |
| @@ -3196,7 +3207,7 @@ M: Sascha Hauer <kernel@pengutronix.de> | |||
| 3196 | L: linux-fbdev@vger.kernel.org | 3207 | L: linux-fbdev@vger.kernel.org |
| 3197 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 3208 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 3198 | S: Maintained | 3209 | S: Maintained |
| 3199 | F: arch/arm/plat-mxc/include/mach/imxfb.h | 3210 | F: include/linux/platform_data/video-imxfb.h |
| 3200 | F: drivers/video/imxfb.c | 3211 | F: drivers/video/imxfb.c |
| 3201 | 3212 | ||
| 3202 | FREESCALE SOC FS_ENET DRIVER | 3213 | FREESCALE SOC FS_ENET DRIVER |
| @@ -3314,7 +3325,7 @@ L: fuse-devel@lists.sourceforge.net | |||
| 3314 | W: http://fuse.sourceforge.net/ | 3325 | W: http://fuse.sourceforge.net/ |
| 3315 | S: Maintained | 3326 | S: Maintained |
| 3316 | F: fs/fuse/ | 3327 | F: fs/fuse/ |
| 3317 | F: include/linux/fuse.h | 3328 | F: include/uapi/linux/fuse.h |
| 3318 | 3329 | ||
| 3319 | FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit) | 3330 | FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit) |
| 3320 | M: Rik Faith <faith@cs.unc.edu> | 3331 | M: Rik Faith <faith@cs.unc.edu> |
| @@ -3361,6 +3372,7 @@ L: linux-arch@vger.kernel.org | |||
| 3361 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git | 3372 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git |
| 3362 | S: Maintained | 3373 | S: Maintained |
| 3363 | F: include/asm-generic | 3374 | F: include/asm-generic |
| 3375 | F: include/uapi/asm-generic | ||
| 3364 | 3376 | ||
| 3365 | GENERIC UIO DRIVER FOR PCI DEVICES | 3377 | GENERIC UIO DRIVER FOR PCI DEVICES |
| 3366 | M: "Michael S. Tsirkin" <mst@redhat.com> | 3378 | M: "Michael S. Tsirkin" <mst@redhat.com> |
| @@ -3377,7 +3389,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw.git | |||
| 3377 | S: Supported | 3389 | S: Supported |
| 3378 | F: Documentation/filesystems/gfs2*.txt | 3390 | F: Documentation/filesystems/gfs2*.txt |
| 3379 | F: fs/gfs2/ | 3391 | F: fs/gfs2/ |
| 3380 | F: include/linux/gfs2_ondisk.h | 3392 | F: include/uapi/linux/gfs2_ondisk.h |
| 3381 | 3393 | ||
| 3382 | GIGASET ISDN DRIVERS | 3394 | GIGASET ISDN DRIVERS |
| 3383 | M: Hansjoerg Lipp <hjlipp@web.de> | 3395 | M: Hansjoerg Lipp <hjlipp@web.de> |
| @@ -3387,7 +3399,7 @@ W: http://gigaset307x.sourceforge.net/ | |||
| 3387 | S: Maintained | 3399 | S: Maintained |
| 3388 | F: Documentation/isdn/README.gigaset | 3400 | F: Documentation/isdn/README.gigaset |
| 3389 | F: drivers/isdn/gigaset/ | 3401 | F: drivers/isdn/gigaset/ |
| 3390 | F: include/linux/gigaset_dev.h | 3402 | F: include/uapi/linux/gigaset_dev.h |
| 3391 | 3403 | ||
| 3392 | GPIO SUBSYSTEM | 3404 | GPIO SUBSYSTEM |
| 3393 | M: Grant Likely <grant.likely@secretlab.ca> | 3405 | M: Grant Likely <grant.likely@secretlab.ca> |
| @@ -3544,6 +3556,7 @@ S: Supported | |||
| 3544 | F: Documentation/scsi/hpsa.txt | 3556 | F: Documentation/scsi/hpsa.txt |
| 3545 | F: drivers/scsi/hpsa*.[ch] | 3557 | F: drivers/scsi/hpsa*.[ch] |
| 3546 | F: include/linux/cciss*.h | 3558 | F: include/linux/cciss*.h |
| 3559 | F: include/uapi/linux/cciss*.h | ||
| 3547 | 3560 | ||
| 3548 | HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss) | 3561 | HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss) |
| 3549 | M: Mike Miller <mike.miller@hp.com> | 3562 | M: Mike Miller <mike.miller@hp.com> |
| @@ -3552,6 +3565,7 @@ S: Supported | |||
| 3552 | F: Documentation/blockdev/cciss.txt | 3565 | F: Documentation/blockdev/cciss.txt |
| 3553 | F: drivers/block/cciss* | 3566 | F: drivers/block/cciss* |
| 3554 | F: include/linux/cciss_ioctl.h | 3567 | F: include/linux/cciss_ioctl.h |
| 3568 | F: include/uapi/linux/cciss_ioctl.h | ||
| 3555 | 3569 | ||
| 3556 | HFS FILESYSTEM | 3570 | HFS FILESYSTEM |
| 3557 | L: linux-fsdevel@vger.kernel.org | 3571 | L: linux-fsdevel@vger.kernel.org |
| @@ -3586,6 +3600,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git | |||
| 3586 | S: Maintained | 3600 | S: Maintained |
| 3587 | F: drivers/hid/ | 3601 | F: drivers/hid/ |
| 3588 | F: include/linux/hid* | 3602 | F: include/linux/hid* |
| 3603 | F: include/uapi/linux/hid* | ||
| 3589 | 3604 | ||
| 3590 | HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS | 3605 | HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS |
| 3591 | M: Thomas Gleixner <tglx@linutronix.de> | 3606 | M: Thomas Gleixner <tglx@linutronix.de> |
| @@ -3617,7 +3632,7 @@ M: Jes Sorensen <jes@trained-monkey.org> | |||
| 3617 | L: linux-hippi@sunsite.dk | 3632 | L: linux-hippi@sunsite.dk |
| 3618 | S: Maintained | 3633 | S: Maintained |
| 3619 | F: include/linux/hippidevice.h | 3634 | F: include/linux/hippidevice.h |
| 3620 | F: include/linux/if_hippi.h | 3635 | F: include/uapi/linux/if_hippi.h |
| 3621 | F: net/802/hippi.c | 3636 | F: net/802/hippi.c |
| 3622 | F: drivers/net/hippi/ | 3637 | F: drivers/net/hippi/ |
| 3623 | 3638 | ||
| @@ -3645,6 +3660,7 @@ S: Maintained | |||
| 3645 | F: Documentation/timers/hpet.txt | 3660 | F: Documentation/timers/hpet.txt |
| 3646 | F: drivers/char/hpet.c | 3661 | F: drivers/char/hpet.c |
| 3647 | F: include/linux/hpet.h | 3662 | F: include/linux/hpet.h |
| 3663 | F: include/uapi/linux/hpet.h | ||
| 3648 | 3664 | ||
| 3649 | HPET: x86 | 3665 | HPET: x86 |
| 3650 | M: "Venkatesh Pallipadi (Venki)" <venki@google.com> | 3666 | M: "Venkatesh Pallipadi (Venki)" <venki@google.com> |
| @@ -3745,6 +3761,8 @@ F: Documentation/i2c/ | |||
| 3745 | F: drivers/i2c/ | 3761 | F: drivers/i2c/ |
| 3746 | F: include/linux/i2c.h | 3762 | F: include/linux/i2c.h |
| 3747 | F: include/linux/i2c-*.h | 3763 | F: include/linux/i2c-*.h |
| 3764 | F: include/uapi/linux/i2c.h | ||
| 3765 | F: include/uapi/linux/i2c-*.h | ||
| 3748 | 3766 | ||
| 3749 | I2C-TAOS-EVM DRIVER | 3767 | I2C-TAOS-EVM DRIVER |
| 3750 | M: Jean Delvare <khali@linux-fr.org> | 3768 | M: Jean Delvare <khali@linux-fr.org> |
| @@ -3860,7 +3878,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git | |||
| 3860 | S: Maintained | 3878 | S: Maintained |
| 3861 | F: net/ieee802154/ | 3879 | F: net/ieee802154/ |
| 3862 | F: net/mac802154/ | 3880 | F: net/mac802154/ |
| 3863 | F: drivers/ieee802154/ | 3881 | F: drivers/net/ieee802154/ |
| 3864 | 3882 | ||
| 3865 | IGUANAWORKS USB IR TRANSCEIVER | 3883 | IGUANAWORKS USB IR TRANSCEIVER |
| 3866 | M: Sean Young <sean@mess.org> | 3884 | M: Sean Young <sean@mess.org> |
| @@ -3911,7 +3929,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git | |||
| 3911 | S: Supported | 3929 | S: Supported |
| 3912 | F: Documentation/infiniband/ | 3930 | F: Documentation/infiniband/ |
| 3913 | F: drivers/infiniband/ | 3931 | F: drivers/infiniband/ |
| 3914 | F: include/linux/if_infiniband.h | 3932 | F: include/uapi/linux/if_infiniband.h |
| 3915 | 3933 | ||
| 3916 | INOTIFY | 3934 | INOTIFY |
| 3917 | M: John McCutchan <john@johnmccutchan.com> | 3935 | M: John McCutchan <john@johnmccutchan.com> |
| @@ -3921,6 +3939,7 @@ S: Maintained | |||
| 3921 | F: Documentation/filesystems/inotify.txt | 3939 | F: Documentation/filesystems/inotify.txt |
| 3922 | F: fs/notify/inotify/ | 3940 | F: fs/notify/inotify/ |
| 3923 | F: include/linux/inotify.h | 3941 | F: include/linux/inotify.h |
| 3942 | F: include/uapi/linux/inotify.h | ||
| 3924 | 3943 | ||
| 3925 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS | 3944 | INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS |
| 3926 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> | 3945 | M: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| @@ -3931,6 +3950,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git | |||
| 3931 | S: Maintained | 3950 | S: Maintained |
| 3932 | F: drivers/input/ | 3951 | F: drivers/input/ |
| 3933 | F: include/linux/input.h | 3952 | F: include/linux/input.h |
| 3953 | F: include/uapi/linux/input.h | ||
| 3934 | F: include/linux/input/ | 3954 | F: include/linux/input/ |
| 3935 | 3955 | ||
| 3936 | INPUT MULTITOUCH (MT) PROTOCOL | 3956 | INPUT MULTITOUCH (MT) PROTOCOL |
| @@ -3951,7 +3971,6 @@ L: linux-scsi@vger.kernel.org | |||
| 3951 | T: git git://git.code.sf.net/p/intel-sas/isci | 3971 | T: git git://git.code.sf.net/p/intel-sas/isci |
| 3952 | S: Supported | 3972 | S: Supported |
| 3953 | F: drivers/scsi/isci/ | 3973 | F: drivers/scsi/isci/ |
| 3954 | F: firmware/isci/ | ||
| 3955 | 3974 | ||
| 3956 | INTEL IDLE DRIVER | 3975 | INTEL IDLE DRIVER |
| 3957 | M: Len Brown <lenb@kernel.org> | 3976 | M: Len Brown <lenb@kernel.org> |
| @@ -4046,12 +4065,6 @@ F: Documentation/networking/ixgbe.txt | |||
| 4046 | F: Documentation/networking/ixgbevf.txt | 4065 | F: Documentation/networking/ixgbevf.txt |
| 4047 | F: drivers/net/ethernet/intel/ | 4066 | F: drivers/net/ethernet/intel/ |
| 4048 | 4067 | ||
| 4049 | INTEL MRST PMU DRIVER | ||
| 4050 | M: Len Brown <len.brown@intel.com> | ||
| 4051 | L: linux-pm@vger.kernel.org | ||
| 4052 | S: Supported | ||
| 4053 | F: arch/x86/platform/mrst/pmu.* | ||
| 4054 | |||
| 4055 | INTEL PRO/WIRELESS 2100, 2200BG, 2915ABG NETWORK CONNECTION SUPPORT | 4068 | INTEL PRO/WIRELESS 2100, 2200BG, 2915ABG NETWORK CONNECTION SUPPORT |
| 4056 | M: Stanislav Yakovlev <stas.yakovlev@gmail.com> | 4069 | M: Stanislav Yakovlev <stas.yakovlev@gmail.com> |
| 4057 | L: linux-wireless@vger.kernel.org | 4070 | L: linux-wireless@vger.kernel.org |
| @@ -4080,7 +4093,7 @@ S: Supported | |||
| 4080 | W: http://linuxwimax.org | 4093 | W: http://linuxwimax.org |
| 4081 | F: Documentation/wimax/README.i2400m | 4094 | F: Documentation/wimax/README.i2400m |
| 4082 | F: drivers/net/wimax/i2400m/ | 4095 | F: drivers/net/wimax/i2400m/ |
| 4083 | F: include/linux/wimax/i2400m.h | 4096 | F: include/uapi/linux/wimax/i2400m.h |
| 4084 | 4097 | ||
| 4085 | INTEL WIRELESS 3945ABG/BG, 4965AGN (iwlegacy) | 4098 | INTEL WIRELESS 3945ABG/BG, 4965AGN (iwlegacy) |
| 4086 | M: Stanislaw Gruszka <sgruszka@redhat.com> | 4099 | M: Stanislaw Gruszka <sgruszka@redhat.com> |
| @@ -4102,9 +4115,9 @@ INTEL MANAGEMENT ENGINE (mei) | |||
| 4102 | M: Tomas Winkler <tomas.winkler@intel.com> | 4115 | M: Tomas Winkler <tomas.winkler@intel.com> |
| 4103 | L: linux-kernel@vger.kernel.org | 4116 | L: linux-kernel@vger.kernel.org |
| 4104 | S: Supported | 4117 | S: Supported |
| 4105 | F: include/linux/mei.h | 4118 | F: include/uapi/linux/mei.h |
| 4106 | F: drivers/misc/mei/* | 4119 | F: drivers/misc/mei/* |
| 4107 | F: Documentation/mei/* | 4120 | F: Documentation/misc-devices/mei/* |
| 4108 | 4121 | ||
| 4109 | IOC3 ETHERNET DRIVER | 4122 | IOC3 ETHERNET DRIVER |
| 4110 | M: Ralf Baechle <ralf@linux-mips.org> | 4123 | M: Ralf Baechle <ralf@linux-mips.org> |
| @@ -4144,6 +4157,7 @@ S: Supported | |||
| 4144 | F: Documentation/IPMI.txt | 4157 | F: Documentation/IPMI.txt |
| 4145 | F: drivers/char/ipmi/ | 4158 | F: drivers/char/ipmi/ |
| 4146 | F: include/linux/ipmi* | 4159 | F: include/linux/ipmi* |
| 4160 | F: include/uapi/linux/ipmi* | ||
| 4147 | 4161 | ||
| 4148 | IPS SCSI RAID DRIVER | 4162 | IPS SCSI RAID DRIVER |
| 4149 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> | 4163 | M: Adaptec OEM Raid Solutions <aacraid@adaptec.com> |
| @@ -4161,7 +4175,7 @@ L: lvs-devel@vger.kernel.org | |||
| 4161 | S: Maintained | 4175 | S: Maintained |
| 4162 | F: Documentation/networking/ipvs-sysctl.txt | 4176 | F: Documentation/networking/ipvs-sysctl.txt |
| 4163 | F: include/net/ip_vs.h | 4177 | F: include/net/ip_vs.h |
| 4164 | F: include/linux/ip_vs.h | 4178 | F: include/uapi/linux/ip_vs.h |
| 4165 | F: net/netfilter/ipvs/ | 4179 | F: net/netfilter/ipvs/ |
| 4166 | 4180 | ||
| 4167 | IPWIRELESS DRIVER | 4181 | IPWIRELESS DRIVER |
| @@ -4174,8 +4188,8 @@ IPX NETWORK LAYER | |||
| 4174 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 4188 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
| 4175 | L: netdev@vger.kernel.org | 4189 | L: netdev@vger.kernel.org |
| 4176 | S: Maintained | 4190 | S: Maintained |
| 4177 | F: include/linux/ipx.h | ||
| 4178 | F: include/net/ipx.h | 4191 | F: include/net/ipx.h |
| 4192 | F: include/uapi/linux/ipx.h | ||
| 4179 | F: net/ipx/ | 4193 | F: net/ipx/ |
| 4180 | 4194 | ||
| 4181 | IRDA SUBSYSTEM | 4195 | IRDA SUBSYSTEM |
| @@ -4238,6 +4252,8 @@ F: Documentation/isdn/ | |||
| 4238 | F: drivers/isdn/ | 4252 | F: drivers/isdn/ |
| 4239 | F: include/linux/isdn.h | 4253 | F: include/linux/isdn.h |
| 4240 | F: include/linux/isdn/ | 4254 | F: include/linux/isdn/ |
| 4255 | F: include/uapi/linux/isdn.h | ||
| 4256 | F: include/uapi/linux/isdn/ | ||
| 4241 | 4257 | ||
| 4242 | ISDN SUBSYSTEM (Eicon active card driver) | 4258 | ISDN SUBSYSTEM (Eicon active card driver) |
| 4243 | M: Armin Schindler <mac@melware.de> | 4259 | M: Armin Schindler <mac@melware.de> |
| @@ -4278,7 +4294,7 @@ W: http://www.ivtvdriver.org | |||
| 4278 | S: Maintained | 4294 | S: Maintained |
| 4279 | F: Documentation/video4linux/*.ivtv | 4295 | F: Documentation/video4linux/*.ivtv |
| 4280 | F: drivers/media/pci/ivtv/ | 4296 | F: drivers/media/pci/ivtv/ |
| 4281 | F: include/linux/ivtv* | 4297 | F: include/uapi/linux/ivtv* |
| 4282 | 4298 | ||
| 4283 | IX2505V MEDIA DRIVER | 4299 | IX2505V MEDIA DRIVER |
| 4284 | M: Malcolm Priestley <tvboxspy@gmail.com> | 4300 | M: Malcolm Priestley <tvboxspy@gmail.com> |
| @@ -4316,7 +4332,7 @@ L: linux-mtd@lists.infradead.org | |||
| 4316 | W: http://www.linux-mtd.infradead.org/doc/jffs2.html | 4332 | W: http://www.linux-mtd.infradead.org/doc/jffs2.html |
| 4317 | S: Maintained | 4333 | S: Maintained |
| 4318 | F: fs/jffs2/ | 4334 | F: fs/jffs2/ |
| 4319 | F: include/linux/jffs2.h | 4335 | F: include/uapi/linux/jffs2.h |
| 4320 | 4336 | ||
| 4321 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) | 4337 | JOURNALLING LAYER FOR BLOCK DEVICES (JBD) |
| 4322 | M: Andrew Morton <akpm@linux-foundation.org> | 4338 | M: Andrew Morton <akpm@linux-foundation.org> |
| @@ -4399,11 +4415,13 @@ W: http://nfs.sourceforge.net/ | |||
| 4399 | S: Supported | 4415 | S: Supported |
| 4400 | F: fs/nfsd/ | 4416 | F: fs/nfsd/ |
| 4401 | F: include/linux/nfsd/ | 4417 | F: include/linux/nfsd/ |
| 4418 | F: include/uapi/linux/nfsd/ | ||
| 4402 | F: fs/lockd/ | 4419 | F: fs/lockd/ |
| 4403 | F: fs/nfs_common/ | 4420 | F: fs/nfs_common/ |
| 4404 | F: net/sunrpc/ | 4421 | F: net/sunrpc/ |
| 4405 | F: include/linux/lockd/ | 4422 | F: include/linux/lockd/ |
| 4406 | F: include/linux/sunrpc/ | 4423 | F: include/linux/sunrpc/ |
| 4424 | F: include/uapi/linux/sunrpc/ | ||
| 4407 | 4425 | ||
| 4408 | KERNEL VIRTUAL MACHINE (KVM) | 4426 | KERNEL VIRTUAL MACHINE (KVM) |
| 4409 | M: Marcelo Tosatti <mtosatti@redhat.com> | 4427 | M: Marcelo Tosatti <mtosatti@redhat.com> |
| @@ -4415,6 +4433,7 @@ F: Documentation/*/kvm.txt | |||
| 4415 | F: arch/*/kvm/ | 4433 | F: arch/*/kvm/ |
| 4416 | F: arch/*/include/asm/kvm* | 4434 | F: arch/*/include/asm/kvm* |
| 4417 | F: include/linux/kvm* | 4435 | F: include/linux/kvm* |
| 4436 | F: include/uapi/linux/kvm* | ||
| 4418 | F: virt/kvm/ | 4437 | F: virt/kvm/ |
| 4419 | 4438 | ||
| 4420 | KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V | 4439 | KERNEL VIRTUAL MACHINE (KVM) FOR AMD-V |
| @@ -4461,6 +4480,7 @@ W: http://kernel.org/pub/linux/utils/kernel/kexec/ | |||
| 4461 | L: kexec@lists.infradead.org | 4480 | L: kexec@lists.infradead.org |
| 4462 | S: Maintained | 4481 | S: Maintained |
| 4463 | F: include/linux/kexec.h | 4482 | F: include/linux/kexec.h |
| 4483 | F: include/uapi/linux/kexec.h | ||
| 4464 | F: kernel/kexec.c | 4484 | F: kernel/kexec.c |
| 4465 | 4485 | ||
| 4466 | KEYS/KEYRINGS: | 4486 | KEYS/KEYRINGS: |
| @@ -4702,6 +4722,7 @@ LLC (802.2) | |||
| 4702 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 4722 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
| 4703 | S: Maintained | 4723 | S: Maintained |
| 4704 | F: include/linux/llc.h | 4724 | F: include/linux/llc.h |
| 4725 | F: include/uapi/linux/llc.h | ||
| 4705 | F: include/net/llc* | 4726 | F: include/net/llc* |
| 4706 | F: net/llc/ | 4727 | F: net/llc/ |
| 4707 | 4728 | ||
| @@ -4922,7 +4943,7 @@ MATROX FRAMEBUFFER DRIVER | |||
| 4922 | L: linux-fbdev@vger.kernel.org | 4943 | L: linux-fbdev@vger.kernel.org |
| 4923 | S: Orphan | 4944 | S: Orphan |
| 4924 | F: drivers/video/matrox/matroxfb_* | 4945 | F: drivers/video/matrox/matroxfb_* |
| 4925 | F: include/linux/matroxfb.h | 4946 | F: include/uapi/linux/matroxfb.h |
| 4926 | 4947 | ||
| 4927 | MAX16065 HARDWARE MONITOR DRIVER | 4948 | MAX16065 HARDWARE MONITOR DRIVER |
| 4928 | M: Guenter Roeck <linux@roeck-us.net> | 4949 | M: Guenter Roeck <linux@roeck-us.net> |
| @@ -5004,7 +5025,7 @@ T: git git://git.infradead.org/mtd-2.6.git | |||
| 5004 | S: Maintained | 5025 | S: Maintained |
| 5005 | F: drivers/mtd/ | 5026 | F: drivers/mtd/ |
| 5006 | F: include/linux/mtd/ | 5027 | F: include/linux/mtd/ |
| 5007 | F: include/mtd/ | 5028 | F: include/uapi/mtd/ |
| 5008 | 5029 | ||
| 5009 | MICROBLAZE ARCHITECTURE | 5030 | MICROBLAZE ARCHITECTURE |
| 5010 | M: Michal Simek <monstr@monstr.eu> | 5031 | M: Michal Simek <monstr@monstr.eu> |
| @@ -5042,12 +5063,6 @@ F: Documentation/video4linux/meye.txt | |||
| 5042 | F: drivers/media/pci/meye/ | 5063 | F: drivers/media/pci/meye/ |
| 5043 | F: include/uapi/linux/meye.h | 5064 | F: include/uapi/linux/meye.h |
| 5044 | 5065 | ||
| 5045 | MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER | ||
| 5046 | M: Pavel Pisa <ppisa@pikron.com> | ||
| 5047 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
| 5048 | S: Maintained | ||
| 5049 | F: drivers/mmc/host/imxmmc.* | ||
| 5050 | |||
| 5051 | MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD | 5066 | MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD |
| 5052 | M: Jiri Slaby <jirislaby@gmail.com> | 5067 | M: Jiri Slaby <jirislaby@gmail.com> |
| 5053 | S: Maintained | 5068 | S: Maintained |
| @@ -5086,6 +5101,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git | |||
| 5086 | S: Maintained | 5101 | S: Maintained |
| 5087 | F: drivers/mmc/ | 5102 | F: drivers/mmc/ |
| 5088 | F: include/linux/mmc/ | 5103 | F: include/linux/mmc/ |
| 5104 | F: include/uapi/linux/mmc/ | ||
| 5089 | 5105 | ||
| 5090 | MULTIMEDIA CARD (MMC) ETC. OVER SPI | 5106 | MULTIMEDIA CARD (MMC) ETC. OVER SPI |
| 5091 | S: Orphan | 5107 | S: Orphan |
| @@ -5186,6 +5202,8 @@ S: Supported | |||
| 5186 | F: include/linux/netfilter* | 5202 | F: include/linux/netfilter* |
| 5187 | F: include/linux/netfilter/ | 5203 | F: include/linux/netfilter/ |
| 5188 | F: include/net/netfilter/ | 5204 | F: include/net/netfilter/ |
| 5205 | F: include/uapi/linux/netfilter* | ||
| 5206 | F: include/uapi/linux/netfilter/ | ||
| 5189 | F: net/*/netfilter.c | 5207 | F: net/*/netfilter.c |
| 5190 | F: net/*/netfilter/ | 5208 | F: net/*/netfilter/ |
| 5191 | F: net/netfilter/ | 5209 | F: net/netfilter/ |
| @@ -5204,8 +5222,8 @@ M: Ralf Baechle <ralf@linux-mips.org> | |||
| 5204 | L: linux-hams@vger.kernel.org | 5222 | L: linux-hams@vger.kernel.org |
| 5205 | W: http://www.linux-ax25.org/ | 5223 | W: http://www.linux-ax25.org/ |
| 5206 | S: Maintained | 5224 | S: Maintained |
| 5207 | F: include/linux/netrom.h | ||
| 5208 | F: include/net/netrom.h | 5225 | F: include/net/netrom.h |
| 5226 | F: include/uapi/linux/netrom.h | ||
| 5209 | F: net/netrom/ | 5227 | F: net/netrom/ |
| 5210 | 5228 | ||
| 5211 | NETWORK BLOCK DEVICE (NBD) | 5229 | NETWORK BLOCK DEVICE (NBD) |
| @@ -5214,6 +5232,7 @@ S: Maintained | |||
| 5214 | F: Documentation/blockdev/nbd.txt | 5232 | F: Documentation/blockdev/nbd.txt |
| 5215 | F: drivers/block/nbd.c | 5233 | F: drivers/block/nbd.c |
| 5216 | F: include/linux/nbd.h | 5234 | F: include/linux/nbd.h |
| 5235 | F: include/uapi/linux/nbd.h | ||
| 5217 | 5236 | ||
| 5218 | NETWORK DROP MONITOR | 5237 | NETWORK DROP MONITOR |
| 5219 | M: Neil Horman <nhorman@tuxdriver.com> | 5238 | M: Neil Horman <nhorman@tuxdriver.com> |
| @@ -5235,6 +5254,9 @@ F: include/net/ | |||
| 5235 | F: include/linux/in.h | 5254 | F: include/linux/in.h |
| 5236 | F: include/linux/net.h | 5255 | F: include/linux/net.h |
| 5237 | F: include/linux/netdevice.h | 5256 | F: include/linux/netdevice.h |
| 5257 | F: include/uapi/linux/in.h | ||
| 5258 | F: include/uapi/linux/net.h | ||
| 5259 | F: include/uapi/linux/netdevice.h | ||
| 5238 | 5260 | ||
| 5239 | NETWORKING [IPv4/IPv6] | 5261 | NETWORKING [IPv4/IPv6] |
| 5240 | M: "David S. Miller" <davem@davemloft.net> | 5262 | M: "David S. Miller" <davem@davemloft.net> |
| @@ -5280,6 +5302,7 @@ F: net/rfkill/ | |||
| 5280 | F: net/wireless/ | 5302 | F: net/wireless/ |
| 5281 | F: include/net/ieee80211* | 5303 | F: include/net/ieee80211* |
| 5282 | F: include/linux/wireless.h | 5304 | F: include/linux/wireless.h |
| 5305 | F: include/uapi/linux/wireless.h | ||
| 5283 | F: include/net/iw_handler.h | 5306 | F: include/net/iw_handler.h |
| 5284 | F: drivers/net/wireless/ | 5307 | F: drivers/net/wireless/ |
| 5285 | 5308 | ||
| @@ -5299,6 +5322,8 @@ F: include/linux/fcdevice.h | |||
| 5299 | F: include/linux/fddidevice.h | 5322 | F: include/linux/fddidevice.h |
| 5300 | F: include/linux/hippidevice.h | 5323 | F: include/linux/hippidevice.h |
| 5301 | F: include/linux/inetdevice.h | 5324 | F: include/linux/inetdevice.h |
| 5325 | F: include/uapi/linux/if_* | ||
| 5326 | F: include/uapi/linux/netdevice.h | ||
| 5302 | 5327 | ||
| 5303 | NETXEN (1/10) GbE SUPPORT | 5328 | NETXEN (1/10) GbE SUPPORT |
| 5304 | M: Sony Chacko <sony.chacko@qlogic.com> | 5329 | M: Sony Chacko <sony.chacko@qlogic.com> |
| @@ -5316,8 +5341,8 @@ L: linux-wireless@vger.kernel.org | |||
| 5316 | L: linux-nfc@lists.01.org (moderated for non-subscribers) | 5341 | L: linux-nfc@lists.01.org (moderated for non-subscribers) |
| 5317 | S: Maintained | 5342 | S: Maintained |
| 5318 | F: net/nfc/ | 5343 | F: net/nfc/ |
| 5319 | F: include/linux/nfc.h | ||
| 5320 | F: include/net/nfc/ | 5344 | F: include/net/nfc/ |
| 5345 | F: include/uapi/linux/nfc.h | ||
| 5321 | F: drivers/nfc/ | 5346 | F: drivers/nfc/ |
| 5322 | F: include/linux/platform_data/pn544.h | 5347 | F: include/linux/platform_data/pn544.h |
| 5323 | 5348 | ||
| @@ -5334,6 +5359,8 @@ F: net/sunrpc/ | |||
| 5334 | F: include/linux/lockd/ | 5359 | F: include/linux/lockd/ |
| 5335 | F: include/linux/nfs* | 5360 | F: include/linux/nfs* |
| 5336 | F: include/linux/sunrpc/ | 5361 | F: include/linux/sunrpc/ |
| 5362 | F: include/uapi/linux/nfs* | ||
| 5363 | F: include/uapi/linux/sunrpc/ | ||
| 5337 | 5364 | ||
| 5338 | NI5010 NETWORK DRIVER | 5365 | NI5010 NETWORK DRIVER |
| 5339 | M: Jan-Pascal van Best <janpascal@vanbest.org> | 5366 | M: Jan-Pascal van Best <janpascal@vanbest.org> |
| @@ -5523,6 +5550,7 @@ M: Harald Welte <laforge@gnumonks.org> | |||
| 5523 | S: Maintained | 5550 | S: Maintained |
| 5524 | F: drivers/char/pcmcia/cm4000_cs.c | 5551 | F: drivers/char/pcmcia/cm4000_cs.c |
| 5525 | F: include/linux/cm4000_cs.h | 5552 | F: include/linux/cm4000_cs.h |
| 5553 | F: include/uapi/linux/cm4000_cs.h | ||
| 5526 | 5554 | ||
| 5527 | OMNIKEY CARDMAN 4040 DRIVER | 5555 | OMNIKEY CARDMAN 4040 DRIVER |
| 5528 | M: Harald Welte <laforge@gnumonks.org> | 5556 | M: Harald Welte <laforge@gnumonks.org> |
| @@ -5681,7 +5709,7 @@ S: Orphan | |||
| 5681 | F: drivers/parport/ | 5709 | F: drivers/parport/ |
| 5682 | F: include/linux/parport*.h | 5710 | F: include/linux/parport*.h |
| 5683 | F: drivers/char/ppdev.c | 5711 | F: drivers/char/ppdev.c |
| 5684 | F: include/linux/ppdev.h | 5712 | F: include/uapi/linux/ppdev.h |
| 5685 | 5713 | ||
| 5686 | PARAVIRT_OPS INTERFACE | 5714 | PARAVIRT_OPS INTERFACE |
| 5687 | M: Jeremy Fitzhardinge <jeremy@goop.org> | 5715 | M: Jeremy Fitzhardinge <jeremy@goop.org> |
| @@ -5822,11 +5850,11 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core | |||
| 5822 | S: Supported | 5850 | S: Supported |
| 5823 | F: kernel/events/* | 5851 | F: kernel/events/* |
| 5824 | F: include/linux/perf_event.h | 5852 | F: include/linux/perf_event.h |
| 5853 | F: include/uapi/linux/perf_event.h | ||
| 5825 | F: arch/*/kernel/perf_event*.c | 5854 | F: arch/*/kernel/perf_event*.c |
| 5826 | F: arch/*/kernel/*/perf_event*.c | 5855 | F: arch/*/kernel/*/perf_event*.c |
| 5827 | F: arch/*/kernel/*/*/perf_event*.c | 5856 | F: arch/*/kernel/*/*/perf_event*.c |
| 5828 | F: arch/*/include/asm/perf_event.h | 5857 | F: arch/*/include/asm/perf_event.h |
| 5829 | F: arch/*/lib/perf_event*.c | ||
| 5830 | F: arch/*/kernel/perf_callchain.c | 5858 | F: arch/*/kernel/perf_callchain.c |
| 5831 | F: tools/perf/ | 5859 | F: tools/perf/ |
| 5832 | 5860 | ||
| @@ -5835,6 +5863,7 @@ M: Christoph Hellwig <hch@infradead.org> | |||
| 5835 | L: linux-abi-devel@lists.sourceforge.net | 5863 | L: linux-abi-devel@lists.sourceforge.net |
| 5836 | S: Maintained | 5864 | S: Maintained |
| 5837 | F: include/linux/personality.h | 5865 | F: include/linux/personality.h |
| 5866 | F: include/uapi/linux/personality.h | ||
| 5838 | 5867 | ||
| 5839 | PHONET PROTOCOL | 5868 | PHONET PROTOCOL |
| 5840 | M: Remi Denis-Courmont <courmisch@gmail.com> | 5869 | M: Remi Denis-Courmont <courmisch@gmail.com> |
| @@ -5842,6 +5871,7 @@ S: Supported | |||
| 5842 | F: Documentation/networking/phonet.txt | 5871 | F: Documentation/networking/phonet.txt |
| 5843 | F: include/linux/phonet.h | 5872 | F: include/linux/phonet.h |
| 5844 | F: include/net/phonet/ | 5873 | F: include/net/phonet/ |
| 5874 | F: include/uapi/linux/phonet.h | ||
| 5845 | F: net/phonet/ | 5875 | F: net/phonet/ |
| 5846 | 5876 | ||
| 5847 | PHRAM MTD DRIVER | 5877 | PHRAM MTD DRIVER |
| @@ -5890,6 +5920,7 @@ M: Jiri Kosina <jkosina@suse.cz> | |||
| 5890 | S: Maintained | 5920 | S: Maintained |
| 5891 | F: drivers/block/pktcdvd.c | 5921 | F: drivers/block/pktcdvd.c |
| 5892 | F: include/linux/pktcdvd.h | 5922 | F: include/linux/pktcdvd.h |
| 5923 | F: include/uapi/linux/pktcdvd.h | ||
| 5893 | 5924 | ||
| 5894 | PKUNITY SOC DRIVERS | 5925 | PKUNITY SOC DRIVERS |
| 5895 | M: Guan Xuetao <gxt@mprc.pku.edu.cn> | 5926 | M: Guan Xuetao <gxt@mprc.pku.edu.cn> |
| @@ -5964,7 +5995,7 @@ PPP OVER ATM (RFC 2364) | |||
| 5964 | M: Mitchell Blank Jr <mitch@sfgoth.com> | 5995 | M: Mitchell Blank Jr <mitch@sfgoth.com> |
| 5965 | S: Maintained | 5996 | S: Maintained |
| 5966 | F: net/atm/pppoatm.c | 5997 | F: net/atm/pppoatm.c |
| 5967 | F: include/linux/atmppp.h | 5998 | F: include/uapi/linux/atmppp.h |
| 5968 | 5999 | ||
| 5969 | PPP OVER ETHERNET | 6000 | PPP OVER ETHERNET |
| 5970 | M: Michal Ostrowski <mostrows@earthlink.net> | 6001 | M: Michal Ostrowski <mostrows@earthlink.net> |
| @@ -5977,6 +6008,7 @@ M: James Chapman <jchapman@katalix.com> | |||
| 5977 | S: Maintained | 6008 | S: Maintained |
| 5978 | F: net/l2tp/l2tp_ppp.c | 6009 | F: net/l2tp/l2tp_ppp.c |
| 5979 | F: include/linux/if_pppol2tp.h | 6010 | F: include/linux/if_pppol2tp.h |
| 6011 | F: include/uapi/linux/if_pppol2tp.h | ||
| 5980 | 6012 | ||
| 5981 | PPS SUPPORT | 6013 | PPS SUPPORT |
| 5982 | M: Rodolfo Giometti <giometti@enneenne.com> | 6014 | M: Rodolfo Giometti <giometti@enneenne.com> |
| @@ -6074,6 +6106,7 @@ F: include/asm-generic/syscall.h | |||
| 6074 | F: include/linux/ptrace.h | 6106 | F: include/linux/ptrace.h |
| 6075 | F: include/linux/regset.h | 6107 | F: include/linux/regset.h |
| 6076 | F: include/linux/tracehook.h | 6108 | F: include/linux/tracehook.h |
| 6109 | F: include/uapi/linux/ptrace.h | ||
| 6077 | F: kernel/ptrace.c | 6110 | F: kernel/ptrace.c |
| 6078 | 6111 | ||
| 6079 | PVRUSB2 VIDEO4LINUX DRIVER | 6112 | PVRUSB2 VIDEO4LINUX DRIVER |
| @@ -6102,7 +6135,6 @@ T: git git://gitorious.org/linux-pwm/linux-pwm.git | |||
| 6102 | F: Documentation/pwm.txt | 6135 | F: Documentation/pwm.txt |
| 6103 | F: Documentation/devicetree/bindings/pwm/ | 6136 | F: Documentation/devicetree/bindings/pwm/ |
| 6104 | F: include/linux/pwm.h | 6137 | F: include/linux/pwm.h |
| 6105 | F: include/linux/of_pwm.h | ||
| 6106 | F: drivers/pwm/ | 6138 | F: drivers/pwm/ |
| 6107 | F: drivers/video/backlight/pwm_bl.c | 6139 | F: drivers/video/backlight/pwm_bl.c |
| 6108 | F: include/linux/pwm_backlight.h | 6140 | F: include/linux/pwm_backlight.h |
| @@ -6198,8 +6230,8 @@ M: Anders Larsen <al@alarsen.net> | |||
| 6198 | W: http://www.alarsen.net/linux/qnx4fs/ | 6230 | W: http://www.alarsen.net/linux/qnx4fs/ |
| 6199 | S: Maintained | 6231 | S: Maintained |
| 6200 | F: fs/qnx4/ | 6232 | F: fs/qnx4/ |
| 6201 | F: include/linux/qnx4_fs.h | 6233 | F: include/uapi/linux/qnx4_fs.h |
| 6202 | F: include/linux/qnxtypes.h | 6234 | F: include/uapi/linux/qnxtypes.h |
| 6203 | 6235 | ||
| 6204 | QT1010 MEDIA DRIVER | 6236 | QT1010 MEDIA DRIVER |
| 6205 | M: Antti Palosaari <crope@iki.fi> | 6237 | M: Antti Palosaari <crope@iki.fi> |
| @@ -6233,7 +6265,7 @@ M: Benjamin Herrenschmidt <benh@kernel.crashing.org> | |||
| 6233 | L: linux-fbdev@vger.kernel.org | 6265 | L: linux-fbdev@vger.kernel.org |
| 6234 | S: Maintained | 6266 | S: Maintained |
| 6235 | F: drivers/video/aty/radeon* | 6267 | F: drivers/video/aty/radeon* |
| 6236 | F: include/linux/radeonfb.h | 6268 | F: include/uapi/linux/radeonfb.h |
| 6237 | 6269 | ||
| 6238 | RADIOSHARK RADIO DRIVER | 6270 | RADIOSHARK RADIO DRIVER |
| 6239 | M: Hans de Goede <hdegoede@redhat.com> | 6271 | M: Hans de Goede <hdegoede@redhat.com> |
| @@ -6334,6 +6366,7 @@ S: Maintained | |||
| 6334 | F: Documentation/rtc.txt | 6366 | F: Documentation/rtc.txt |
| 6335 | F: drivers/rtc/ | 6367 | F: drivers/rtc/ |
| 6336 | F: include/linux/rtc.h | 6368 | F: include/linux/rtc.h |
| 6369 | F: include/uapi/linux/rtc.h | ||
| 6337 | 6370 | ||
| 6338 | REISERFS FILE SYSTEM | 6371 | REISERFS FILE SYSTEM |
| 6339 | L: reiserfs-devel@vger.kernel.org | 6372 | L: reiserfs-devel@vger.kernel.org |
| @@ -6388,8 +6421,8 @@ M: Ralf Baechle <ralf@linux-mips.org> | |||
| 6388 | L: linux-hams@vger.kernel.org | 6421 | L: linux-hams@vger.kernel.org |
| 6389 | W: http://www.linux-ax25.org/ | 6422 | W: http://www.linux-ax25.org/ |
| 6390 | S: Maintained | 6423 | S: Maintained |
| 6391 | F: include/linux/rose.h | ||
| 6392 | F: include/net/rose.h | 6424 | F: include/net/rose.h |
| 6425 | F: include/uapi/linux/rose.h | ||
| 6393 | F: net/rose/ | 6426 | F: net/rose/ |
| 6394 | 6427 | ||
| 6395 | RTL2830 MEDIA DRIVER | 6428 | RTL2830 MEDIA DRIVER |
| @@ -6566,6 +6599,8 @@ S: Supported | |||
| 6566 | F: include/linux/clocksource.h | 6599 | F: include/linux/clocksource.h |
| 6567 | F: include/linux/time.h | 6600 | F: include/linux/time.h |
| 6568 | F: include/linux/timex.h | 6601 | F: include/linux/timex.h |
| 6602 | F: include/uapi/linux/time.h | ||
| 6603 | F: include/uapi/linux/timex.h | ||
| 6569 | F: kernel/time/clocksource.c | 6604 | F: kernel/time/clocksource.c |
| 6570 | F: kernel/time/time*.c | 6605 | F: kernel/time/time*.c |
| 6571 | F: kernel/time/ntp.c | 6606 | F: kernel/time/ntp.c |
| @@ -6590,6 +6625,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core | |||
| 6590 | S: Maintained | 6625 | S: Maintained |
| 6591 | F: kernel/sched/ | 6626 | F: kernel/sched/ |
| 6592 | F: include/linux/sched.h | 6627 | F: include/linux/sched.h |
| 6628 | F: include/uapi/linux/sched.h | ||
| 6593 | 6629 | ||
| 6594 | SCORE ARCHITECTURE | 6630 | SCORE ARCHITECTURE |
| 6595 | M: Chen Liqin <liqin.chen@sunplusct.com> | 6631 | M: Chen Liqin <liqin.chen@sunplusct.com> |
| @@ -6743,7 +6779,7 @@ SENSABLE PHANTOM | |||
| 6743 | M: Jiri Slaby <jirislaby@gmail.com> | 6779 | M: Jiri Slaby <jirislaby@gmail.com> |
| 6744 | S: Maintained | 6780 | S: Maintained |
| 6745 | F: drivers/misc/phantom.c | 6781 | F: drivers/misc/phantom.c |
| 6746 | F: include/linux/phantom.h | 6782 | F: include/uapi/linux/phantom.h |
| 6747 | 6783 | ||
| 6748 | SERIAL ATA (SATA) SUBSYSTEM | 6784 | SERIAL ATA (SATA) SUBSYSTEM |
| 6749 | M: Jeff Garzik <jgarzik@pobox.com> | 6785 | M: Jeff Garzik <jgarzik@pobox.com> |
| @@ -7001,6 +7037,7 @@ L: linux-raid@vger.kernel.org | |||
| 7001 | S: Supported | 7037 | S: Supported |
| 7002 | F: drivers/md/ | 7038 | F: drivers/md/ |
| 7003 | F: include/linux/raid/ | 7039 | F: include/linux/raid/ |
| 7040 | F: include/uapi/linux/raid/ | ||
| 7004 | 7041 | ||
| 7005 | SONIC NETWORK DRIVER | 7042 | SONIC NETWORK DRIVER |
| 7006 | M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> | 7043 | M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> |
| @@ -7041,6 +7078,7 @@ T: git git://git.alsa-project.org/alsa-kernel.git | |||
| 7041 | S: Maintained | 7078 | S: Maintained |
| 7042 | F: Documentation/sound/ | 7079 | F: Documentation/sound/ |
| 7043 | F: include/sound/ | 7080 | F: include/sound/ |
| 7081 | F: include/uapi/sound/ | ||
| 7044 | F: sound/ | 7082 | F: sound/ |
| 7045 | 7083 | ||
| 7046 | SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC) | 7084 | SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC) |
| @@ -7141,6 +7179,7 @@ S: Maintained | |||
| 7141 | F: Documentation/spi/ | 7179 | F: Documentation/spi/ |
| 7142 | F: drivers/spi/ | 7180 | F: drivers/spi/ |
| 7143 | F: include/linux/spi/ | 7181 | F: include/linux/spi/ |
| 7182 | F: include/uapi/linux/spi/ | ||
| 7144 | 7183 | ||
| 7145 | SPIDERNET NETWORK DRIVER for CELL | 7184 | SPIDERNET NETWORK DRIVER for CELL |
| 7146 | M: Ishizaki Kou <kou.ishizaki@toshiba.co.jp> | 7185 | M: Ishizaki Kou <kou.ishizaki@toshiba.co.jp> |
| @@ -7277,7 +7316,7 @@ F: drivers/staging/rtl8712/ | |||
| 7277 | STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER | 7316 | STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER |
| 7278 | M: Teddy Wang <teddy.wang@siliconmotion.com.cn> | 7317 | M: Teddy Wang <teddy.wang@siliconmotion.com.cn> |
| 7279 | S: Odd Fixes | 7318 | S: Odd Fixes |
| 7280 | F: drivers/staging/sm7xx/ | 7319 | F: drivers/staging/sm7xxfb/ |
| 7281 | 7320 | ||
| 7282 | STAGING - SOFTLOGIC 6x10 MPEG CODEC | 7321 | STAGING - SOFTLOGIC 6x10 MPEG CODEC |
| 7283 | M: Ben Collins <bcollins@bluecherry.net> | 7322 | M: Ben Collins <bcollins@bluecherry.net> |
| @@ -7403,8 +7442,8 @@ TC CLASSIFIER | |||
| 7403 | M: Jamal Hadi Salim <jhs@mojatatu.com> | 7442 | M: Jamal Hadi Salim <jhs@mojatatu.com> |
| 7404 | L: netdev@vger.kernel.org | 7443 | L: netdev@vger.kernel.org |
| 7405 | S: Maintained | 7444 | S: Maintained |
| 7406 | F: include/linux/pkt_cls.h | ||
| 7407 | F: include/net/pkt_cls.h | 7445 | F: include/net/pkt_cls.h |
| 7446 | F: include/uapi/linux/pkt_cls.h | ||
| 7408 | F: net/sched/ | 7447 | F: net/sched/ |
| 7409 | 7448 | ||
| 7410 | TCP LOW PRIORITY MODULE | 7449 | TCP LOW PRIORITY MODULE |
| @@ -7496,6 +7535,7 @@ L: netdev@vger.kernel.org | |||
| 7496 | S: Supported | 7535 | S: Supported |
| 7497 | F: drivers/net/team/ | 7536 | F: drivers/net/team/ |
| 7498 | F: include/linux/if_team.h | 7537 | F: include/linux/if_team.h |
| 7538 | F: include/uapi/linux/if_team.h | ||
| 7499 | 7539 | ||
| 7500 | TECHNOTREND USB IR RECEIVER | 7540 | TECHNOTREND USB IR RECEIVER |
| 7501 | M: Sean Young <sean@mess.org> | 7541 | M: Sean Young <sean@mess.org> |
| @@ -7594,7 +7634,7 @@ L: netdev@vger.kernel.org (core kernel code) | |||
| 7594 | L: tipc-discussion@lists.sourceforge.net (user apps, general discussion) | 7634 | L: tipc-discussion@lists.sourceforge.net (user apps, general discussion) |
| 7595 | W: http://tipc.sourceforge.net/ | 7635 | W: http://tipc.sourceforge.net/ |
| 7596 | S: Maintained | 7636 | S: Maintained |
| 7597 | F: include/linux/tipc*.h | 7637 | F: include/uapi/linux/tipc*.h |
| 7598 | F: net/tipc/ | 7638 | F: net/tipc/ |
| 7599 | 7639 | ||
| 7600 | TILE ARCHITECTURE | 7640 | TILE ARCHITECTURE |
| @@ -7644,6 +7684,7 @@ W: http://www.buzzard.org.uk/toshiba/ | |||
| 7644 | S: Maintained | 7684 | S: Maintained |
| 7645 | F: drivers/char/toshiba.c | 7685 | F: drivers/char/toshiba.c |
| 7646 | F: include/linux/toshiba.h | 7686 | F: include/linux/toshiba.h |
| 7687 | F: include/uapi/linux/toshiba.h | ||
| 7647 | 7688 | ||
| 7648 | TMIO MMC DRIVER | 7689 | TMIO MMC DRIVER |
| 7649 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 7690 | M: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| @@ -7711,6 +7752,9 @@ F: drivers/tty/serial/serial_core.c | |||
| 7711 | F: include/linux/serial_core.h | 7752 | F: include/linux/serial_core.h |
| 7712 | F: include/linux/serial.h | 7753 | F: include/linux/serial.h |
| 7713 | F: include/linux/tty.h | 7754 | F: include/linux/tty.h |
| 7755 | F: include/uapi/linux/serial_core.h | ||
| 7756 | F: include/uapi/linux/serial.h | ||
| 7757 | F: include/uapi/linux/tty.h | ||
| 7714 | 7758 | ||
| 7715 | TUA9001 MEDIA DRIVER | 7759 | TUA9001 MEDIA DRIVER |
| 7716 | M: Antti Palosaari <crope@iki.fi> | 7760 | M: Antti Palosaari <crope@iki.fi> |
| @@ -7790,7 +7834,7 @@ M: David Herrmann <dh.herrmann@googlemail.com> | |||
| 7790 | L: linux-input@vger.kernel.org | 7834 | L: linux-input@vger.kernel.org |
| 7791 | S: Maintained | 7835 | S: Maintained |
| 7792 | F: drivers/hid/uhid.c | 7836 | F: drivers/hid/uhid.c |
| 7793 | F: include/linux/uhid.h | 7837 | F: include/uapi/linux/uhid.h |
| 7794 | 7838 | ||
| 7795 | ULTRA-WIDEBAND (UWB) SUBSYSTEM: | 7839 | ULTRA-WIDEBAND (UWB) SUBSYSTEM: |
| 7796 | L: linux-usb@vger.kernel.org | 7840 | L: linux-usb@vger.kernel.org |
| @@ -7819,6 +7863,7 @@ S: Maintained | |||
| 7819 | F: Documentation/cdrom/ | 7863 | F: Documentation/cdrom/ |
| 7820 | F: drivers/cdrom/cdrom.c | 7864 | F: drivers/cdrom/cdrom.c |
| 7821 | F: include/linux/cdrom.h | 7865 | F: include/linux/cdrom.h |
| 7866 | F: include/uapi/linux/cdrom.h | ||
| 7822 | 7867 | ||
| 7823 | UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER | 7868 | UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER |
| 7824 | M: Vinayak Holikatti <vinholikatti@gmail.com> | 7869 | M: Vinayak Holikatti <vinholikatti@gmail.com> |
| @@ -7836,7 +7881,7 @@ T: git git://git.infradead.org/ubi-2.6.git | |||
| 7836 | S: Maintained | 7881 | S: Maintained |
| 7837 | F: drivers/mtd/ubi/ | 7882 | F: drivers/mtd/ubi/ |
| 7838 | F: include/linux/mtd/ubi.h | 7883 | F: include/linux/mtd/ubi.h |
| 7839 | F: include/mtd/ubi-user.h | 7884 | F: include/uapi/mtd/ubi-user.h |
| 7840 | 7885 | ||
| 7841 | UNSORTED BLOCK IMAGES (UBI) Fastmap | 7886 | UNSORTED BLOCK IMAGES (UBI) Fastmap |
| 7842 | M: Richard Weinberger <richard@nod.at> | 7887 | M: Richard Weinberger <richard@nod.at> |
| @@ -7870,7 +7915,7 @@ M: Oliver Neukum <oliver@neukum.org> | |||
| 7870 | L: linux-usb@vger.kernel.org | 7915 | L: linux-usb@vger.kernel.org |
| 7871 | S: Maintained | 7916 | S: Maintained |
| 7872 | F: drivers/net/usb/cdc_*.c | 7917 | F: drivers/net/usb/cdc_*.c |
| 7873 | F: include/linux/usb/cdc.h | 7918 | F: include/uapi/linux/usb/cdc.h |
| 7874 | 7919 | ||
| 7875 | USB CYPRESS C67X00 DRIVER | 7920 | USB CYPRESS C67X00 DRIVER |
| 7876 | M: Peter Korsgaard <jacmet@sunsite.dk> | 7921 | M: Peter Korsgaard <jacmet@sunsite.dk> |
| @@ -8191,6 +8236,7 @@ S: Maintained | |||
| 8191 | F: Documentation/vfio.txt | 8236 | F: Documentation/vfio.txt |
| 8192 | F: drivers/vfio/ | 8237 | F: drivers/vfio/ |
| 8193 | F: include/linux/vfio.h | 8238 | F: include/linux/vfio.h |
| 8239 | F: include/uapi/linux/vfio.h | ||
| 8194 | 8240 | ||
| 8195 | VIDEOBUF2 FRAMEWORK | 8241 | VIDEOBUF2 FRAMEWORK |
| 8196 | M: Pawel Osciak <pawel@osciak.com> | 8242 | M: Pawel Osciak <pawel@osciak.com> |
| @@ -8207,6 +8253,7 @@ L: virtualization@lists.linux-foundation.org | |||
| 8207 | S: Maintained | 8253 | S: Maintained |
| 8208 | F: drivers/char/virtio_console.c | 8254 | F: drivers/char/virtio_console.c |
| 8209 | F: include/linux/virtio_console.h | 8255 | F: include/linux/virtio_console.h |
| 8256 | F: include/uapi/linux/virtio_console.h | ||
| 8210 | 8257 | ||
| 8211 | VIRTIO CORE, NET AND BLOCK DRIVERS | 8258 | VIRTIO CORE, NET AND BLOCK DRIVERS |
| 8212 | M: Rusty Russell <rusty@rustcorp.com.au> | 8259 | M: Rusty Russell <rusty@rustcorp.com.au> |
| @@ -8225,7 +8272,7 @@ L: virtualization@lists.linux-foundation.org | |||
| 8225 | L: netdev@vger.kernel.org | 8272 | L: netdev@vger.kernel.org |
| 8226 | S: Maintained | 8273 | S: Maintained |
| 8227 | F: drivers/vhost/ | 8274 | F: drivers/vhost/ |
| 8228 | F: include/linux/vhost.h | 8275 | F: include/uapi/linux/vhost.h |
| 8229 | 8276 | ||
| 8230 | VIA RHINE NETWORK DRIVER | 8277 | VIA RHINE NETWORK DRIVER |
| 8231 | M: Roger Luethi <rl@hellgate.ch> | 8278 | M: Roger Luethi <rl@hellgate.ch> |
| @@ -8365,6 +8412,7 @@ S: Maintained | |||
| 8365 | F: Documentation/watchdog/ | 8412 | F: Documentation/watchdog/ |
| 8366 | F: drivers/watchdog/ | 8413 | F: drivers/watchdog/ |
| 8367 | F: include/linux/watchdog.h | 8414 | F: include/linux/watchdog.h |
| 8415 | F: include/uapi/linux/watchdog.h | ||
| 8368 | 8416 | ||
| 8369 | WD7000 SCSI DRIVER | 8417 | WD7000 SCSI DRIVER |
| 8370 | M: Miroslav Zagorac <zaga@fly.cc.fer.hr> | 8418 | M: Miroslav Zagorac <zaga@fly.cc.fer.hr> |
| @@ -8390,9 +8438,9 @@ L: wimax@linuxwimax.org | |||
| 8390 | S: Supported | 8438 | S: Supported |
| 8391 | W: http://linuxwimax.org | 8439 | W: http://linuxwimax.org |
| 8392 | F: Documentation/wimax/README.wimax | 8440 | F: Documentation/wimax/README.wimax |
| 8393 | F: include/linux/wimax.h | ||
| 8394 | F: include/linux/wimax/debug.h | 8441 | F: include/linux/wimax/debug.h |
| 8395 | F: include/net/wimax.h | 8442 | F: include/net/wimax.h |
| 8443 | F: include/uapi/linux/wimax.h | ||
| 8396 | F: net/wimax/ | 8444 | F: net/wimax/ |
| 8397 | 8445 | ||
| 8398 | WISTRON LAPTOP BUTTON DRIVER | 8446 | WISTRON LAPTOP BUTTON DRIVER |
| @@ -8510,6 +8558,7 @@ F: drivers/*/xen-*front.c | |||
| 8510 | F: drivers/xen/ | 8558 | F: drivers/xen/ |
| 8511 | F: arch/x86/include/asm/xen/ | 8559 | F: arch/x86/include/asm/xen/ |
| 8512 | F: include/xen/ | 8560 | F: include/xen/ |
| 8561 | F: include/uapi/xen/ | ||
| 8513 | 8562 | ||
| 8514 | XEN HYPERVISOR ARM | 8563 | XEN HYPERVISOR ARM |
| 8515 | M: Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 8564 | M: Stefano Stabellini <stefano.stabellini@eu.citrix.com> |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index d0cea02b5dfc..923a9da9c829 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -352,6 +352,14 @@ config RTC_DRV_TWL4030 | |||
| 352 | This driver can also be built as a module. If so, the module | 352 | This driver can also be built as a module. If so, the module |
| 353 | will be called rtc-twl. | 353 | will be called rtc-twl. |
| 354 | 354 | ||
| 355 | config RTC_DRV_TPS6586X | ||
| 356 | tristate "TI TPS6586X RTC driver" | ||
| 357 | depends on MFD_TPS6586X | ||
| 358 | help | ||
| 359 | TI Power Managment IC TPS6586X supports RTC functionality | ||
| 360 | along with alarm. This driver supports the RTC driver for | ||
| 361 | the TPS6586X RTC module. | ||
| 362 | |||
| 355 | config RTC_DRV_TPS65910 | 363 | config RTC_DRV_TPS65910 |
| 356 | tristate "TI TPS65910 RTC driver" | 364 | tristate "TI TPS65910 RTC driver" |
| 357 | depends on RTC_CLASS && MFD_TPS65910 | 365 | depends on RTC_CLASS && MFD_TPS65910 |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index c3f62c80dc06..4418ef3f9ecc 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
| @@ -111,6 +111,7 @@ obj-$(CONFIG_RTC_DRV_TEGRA) += rtc-tegra.o | |||
| 111 | obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o | 111 | obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o |
| 112 | obj-$(CONFIG_RTC_DRV_TILE) += rtc-tile.o | 112 | obj-$(CONFIG_RTC_DRV_TILE) += rtc-tile.o |
| 113 | obj-$(CONFIG_RTC_DRV_TWL4030) += rtc-twl.o | 113 | obj-$(CONFIG_RTC_DRV_TWL4030) += rtc-twl.o |
| 114 | obj-$(CONFIG_RTC_DRV_TPS6586X) += rtc-tps6586x.o | ||
| 114 | obj-$(CONFIG_RTC_DRV_TPS65910) += rtc-tps65910.o | 115 | obj-$(CONFIG_RTC_DRV_TPS65910) += rtc-tps65910.o |
| 115 | obj-$(CONFIG_RTC_DRV_TX4939) += rtc-tx4939.o | 116 | obj-$(CONFIG_RTC_DRV_TX4939) += rtc-tx4939.o |
| 116 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o | 117 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o |
diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c index 5ba2f756a524..c84ea6659f49 100644 --- a/drivers/rtc/rtc-tegra.c +++ b/drivers/rtc/rtc-tegra.c | |||
| @@ -303,6 +303,12 @@ static struct rtc_class_ops tegra_rtc_ops = { | |||
| 303 | .alarm_irq_enable = tegra_rtc_alarm_irq_enable, | 303 | .alarm_irq_enable = tegra_rtc_alarm_irq_enable, |
| 304 | }; | 304 | }; |
| 305 | 305 | ||
| 306 | static const struct of_device_id tegra_rtc_dt_match[] = { | ||
| 307 | { .compatible = "nvidia,tegra20-rtc", }, | ||
| 308 | {} | ||
| 309 | }; | ||
| 310 | MODULE_DEVICE_TABLE(of, tegra_rtc_dt_match); | ||
| 311 | |||
| 306 | static int tegra_rtc_probe(struct platform_device *pdev) | 312 | static int tegra_rtc_probe(struct platform_device *pdev) |
| 307 | { | 313 | { |
| 308 | struct tegra_rtc_info *info; | 314 | struct tegra_rtc_info *info; |
| @@ -440,6 +446,7 @@ static struct platform_driver tegra_rtc_driver = { | |||
| 440 | .driver = { | 446 | .driver = { |
| 441 | .name = "tegra_rtc", | 447 | .name = "tegra_rtc", |
| 442 | .owner = THIS_MODULE, | 448 | .owner = THIS_MODULE, |
| 449 | .of_match_table = tegra_rtc_dt_match, | ||
| 443 | }, | 450 | }, |
| 444 | #ifdef CONFIG_PM | 451 | #ifdef CONFIG_PM |
| 445 | .suspend = tegra_rtc_suspend, | 452 | .suspend = tegra_rtc_suspend, |
diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c new file mode 100644 index 000000000000..70f61b8e9e6f --- /dev/null +++ b/drivers/rtc/rtc-tps6586x.c | |||
| @@ -0,0 +1,356 @@ | |||
| 1 | /* | ||
| 2 | * rtc-tps6586x.c: RTC driver for TI PMIC TPS6586X | ||
| 3 | * | ||
| 4 | * Copyright (c) 2012, NVIDIA Corporation. | ||
| 5 | * | ||
| 6 | * Author: Laxman Dewangan <ldewangan@nvidia.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License as | ||
| 10 | * published by the Free Software Foundation version 2. | ||
| 11 | * | ||
| 12 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, | ||
| 13 | * whether express or implied; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
| 20 | * 02111-1307, USA | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/device.h> | ||
| 24 | #include <linux/err.h> | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <linux/kernel.h> | ||
| 27 | #include <linux/mfd/tps6586x.h> | ||
| 28 | #include <linux/module.h> | ||
| 29 | #include <linux/platform_device.h> | ||
| 30 | #include <linux/pm_runtime.h> | ||
| 31 | #include <linux/rtc.h> | ||
| 32 | #include <linux/slab.h> | ||
| 33 | |||
| 34 | #define RTC_CTRL 0xc0 | ||
| 35 | #define POR_RESET_N BIT(7) | ||
| 36 | #define OSC_SRC_SEL BIT(6) | ||
| 37 | #define RTC_ENABLE BIT(5) /* enables alarm */ | ||
| 38 | #define RTC_BUF_ENABLE BIT(4) /* 32 KHz buffer enable */ | ||
| 39 | #define PRE_BYPASS BIT(3) /* 0=1KHz or 1=32KHz updates */ | ||
| 40 | #define CL_SEL_MASK (BIT(2)|BIT(1)) | ||
| 41 | #define CL_SEL_POS 1 | ||
| 42 | #define RTC_ALARM1_HI 0xc1 | ||
| 43 | #define RTC_COUNT4 0xc6 | ||
| 44 | |||
| 45 | /* start a PMU RTC access by reading the register prior to the RTC_COUNT4 */ | ||
| 46 | #define RTC_COUNT4_DUMMYREAD 0xc5 | ||
| 47 | |||
| 48 | /*only 14-bits width in second*/ | ||
| 49 | #define ALM1_VALID_RANGE_IN_SEC 0x3FFF | ||
| 50 | |||
| 51 | #define TPS6586X_RTC_CL_SEL_1_5PF 0x0 | ||
| 52 | #define TPS6586X_RTC_CL_SEL_6_5PF 0x1 | ||
| 53 | #define TPS6586X_RTC_CL_SEL_7_5PF 0x2 | ||
| 54 | #define TPS6586X_RTC_CL_SEL_12_5PF 0x3 | ||
| 55 | |||
| 56 | struct tps6586x_rtc { | ||
| 57 | struct device *dev; | ||
| 58 | struct rtc_device *rtc; | ||
| 59 | int irq; | ||
| 60 | bool irq_en; | ||
| 61 | unsigned long long epoch_start; | ||
| 62 | }; | ||
| 63 | |||
| 64 | static inline struct device *to_tps6586x_dev(struct device *dev) | ||
| 65 | { | ||
| 66 | return dev->parent; | ||
| 67 | } | ||
| 68 | |||
| 69 | static int tps6586x_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
| 70 | { | ||
| 71 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 72 | struct device *tps_dev = to_tps6586x_dev(dev); | ||
| 73 | unsigned long long ticks = 0; | ||
| 74 | unsigned long seconds; | ||
| 75 | u8 buff[6]; | ||
| 76 | int ret; | ||
| 77 | int i; | ||
| 78 | |||
| 79 | ret = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, sizeof(buff), buff); | ||
| 80 | if (ret < 0) { | ||
| 81 | dev_err(dev, "read counter failed with err %d\n", ret); | ||
| 82 | return ret; | ||
| 83 | } | ||
| 84 | |||
| 85 | for (i = 1; i < sizeof(buff); i++) { | ||
| 86 | ticks <<= 8; | ||
| 87 | ticks |= buff[i]; | ||
| 88 | } | ||
| 89 | |||
| 90 | seconds = ticks >> 10; | ||
| 91 | seconds += rtc->epoch_start; | ||
| 92 | rtc_time_to_tm(seconds, tm); | ||
| 93 | return rtc_valid_tm(tm); | ||
| 94 | } | ||
| 95 | |||
| 96 | static int tps6586x_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
| 97 | { | ||
| 98 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 99 | struct device *tps_dev = to_tps6586x_dev(dev); | ||
| 100 | unsigned long long ticks; | ||
| 101 | unsigned long seconds; | ||
| 102 | u8 buff[5]; | ||
| 103 | int ret; | ||
| 104 | |||
| 105 | rtc_tm_to_time(tm, &seconds); | ||
| 106 | if (seconds < rtc->epoch_start) { | ||
| 107 | dev_err(dev, "requested time unsupported\n"); | ||
| 108 | return -EINVAL; | ||
| 109 | } | ||
| 110 | seconds -= rtc->epoch_start; | ||
| 111 | |||
| 112 | ticks = (unsigned long long)seconds << 10; | ||
| 113 | buff[0] = (ticks >> 32) & 0xff; | ||
| 114 | buff[1] = (ticks >> 24) & 0xff; | ||
| 115 | buff[2] = (ticks >> 16) & 0xff; | ||
| 116 | buff[3] = (ticks >> 8) & 0xff; | ||
| 117 | buff[4] = ticks & 0xff; | ||
| 118 | |||
| 119 | /* Disable RTC before changing time */ | ||
| 120 | ret = tps6586x_clr_bits(tps_dev, RTC_CTRL, RTC_ENABLE); | ||
| 121 | if (ret < 0) { | ||
| 122 | dev_err(dev, "failed to clear RTC_ENABLE\n"); | ||
| 123 | return ret; | ||
| 124 | } | ||
| 125 | |||
| 126 | ret = tps6586x_writes(tps_dev, RTC_COUNT4, sizeof(buff), buff); | ||
| 127 | if (ret < 0) { | ||
| 128 | dev_err(dev, "failed to program new time\n"); | ||
| 129 | return ret; | ||
| 130 | } | ||
| 131 | |||
| 132 | /* Enable RTC */ | ||
| 133 | ret = tps6586x_set_bits(tps_dev, RTC_CTRL, RTC_ENABLE); | ||
| 134 | if (ret < 0) { | ||
| 135 | dev_err(dev, "failed to set RTC_ENABLE\n"); | ||
| 136 | return ret; | ||
| 137 | } | ||
| 138 | return 0; | ||
| 139 | } | ||
| 140 | |||
| 141 | static int tps6586x_rtc_alarm_irq_enable(struct device *dev, | ||
| 142 | unsigned int enabled) | ||
| 143 | { | ||
| 144 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 145 | |||
| 146 | if (enabled && !rtc->irq_en) { | ||
| 147 | enable_irq(rtc->irq); | ||
| 148 | rtc->irq_en = true; | ||
| 149 | } else if (!enabled && rtc->irq_en) { | ||
| 150 | disable_irq(rtc->irq); | ||
| 151 | rtc->irq_en = false; | ||
| 152 | } | ||
| 153 | return 0; | ||
| 154 | } | ||
| 155 | |||
| 156 | static int tps6586x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
| 157 | { | ||
| 158 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 159 | struct device *tps_dev = to_tps6586x_dev(dev); | ||
| 160 | unsigned long seconds; | ||
| 161 | unsigned long ticks; | ||
| 162 | unsigned long rtc_current_time; | ||
| 163 | unsigned long long rticks = 0; | ||
| 164 | u8 buff[3]; | ||
| 165 | u8 rbuff[6]; | ||
| 166 | int ret; | ||
| 167 | int i; | ||
| 168 | |||
| 169 | rtc_tm_to_time(&alrm->time, &seconds); | ||
| 170 | |||
| 171 | if (alrm->enabled && (seconds < rtc->epoch_start)) { | ||
| 172 | dev_err(dev, "can't set alarm to requested time\n"); | ||
| 173 | return -EINVAL; | ||
| 174 | } | ||
| 175 | |||
| 176 | ret = tps6586x_rtc_alarm_irq_enable(dev, alrm->enabled); | ||
| 177 | if (ret < 0) { | ||
| 178 | dev_err(dev, "can't set alarm irq, err %d\n", ret); | ||
| 179 | return ret; | ||
| 180 | } | ||
| 181 | |||
| 182 | seconds -= rtc->epoch_start; | ||
| 183 | ret = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, | ||
| 184 | sizeof(rbuff), rbuff); | ||
| 185 | if (ret < 0) { | ||
| 186 | dev_err(dev, "read counter failed with err %d\n", ret); | ||
| 187 | return ret; | ||
| 188 | } | ||
| 189 | |||
| 190 | for (i = 1; i < sizeof(rbuff); i++) { | ||
| 191 | rticks <<= 8; | ||
| 192 | rticks |= rbuff[i]; | ||
| 193 | } | ||
| 194 | |||
| 195 | rtc_current_time = rticks >> 10; | ||
| 196 | if ((seconds - rtc_current_time) > ALM1_VALID_RANGE_IN_SEC) | ||
| 197 | seconds = rtc_current_time - 1; | ||
| 198 | |||
| 199 | ticks = (unsigned long long)seconds << 10; | ||
| 200 | buff[0] = (ticks >> 16) & 0xff; | ||
| 201 | buff[1] = (ticks >> 8) & 0xff; | ||
| 202 | buff[2] = ticks & 0xff; | ||
| 203 | |||
| 204 | ret = tps6586x_writes(tps_dev, RTC_ALARM1_HI, sizeof(buff), buff); | ||
| 205 | if (ret) | ||
| 206 | dev_err(dev, "programming alarm failed with err %d\n", ret); | ||
| 207 | |||
| 208 | return ret; | ||
| 209 | } | ||
| 210 | |||
| 211 | static int tps6586x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
| 212 | { | ||
| 213 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 214 | struct device *tps_dev = to_tps6586x_dev(dev); | ||
| 215 | unsigned long ticks; | ||
| 216 | unsigned long seconds; | ||
| 217 | u8 buff[3]; | ||
| 218 | int ret; | ||
| 219 | |||
| 220 | ret = tps6586x_reads(tps_dev, RTC_ALARM1_HI, sizeof(buff), buff); | ||
| 221 | if (ret) { | ||
| 222 | dev_err(dev, "read RTC_ALARM1_HI failed with err %d\n", ret); | ||
| 223 | return ret; | ||
| 224 | } | ||
| 225 | |||
| 226 | ticks = (buff[0] << 16) | (buff[1] << 8) | buff[2]; | ||
| 227 | seconds = ticks >> 10; | ||
| 228 | seconds += rtc->epoch_start; | ||
| 229 | |||
| 230 | rtc_time_to_tm(seconds, &alrm->time); | ||
| 231 | return 0; | ||
| 232 | } | ||
| 233 | |||
| 234 | static const struct rtc_class_ops tps6586x_rtc_ops = { | ||
| 235 | .read_time = tps6586x_rtc_read_time, | ||
| 236 | .set_time = tps6586x_rtc_set_time, | ||
| 237 | .set_alarm = tps6586x_rtc_set_alarm, | ||
| 238 | .read_alarm = tps6586x_rtc_read_alarm, | ||
| 239 | .alarm_irq_enable = tps6586x_rtc_alarm_irq_enable, | ||
| 240 | }; | ||
| 241 | |||
| 242 | static irqreturn_t tps6586x_rtc_irq(int irq, void *data) | ||
| 243 | { | ||
| 244 | struct tps6586x_rtc *rtc = data; | ||
| 245 | |||
| 246 | rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF); | ||
| 247 | return IRQ_HANDLED; | ||
| 248 | } | ||
| 249 | |||
| 250 | static int tps6586x_rtc_probe(struct platform_device *pdev) | ||
| 251 | { | ||
| 252 | struct device *tps_dev = to_tps6586x_dev(&pdev->dev); | ||
| 253 | struct tps6586x_rtc *rtc; | ||
| 254 | int ret; | ||
| 255 | |||
| 256 | rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); | ||
| 257 | if (!rtc) | ||
| 258 | return -ENOMEM; | ||
| 259 | |||
| 260 | rtc->dev = &pdev->dev; | ||
| 261 | rtc->irq = platform_get_irq(pdev, 0); | ||
| 262 | |||
| 263 | /* Set epoch start as 00:00:00:01:01:2009 */ | ||
| 264 | rtc->epoch_start = mktime(2009, 1, 1, 0, 0, 0); | ||
| 265 | |||
| 266 | /* 1 kHz tick mode, enable tick counting */ | ||
| 267 | ret = tps6586x_update(tps_dev, RTC_CTRL, | ||
| 268 | RTC_ENABLE | OSC_SRC_SEL | | ||
| 269 | ((TPS6586X_RTC_CL_SEL_1_5PF << CL_SEL_POS) & CL_SEL_MASK), | ||
| 270 | RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK); | ||
| 271 | if (ret < 0) { | ||
| 272 | dev_err(&pdev->dev, "unable to start counter\n"); | ||
| 273 | return ret; | ||
| 274 | } | ||
| 275 | |||
| 276 | platform_set_drvdata(pdev, rtc); | ||
| 277 | rtc->rtc = rtc_device_register(dev_name(&pdev->dev), &pdev->dev, | ||
| 278 | &tps6586x_rtc_ops, THIS_MODULE); | ||
| 279 | if (IS_ERR(rtc->rtc)) { | ||
| 280 | ret = PTR_ERR(rtc->rtc); | ||
| 281 | dev_err(&pdev->dev, "RTC device register: ret %d\n", ret); | ||
| 282 | goto fail_rtc_register; | ||
| 283 | } | ||
| 284 | |||
| 285 | ret = request_threaded_irq(rtc->irq, NULL, tps6586x_rtc_irq, | ||
| 286 | IRQF_ONESHOT | IRQF_EARLY_RESUME, | ||
| 287 | dev_name(&pdev->dev), rtc); | ||
| 288 | if (ret < 0) { | ||
| 289 | dev_err(&pdev->dev, "request IRQ(%d) failed with ret %d\n", | ||
| 290 | rtc->irq, ret); | ||
| 291 | goto fail_req_irq; | ||
| 292 | } | ||
| 293 | disable_irq(rtc->irq); | ||
| 294 | device_set_wakeup_capable(&pdev->dev, 1); | ||
| 295 | return 0; | ||
| 296 | |||
| 297 | fail_req_irq: | ||
| 298 | rtc_device_unregister(rtc->rtc); | ||
| 299 | |||
| 300 | fail_rtc_register: | ||
| 301 | tps6586x_update(tps_dev, RTC_CTRL, 0, | ||
| 302 | RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK); | ||
| 303 | return ret; | ||
| 304 | }; | ||
| 305 | |||
| 306 | static int tps6586x_rtc_remove(struct platform_device *pdev) | ||
| 307 | { | ||
| 308 | struct tps6586x_rtc *rtc = platform_get_drvdata(pdev); | ||
| 309 | struct device *tps_dev = to_tps6586x_dev(&pdev->dev); | ||
| 310 | |||
| 311 | tps6586x_update(tps_dev, RTC_CTRL, 0, | ||
| 312 | RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK); | ||
| 313 | rtc_device_unregister(rtc->rtc); | ||
| 314 | free_irq(rtc->irq, rtc); | ||
| 315 | return 0; | ||
| 316 | } | ||
| 317 | |||
| 318 | #ifdef CONFIG_PM_SLEEP | ||
| 319 | static int tps6586x_rtc_suspend(struct device *dev) | ||
| 320 | { | ||
| 321 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 322 | |||
| 323 | if (device_may_wakeup(dev)) | ||
| 324 | enable_irq_wake(rtc->irq); | ||
| 325 | return 0; | ||
| 326 | } | ||
| 327 | |||
| 328 | static int tps6586x_rtc_resume(struct device *dev) | ||
| 329 | { | ||
| 330 | struct tps6586x_rtc *rtc = dev_get_drvdata(dev); | ||
| 331 | |||
| 332 | if (device_may_wakeup(dev)) | ||
| 333 | disable_irq_wake(rtc->irq); | ||
| 334 | return 0; | ||
| 335 | } | ||
| 336 | #endif | ||
| 337 | |||
| 338 | static const struct dev_pm_ops tps6586x_pm_ops = { | ||
| 339 | SET_SYSTEM_SLEEP_PM_OPS(tps6586x_rtc_suspend, tps6586x_rtc_resume) | ||
| 340 | }; | ||
| 341 | |||
| 342 | static struct platform_driver tps6586x_rtc_driver = { | ||
| 343 | .driver = { | ||
| 344 | .name = "tps6586x-rtc", | ||
| 345 | .owner = THIS_MODULE, | ||
| 346 | .pm = &tps6586x_pm_ops, | ||
| 347 | }, | ||
| 348 | .probe = tps6586x_rtc_probe, | ||
| 349 | .remove = tps6586x_rtc_remove, | ||
| 350 | }; | ||
| 351 | module_platform_driver(tps6586x_rtc_driver); | ||
| 352 | |||
| 353 | MODULE_ALIAS("platform:rtc-tps6586x"); | ||
| 354 | MODULE_DESCRIPTION("TI TPS6586x RTC driver"); | ||
| 355 | MODULE_AUTHOR("Laxman dewangan <ldewangan@nvidia.com>"); | ||
| 356 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index fd1418750ac8..00c930f4b6f3 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c | |||
| @@ -70,7 +70,7 @@ | |||
| 70 | | ALARM_SEC_BIT) | 70 | | ALARM_SEC_BIT) |
| 71 | 71 | ||
| 72 | #define VT8500_RTC_CR_ENABLE (1 << 0) /* Enable RTC */ | 72 | #define VT8500_RTC_CR_ENABLE (1 << 0) /* Enable RTC */ |
| 73 | #define VT8500_RTC_CR_24H (1 << 1) /* 24h time format */ | 73 | #define VT8500_RTC_CR_12H (1 << 1) /* 12h time format */ |
| 74 | #define VT8500_RTC_CR_SM_ENABLE (1 << 2) /* Enable periodic irqs */ | 74 | #define VT8500_RTC_CR_SM_ENABLE (1 << 2) /* Enable periodic irqs */ |
| 75 | #define VT8500_RTC_CR_SM_SEC (1 << 3) /* 0: 1Hz/60, 1: 1Hz */ | 75 | #define VT8500_RTC_CR_SM_SEC (1 << 3) /* 0: 1Hz/60, 1: 1Hz */ |
| 76 | #define VT8500_RTC_CR_CALIB (1 << 4) /* Enable calibration */ | 76 | #define VT8500_RTC_CR_CALIB (1 << 4) /* Enable calibration */ |
| @@ -119,7 +119,7 @@ static int vt8500_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 119 | tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S); | 119 | tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S); |
| 120 | tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S); | 120 | tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S); |
| 121 | tm->tm_mday = bcd2bin(date & DATE_DAY_MASK); | 121 | tm->tm_mday = bcd2bin(date & DATE_DAY_MASK); |
| 122 | tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S); | 122 | tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S) - 1; |
| 123 | tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S) | 123 | tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S) |
| 124 | + ((date >> DATE_CENTURY_S) & 1 ? 200 : 100); | 124 | + ((date >> DATE_CENTURY_S) & 1 ? 200 : 100); |
| 125 | tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S; | 125 | tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S; |
| @@ -138,8 +138,9 @@ static int vt8500_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S) | 140 | writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S) |
| 141 | | (bin2bcd(tm->tm_mon) << DATE_MONTH_S) | 141 | | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S) |
| 142 | | (bin2bcd(tm->tm_mday)), | 142 | | (bin2bcd(tm->tm_mday)) |
| 143 | | ((tm->tm_year >= 200) << DATE_CENTURY_S), | ||
| 143 | vt8500_rtc->regbase + VT8500_RTC_DS); | 144 | vt8500_rtc->regbase + VT8500_RTC_DS); |
| 144 | writel((bin2bcd(tm->tm_wday) << TIME_DOW_S) | 145 | writel((bin2bcd(tm->tm_wday) << TIME_DOW_S) |
| 145 | | (bin2bcd(tm->tm_hour) << TIME_HOUR_S) | 146 | | (bin2bcd(tm->tm_hour) << TIME_HOUR_S) |
| @@ -247,7 +248,7 @@ static int vt8500_rtc_probe(struct platform_device *pdev) | |||
| 247 | } | 248 | } |
| 248 | 249 | ||
| 249 | /* Enable RTC and set it to 24-hour mode */ | 250 | /* Enable RTC and set it to 24-hour mode */ |
| 250 | writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H, | 251 | writel(VT8500_RTC_CR_ENABLE, |
| 251 | vt8500_rtc->regbase + VT8500_RTC_CR); | 252 | vt8500_rtc->regbase + VT8500_RTC_CR); |
| 252 | 253 | ||
| 253 | vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, | 254 | vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, |
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index ed6642ad03e0..25f01d0bc149 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h | |||
| @@ -78,6 +78,14 @@ struct mmu_gather_batch { | |||
| 78 | #define MAX_GATHER_BATCH \ | 78 | #define MAX_GATHER_BATCH \ |
| 79 | ((PAGE_SIZE - sizeof(struct mmu_gather_batch)) / sizeof(void *)) | 79 | ((PAGE_SIZE - sizeof(struct mmu_gather_batch)) / sizeof(void *)) |
| 80 | 80 | ||
| 81 | /* | ||
| 82 | * Limit the maximum number of mmu_gather batches to reduce a risk of soft | ||
| 83 | * lockups for non-preemptible kernels on huge machines when a lot of memory | ||
| 84 | * is zapped during unmapping. | ||
| 85 | * 10K pages freed at once should be safe even without a preemption point. | ||
| 86 | */ | ||
| 87 | #define MAX_GATHER_BATCH_COUNT (10000UL/MAX_GATHER_BATCH) | ||
| 88 | |||
| 81 | /* struct mmu_gather is an opaque type used by the mm code for passing around | 89 | /* struct mmu_gather is an opaque type used by the mm code for passing around |
| 82 | * any data needed by arch specific code for tlb_remove_page. | 90 | * any data needed by arch specific code for tlb_remove_page. |
| 83 | */ | 91 | */ |
| @@ -96,6 +104,7 @@ struct mmu_gather { | |||
| 96 | struct mmu_gather_batch *active; | 104 | struct mmu_gather_batch *active; |
| 97 | struct mmu_gather_batch local; | 105 | struct mmu_gather_batch local; |
| 98 | struct page *__pages[MMU_GATHER_BUNDLE]; | 106 | struct page *__pages[MMU_GATHER_BUNDLE]; |
| 107 | unsigned int batch_count; | ||
| 99 | }; | 108 | }; |
| 100 | 109 | ||
| 101 | #define HAVE_GENERIC_MMU_GATHER | 110 | #define HAVE_GENERIC_MMU_GATHER |
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h index fe771978e877..ae221a7b5092 100644 --- a/include/linux/ipc_namespace.h +++ b/include/linux/ipc_namespace.h | |||
| @@ -24,6 +24,7 @@ struct ipc_ids { | |||
| 24 | unsigned short seq_max; | 24 | unsigned short seq_max; |
| 25 | struct rw_semaphore rw_mutex; | 25 | struct rw_semaphore rw_mutex; |
| 26 | struct idr ipcs_idr; | 26 | struct idr ipcs_idr; |
| 27 | int next_id; | ||
| 27 | }; | 28 | }; |
| 28 | 29 | ||
| 29 | struct ipc_namespace { | 30 | struct ipc_namespace { |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 4bec5be82cab..73b64a38b984 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
| @@ -503,14 +503,6 @@ struct zone { | |||
| 503 | * rarely used fields: | 503 | * rarely used fields: |
| 504 | */ | 504 | */ |
| 505 | const char *name; | 505 | const char *name; |
| 506 | #ifdef CONFIG_MEMORY_ISOLATION | ||
| 507 | /* | ||
| 508 | * the number of MIGRATE_ISOLATE *pageblock*. | ||
| 509 | * We need this for free page counting. Look at zone_watermark_ok_safe. | ||
| 510 | * It's protected by zone->lock | ||
| 511 | */ | ||
| 512 | int nr_pageblock_isolate; | ||
| 513 | #endif | ||
| 514 | } ____cacheline_internodealigned_in_smp; | 506 | } ____cacheline_internodealigned_in_smp; |
| 515 | 507 | ||
| 516 | typedef enum { | 508 | typedef enum { |
diff --git a/include/linux/msg.h b/include/linux/msg.h index 7a4b9e97d29a..391af8d11cce 100644 --- a/include/linux/msg.h +++ b/include/linux/msg.h | |||
| @@ -34,7 +34,9 @@ struct msg_queue { | |||
| 34 | /* Helper routines for sys_msgsnd and sys_msgrcv */ | 34 | /* Helper routines for sys_msgsnd and sys_msgrcv */ |
| 35 | extern long do_msgsnd(int msqid, long mtype, void __user *mtext, | 35 | extern long do_msgsnd(int msqid, long mtype, void __user *mtext, |
| 36 | size_t msgsz, int msgflg); | 36 | size_t msgsz, int msgflg); |
| 37 | extern long do_msgrcv(int msqid, long *pmtype, void __user *mtext, | 37 | extern long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, |
| 38 | size_t msgsz, long msgtyp, int msgflg); | 38 | int msgflg, |
| 39 | long (*msg_fill)(void __user *, struct msg_msg *, | ||
| 40 | size_t)); | ||
| 39 | 41 | ||
| 40 | #endif /* _LINUX_MSG_H */ | 42 | #endif /* _LINUX_MSG_H */ |
diff --git a/include/uapi/linux/msg.h b/include/uapi/linux/msg.h index 78dbd2f996a3..22d95c6854e0 100644 --- a/include/uapi/linux/msg.h +++ b/include/uapi/linux/msg.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | /* msgrcv options */ | 10 | /* msgrcv options */ |
| 11 | #define MSG_NOERROR 010000 /* no error if message is too big */ | 11 | #define MSG_NOERROR 010000 /* no error if message is too big */ |
| 12 | #define MSG_EXCEPT 020000 /* recv any msg except of specified type.*/ | 12 | #define MSG_EXCEPT 020000 /* recv any msg except of specified type.*/ |
| 13 | #define MSG_COPY 040000 /* copy (not remove) all queue messages */ | ||
| 13 | 14 | ||
| 14 | /* Obsolete, used only for backwards compatibility and libc5 compiles */ | 15 | /* Obsolete, used only for backwards compatibility and libc5 compiles */ |
| 15 | struct msqid_ds { | 16 | struct msqid_ds { |
diff --git a/ipc/compat.c b/ipc/compat.c index ad9518eb26e0..2547f29dcd1b 100644 --- a/ipc/compat.c +++ b/ipc/compat.c | |||
| @@ -306,6 +306,20 @@ static long do_compat_semctl(int first, int second, int third, u32 pad) | |||
| 306 | return err; | 306 | return err; |
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz) | ||
| 310 | { | ||
| 311 | struct compat_msgbuf __user *msgp = dest; | ||
| 312 | size_t msgsz; | ||
| 313 | |||
| 314 | if (put_user(msg->m_type, &msgp->mtype)) | ||
| 315 | return -EFAULT; | ||
| 316 | |||
| 317 | msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz; | ||
| 318 | if (store_msg(msgp->mtext, msg, msgsz)) | ||
| 319 | return -EFAULT; | ||
| 320 | return msgsz; | ||
| 321 | } | ||
| 322 | |||
| 309 | #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC | 323 | #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC |
| 310 | long compat_sys_semctl(int first, int second, int third, void __user *uptr) | 324 | long compat_sys_semctl(int first, int second, int third, void __user *uptr) |
| 311 | { | 325 | { |
| @@ -337,10 +351,6 @@ long compat_sys_msgsnd(int first, int second, int third, void __user *uptr) | |||
| 337 | long compat_sys_msgrcv(int first, int second, int msgtyp, int third, | 351 | long compat_sys_msgrcv(int first, int second, int msgtyp, int third, |
| 338 | int version, void __user *uptr) | 352 | int version, void __user *uptr) |
| 339 | { | 353 | { |
| 340 | struct compat_msgbuf __user *up; | ||
| 341 | long type; | ||
| 342 | int err; | ||
| 343 | |||
| 344 | if (first < 0) | 354 | if (first < 0) |
| 345 | return -EINVAL; | 355 | return -EINVAL; |
| 346 | if (second < 0) | 356 | if (second < 0) |
| @@ -348,23 +358,15 @@ long compat_sys_msgrcv(int first, int second, int msgtyp, int third, | |||
| 348 | 358 | ||
| 349 | if (!version) { | 359 | if (!version) { |
| 350 | struct compat_ipc_kludge ipck; | 360 | struct compat_ipc_kludge ipck; |
| 351 | err = -EINVAL; | ||
| 352 | if (!uptr) | 361 | if (!uptr) |
| 353 | goto out; | 362 | return -EINVAL; |
| 354 | err = -EFAULT; | ||
| 355 | if (copy_from_user (&ipck, uptr, sizeof(ipck))) | 363 | if (copy_from_user (&ipck, uptr, sizeof(ipck))) |
| 356 | goto out; | 364 | return -EFAULT; |
| 357 | uptr = compat_ptr(ipck.msgp); | 365 | uptr = compat_ptr(ipck.msgp); |
| 358 | msgtyp = ipck.msgtyp; | 366 | msgtyp = ipck.msgtyp; |
| 359 | } | 367 | } |
| 360 | up = uptr; | 368 | return do_msgrcv(first, uptr, second, msgtyp, third, |
| 361 | err = do_msgrcv(first, &type, up->mtext, second, msgtyp, third); | 369 | compat_do_msg_fill); |
| 362 | if (err < 0) | ||
| 363 | goto out; | ||
| 364 | if (put_user(type, &up->mtype)) | ||
| 365 | err = -EFAULT; | ||
| 366 | out: | ||
| 367 | return err; | ||
| 368 | } | 370 | } |
| 369 | #else | 371 | #else |
| 370 | long compat_sys_semctl(int semid, int semnum, int cmd, int arg) | 372 | long compat_sys_semctl(int semid, int semnum, int cmd, int arg) |
| @@ -385,16 +387,8 @@ long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp, | |||
| 385 | long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp, | 387 | long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp, |
| 386 | compat_ssize_t msgsz, long msgtyp, int msgflg) | 388 | compat_ssize_t msgsz, long msgtyp, int msgflg) |
| 387 | { | 389 | { |
| 388 | long err, mtype; | 390 | return do_msgrcv(msqid, msgp, (ssize_t)msgsz, msgtyp, msgflg, |
| 389 | 391 | compat_do_msg_fill); | |
| 390 | err = do_msgrcv(msqid, &mtype, msgp->mtext, (ssize_t)msgsz, msgtyp, msgflg); | ||
| 391 | if (err < 0) | ||
| 392 | goto out; | ||
| 393 | |||
| 394 | if (put_user(mtype, &msgp->mtype)) | ||
| 395 | err = -EFAULT; | ||
| 396 | out: | ||
| 397 | return err; | ||
| 398 | } | 392 | } |
| 399 | #endif | 393 | #endif |
| 400 | 394 | ||
diff --git a/ipc/ipc_sysctl.c b/ipc/ipc_sysctl.c index 00fba2bab87d..130dfece27ac 100644 --- a/ipc/ipc_sysctl.c +++ b/ipc/ipc_sysctl.c | |||
| @@ -158,6 +158,9 @@ static int proc_ipcauto_dointvec_minmax(ctl_table *table, int write, | |||
| 158 | 158 | ||
| 159 | static int zero; | 159 | static int zero; |
| 160 | static int one = 1; | 160 | static int one = 1; |
| 161 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
| 162 | static int int_max = INT_MAX; | ||
| 163 | #endif | ||
| 161 | 164 | ||
| 162 | static struct ctl_table ipc_kern_table[] = { | 165 | static struct ctl_table ipc_kern_table[] = { |
| 163 | { | 166 | { |
| @@ -227,6 +230,35 @@ static struct ctl_table ipc_kern_table[] = { | |||
| 227 | .extra1 = &zero, | 230 | .extra1 = &zero, |
| 228 | .extra2 = &one, | 231 | .extra2 = &one, |
| 229 | }, | 232 | }, |
| 233 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
| 234 | { | ||
| 235 | .procname = "sem_next_id", | ||
| 236 | .data = &init_ipc_ns.ids[IPC_SEM_IDS].next_id, | ||
| 237 | .maxlen = sizeof(init_ipc_ns.ids[IPC_SEM_IDS].next_id), | ||
| 238 | .mode = 0644, | ||
| 239 | .proc_handler = proc_ipc_dointvec_minmax, | ||
| 240 | .extra1 = &zero, | ||
| 241 | .extra2 = &int_max, | ||
| 242 | }, | ||
| 243 | { | ||
| 244 | .procname = "msg_next_id", | ||
| 245 | .data = &init_ipc_ns.ids[IPC_MSG_IDS].next_id, | ||
| 246 | .maxlen = sizeof(init_ipc_ns.ids[IPC_MSG_IDS].next_id), | ||
| 247 | .mode = 0644, | ||
| 248 | .proc_handler = proc_ipc_dointvec_minmax, | ||
| 249 | .extra1 = &zero, | ||
| 250 | .extra2 = &int_max, | ||
| 251 | }, | ||
| 252 | { | ||
| 253 | .procname = "shm_next_id", | ||
| 254 | .data = &init_ipc_ns.ids[IPC_SHM_IDS].next_id, | ||
| 255 | .maxlen = sizeof(init_ipc_ns.ids[IPC_SHM_IDS].next_id), | ||
| 256 | .mode = 0644, | ||
| 257 | .proc_handler = proc_ipc_dointvec_minmax, | ||
| 258 | .extra1 = &zero, | ||
| 259 | .extra2 = &int_max, | ||
| 260 | }, | ||
| 261 | #endif | ||
| 230 | {} | 262 | {} |
| 231 | }; | 263 | }; |
| 232 | 264 | ||
| @@ -755,26 +755,91 @@ static inline int convert_mode(long *msgtyp, int msgflg) | |||
| 755 | return SEARCH_EQUAL; | 755 | return SEARCH_EQUAL; |
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | long do_msgrcv(int msqid, long *pmtype, void __user *mtext, | 758 | static long do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz) |
| 759 | size_t msgsz, long msgtyp, int msgflg) | 759 | { |
| 760 | struct msgbuf __user *msgp = dest; | ||
| 761 | size_t msgsz; | ||
| 762 | |||
| 763 | if (put_user(msg->m_type, &msgp->mtype)) | ||
| 764 | return -EFAULT; | ||
| 765 | |||
| 766 | msgsz = (bufsz > msg->m_ts) ? msg->m_ts : bufsz; | ||
| 767 | if (store_msg(msgp->mtext, msg, msgsz)) | ||
| 768 | return -EFAULT; | ||
| 769 | return msgsz; | ||
| 770 | } | ||
| 771 | |||
| 772 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
| 773 | /* | ||
| 774 | * This function creates new kernel message structure, large enough to store | ||
| 775 | * bufsz message bytes. | ||
| 776 | */ | ||
| 777 | static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz, | ||
| 778 | int msgflg, long *msgtyp, | ||
| 779 | unsigned long *copy_number) | ||
| 780 | { | ||
| 781 | struct msg_msg *copy; | ||
| 782 | |||
| 783 | *copy_number = *msgtyp; | ||
| 784 | *msgtyp = 0; | ||
| 785 | /* | ||
| 786 | * Create dummy message to copy real message to. | ||
| 787 | */ | ||
| 788 | copy = load_msg(buf, bufsz); | ||
| 789 | if (!IS_ERR(copy)) | ||
| 790 | copy->m_ts = bufsz; | ||
| 791 | return copy; | ||
| 792 | } | ||
| 793 | |||
| 794 | static inline void free_copy(struct msg_msg *copy) | ||
| 795 | { | ||
| 796 | if (copy) | ||
| 797 | free_msg(copy); | ||
| 798 | } | ||
| 799 | #else | ||
| 800 | static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz, | ||
| 801 | int msgflg, long *msgtyp, | ||
| 802 | unsigned long *copy_number) | ||
| 803 | { | ||
| 804 | return ERR_PTR(-ENOSYS); | ||
| 805 | } | ||
| 806 | |||
| 807 | static inline void free_copy(struct msg_msg *copy) | ||
| 808 | { | ||
| 809 | } | ||
| 810 | #endif | ||
| 811 | |||
| 812 | long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, | ||
| 813 | int msgflg, | ||
| 814 | long (*msg_handler)(void __user *, struct msg_msg *, size_t)) | ||
| 760 | { | 815 | { |
| 761 | struct msg_queue *msq; | 816 | struct msg_queue *msq; |
| 762 | struct msg_msg *msg; | 817 | struct msg_msg *msg; |
| 763 | int mode; | 818 | int mode; |
| 764 | struct ipc_namespace *ns; | 819 | struct ipc_namespace *ns; |
| 820 | struct msg_msg *copy = NULL; | ||
| 821 | unsigned long copy_number = 0; | ||
| 765 | 822 | ||
| 766 | if (msqid < 0 || (long) msgsz < 0) | 823 | if (msqid < 0 || (long) bufsz < 0) |
| 767 | return -EINVAL; | 824 | return -EINVAL; |
| 825 | if (msgflg & MSG_COPY) { | ||
| 826 | copy = prepare_copy(buf, bufsz, msgflg, &msgtyp, ©_number); | ||
| 827 | if (IS_ERR(copy)) | ||
| 828 | return PTR_ERR(copy); | ||
| 829 | } | ||
| 768 | mode = convert_mode(&msgtyp, msgflg); | 830 | mode = convert_mode(&msgtyp, msgflg); |
| 769 | ns = current->nsproxy->ipc_ns; | 831 | ns = current->nsproxy->ipc_ns; |
| 770 | 832 | ||
| 771 | msq = msg_lock_check(ns, msqid); | 833 | msq = msg_lock_check(ns, msqid); |
| 772 | if (IS_ERR(msq)) | 834 | if (IS_ERR(msq)) { |
| 835 | free_copy(copy); | ||
| 773 | return PTR_ERR(msq); | 836 | return PTR_ERR(msq); |
| 837 | } | ||
| 774 | 838 | ||
| 775 | for (;;) { | 839 | for (;;) { |
| 776 | struct msg_receiver msr_d; | 840 | struct msg_receiver msr_d; |
| 777 | struct list_head *tmp; | 841 | struct list_head *tmp; |
| 842 | long msg_counter = 0; | ||
| 778 | 843 | ||
| 779 | msg = ERR_PTR(-EACCES); | 844 | msg = ERR_PTR(-EACCES); |
| 780 | if (ipcperms(ns, &msq->q_perm, S_IRUGO)) | 845 | if (ipcperms(ns, &msq->q_perm, S_IRUGO)) |
| @@ -793,12 +858,21 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext, | |||
| 793 | msg = walk_msg; | 858 | msg = walk_msg; |
| 794 | if (mode == SEARCH_LESSEQUAL && | 859 | if (mode == SEARCH_LESSEQUAL && |
| 795 | walk_msg->m_type != 1) { | 860 | walk_msg->m_type != 1) { |
| 796 | msg = walk_msg; | ||
| 797 | msgtyp = walk_msg->m_type - 1; | 861 | msgtyp = walk_msg->m_type - 1; |
| 798 | } else { | 862 | } else if (msgflg & MSG_COPY) { |
| 799 | msg = walk_msg; | 863 | if (copy_number == msg_counter) { |
| 864 | /* | ||
| 865 | * Found requested message. | ||
| 866 | * Copy it. | ||
| 867 | */ | ||
| 868 | msg = copy_msg(msg, copy); | ||
| 869 | if (IS_ERR(msg)) | ||
| 870 | goto out_unlock; | ||
| 871 | break; | ||
| 872 | } | ||
| 873 | } else | ||
| 800 | break; | 874 | break; |
| 801 | } | 875 | msg_counter++; |
| 802 | } | 876 | } |
| 803 | tmp = tmp->next; | 877 | tmp = tmp->next; |
| 804 | } | 878 | } |
| @@ -807,10 +881,16 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext, | |||
| 807 | * Found a suitable message. | 881 | * Found a suitable message. |
| 808 | * Unlink it from the queue. | 882 | * Unlink it from the queue. |
| 809 | */ | 883 | */ |
| 810 | if ((msgsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) { | 884 | if ((bufsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) { |
| 811 | msg = ERR_PTR(-E2BIG); | 885 | msg = ERR_PTR(-E2BIG); |
| 812 | goto out_unlock; | 886 | goto out_unlock; |
| 813 | } | 887 | } |
| 888 | /* | ||
| 889 | * If we are copying, then do not unlink message and do | ||
| 890 | * not update queue parameters. | ||
| 891 | */ | ||
| 892 | if (msgflg & MSG_COPY) | ||
| 893 | goto out_unlock; | ||
| 814 | list_del(&msg->m_list); | 894 | list_del(&msg->m_list); |
| 815 | msq->q_qnum--; | 895 | msq->q_qnum--; |
| 816 | msq->q_rtime = get_seconds(); | 896 | msq->q_rtime = get_seconds(); |
| @@ -834,7 +914,7 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext, | |||
| 834 | if (msgflg & MSG_NOERROR) | 914 | if (msgflg & MSG_NOERROR) |
| 835 | msr_d.r_maxsize = INT_MAX; | 915 | msr_d.r_maxsize = INT_MAX; |
| 836 | else | 916 | else |
| 837 | msr_d.r_maxsize = msgsz; | 917 | msr_d.r_maxsize = bufsz; |
| 838 | msr_d.r_msg = ERR_PTR(-EAGAIN); | 918 | msr_d.r_msg = ERR_PTR(-EAGAIN); |
| 839 | current->state = TASK_INTERRUPTIBLE; | 919 | current->state = TASK_INTERRUPTIBLE; |
| 840 | msg_unlock(msq); | 920 | msg_unlock(msq); |
| @@ -894,32 +974,21 @@ out_unlock: | |||
| 894 | break; | 974 | break; |
| 895 | } | 975 | } |
| 896 | } | 976 | } |
| 897 | if (IS_ERR(msg)) | 977 | if (IS_ERR(msg)) { |
| 978 | free_copy(copy); | ||
| 898 | return PTR_ERR(msg); | 979 | return PTR_ERR(msg); |
| 980 | } | ||
| 899 | 981 | ||
| 900 | msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz; | 982 | bufsz = msg_handler(buf, msg, bufsz); |
| 901 | *pmtype = msg->m_type; | ||
| 902 | if (store_msg(mtext, msg, msgsz)) | ||
| 903 | msgsz = -EFAULT; | ||
| 904 | |||
| 905 | free_msg(msg); | 983 | free_msg(msg); |
| 906 | 984 | ||
| 907 | return msgsz; | 985 | return bufsz; |
| 908 | } | 986 | } |
| 909 | 987 | ||
| 910 | SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz, | 988 | SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz, |
| 911 | long, msgtyp, int, msgflg) | 989 | long, msgtyp, int, msgflg) |
| 912 | { | 990 | { |
| 913 | long err, mtype; | 991 | return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill); |
| 914 | |||
| 915 | err = do_msgrcv(msqid, &mtype, msgp->mtext, msgsz, msgtyp, msgflg); | ||
| 916 | if (err < 0) | ||
| 917 | goto out; | ||
| 918 | |||
| 919 | if (put_user(mtype, &msgp->mtype)) | ||
| 920 | err = -EFAULT; | ||
| 921 | out: | ||
| 922 | return err; | ||
| 923 | } | 992 | } |
| 924 | 993 | ||
| 925 | #ifdef CONFIG_PROC_FS | 994 | #ifdef CONFIG_PROC_FS |
diff --git a/ipc/msgutil.c b/ipc/msgutil.c index 6471f1bdae96..ebfcbfa8b7f2 100644 --- a/ipc/msgutil.c +++ b/ipc/msgutil.c | |||
| @@ -102,7 +102,50 @@ out_err: | |||
| 102 | free_msg(msg); | 102 | free_msg(msg); |
| 103 | return ERR_PTR(err); | 103 | return ERR_PTR(err); |
| 104 | } | 104 | } |
| 105 | #ifdef CONFIG_CHECKPOINT_RESTORE | ||
| 106 | struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst) | ||
| 107 | { | ||
| 108 | struct msg_msgseg *dst_pseg, *src_pseg; | ||
| 109 | int len = src->m_ts; | ||
| 110 | int alen; | ||
| 111 | |||
| 112 | BUG_ON(dst == NULL); | ||
| 113 | if (src->m_ts > dst->m_ts) | ||
| 114 | return ERR_PTR(-EINVAL); | ||
| 105 | 115 | ||
| 116 | alen = len; | ||
| 117 | if (alen > DATALEN_MSG) | ||
| 118 | alen = DATALEN_MSG; | ||
| 119 | |||
| 120 | dst->next = NULL; | ||
| 121 | dst->security = NULL; | ||
| 122 | |||
| 123 | memcpy(dst + 1, src + 1, alen); | ||
| 124 | |||
| 125 | len -= alen; | ||
| 126 | dst_pseg = dst->next; | ||
| 127 | src_pseg = src->next; | ||
| 128 | while (len > 0) { | ||
| 129 | alen = len; | ||
| 130 | if (alen > DATALEN_SEG) | ||
| 131 | alen = DATALEN_SEG; | ||
| 132 | memcpy(dst_pseg + 1, src_pseg + 1, alen); | ||
| 133 | dst_pseg = dst_pseg->next; | ||
| 134 | len -= alen; | ||
| 135 | src_pseg = src_pseg->next; | ||
| 136 | } | ||
| 137 | |||
| 138 | dst->m_type = src->m_type; | ||
| 139 | dst->m_ts = src->m_ts; | ||
| 140 | |||
| 141 | return dst; | ||
| 142 | } | ||
| 143 | #else | ||
| 144 | struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst) | ||
| 145 | { | ||
| 146 | return ERR_PTR(-ENOSYS); | ||
| 147 | } | ||
| 148 | #endif | ||
| 106 | int store_msg(void __user *dest, struct msg_msg *msg, int len) | 149 | int store_msg(void __user *dest, struct msg_msg *msg, int len) |
| 107 | { | 150 | { |
| 108 | int alen; | 151 | int alen; |
diff --git a/ipc/util.c b/ipc/util.c index 72fd0785ac94..74e1d9c7a98a 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
| @@ -122,6 +122,7 @@ void ipc_init_ids(struct ipc_ids *ids) | |||
| 122 | 122 | ||
| 123 | ids->in_use = 0; | 123 | ids->in_use = 0; |
| 124 | ids->seq = 0; | 124 | ids->seq = 0; |
| 125 | ids->next_id = -1; | ||
| 125 | { | 126 | { |
| 126 | int seq_limit = INT_MAX/SEQ_MULTIPLIER; | 127 | int seq_limit = INT_MAX/SEQ_MULTIPLIER; |
| 127 | if (seq_limit > USHRT_MAX) | 128 | if (seq_limit > USHRT_MAX) |
| @@ -252,6 +253,7 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 252 | kuid_t euid; | 253 | kuid_t euid; |
| 253 | kgid_t egid; | 254 | kgid_t egid; |
| 254 | int id, err; | 255 | int id, err; |
| 256 | int next_id = ids->next_id; | ||
| 255 | 257 | ||
| 256 | if (size > IPCMNI) | 258 | if (size > IPCMNI) |
| 257 | size = IPCMNI; | 259 | size = IPCMNI; |
| @@ -264,7 +266,8 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 264 | rcu_read_lock(); | 266 | rcu_read_lock(); |
| 265 | spin_lock(&new->lock); | 267 | spin_lock(&new->lock); |
| 266 | 268 | ||
| 267 | err = idr_get_new(&ids->ipcs_idr, new, &id); | 269 | err = idr_get_new_above(&ids->ipcs_idr, new, |
| 270 | (next_id < 0) ? 0 : ipcid_to_idx(next_id), &id); | ||
| 268 | if (err) { | 271 | if (err) { |
| 269 | spin_unlock(&new->lock); | 272 | spin_unlock(&new->lock); |
| 270 | rcu_read_unlock(); | 273 | rcu_read_unlock(); |
| @@ -277,9 +280,14 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 277 | new->cuid = new->uid = euid; | 280 | new->cuid = new->uid = euid; |
| 278 | new->gid = new->cgid = egid; | 281 | new->gid = new->cgid = egid; |
| 279 | 282 | ||
| 280 | new->seq = ids->seq++; | 283 | if (next_id < 0) { |
| 281 | if(ids->seq > ids->seq_max) | 284 | new->seq = ids->seq++; |
| 282 | ids->seq = 0; | 285 | if (ids->seq > ids->seq_max) |
| 286 | ids->seq = 0; | ||
| 287 | } else { | ||
| 288 | new->seq = ipcid_to_seqx(next_id); | ||
| 289 | ids->next_id = -1; | ||
| 290 | } | ||
| 283 | 291 | ||
| 284 | new->id = ipc_buildid(id, new->seq); | 292 | new->id = ipc_buildid(id, new->seq); |
| 285 | return id; | 293 | return id; |
diff --git a/ipc/util.h b/ipc/util.h index c8fe2f7631e9..eeb79a1fbd83 100644 --- a/ipc/util.h +++ b/ipc/util.h | |||
| @@ -92,6 +92,7 @@ void __init ipc_init_proc_interface(const char *path, const char *header, | |||
| 92 | #define IPC_SHM_IDS 2 | 92 | #define IPC_SHM_IDS 2 |
| 93 | 93 | ||
| 94 | #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER) | 94 | #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER) |
| 95 | #define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER) | ||
| 95 | 96 | ||
| 96 | /* must be called with ids->rw_mutex acquired for writing */ | 97 | /* must be called with ids->rw_mutex acquired for writing */ |
| 97 | int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int); | 98 | int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int); |
| @@ -139,6 +140,7 @@ int ipc_parse_version (int *cmd); | |||
| 139 | 140 | ||
| 140 | extern void free_msg(struct msg_msg *msg); | 141 | extern void free_msg(struct msg_msg *msg); |
| 141 | extern struct msg_msg *load_msg(const void __user *src, int len); | 142 | extern struct msg_msg *load_msg(const void __user *src, int len); |
| 143 | extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst); | ||
| 142 | extern int store_msg(void __user *dest, struct msg_msg *msg, int len); | 144 | extern int store_msg(void __user *dest, struct msg_msg *msg, int len); |
| 143 | 145 | ||
| 144 | extern void recompute_msgmni(struct ipc_namespace *); | 146 | extern void recompute_msgmni(struct ipc_namespace *); |
diff --git a/kernel/printk.c b/kernel/printk.c index 19c0d7bcf24a..357f714ddd49 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -870,10 +870,11 @@ static size_t print_time(u64 ts, char *buf) | |||
| 870 | if (!printk_time) | 870 | if (!printk_time) |
| 871 | return 0; | 871 | return 0; |
| 872 | 872 | ||
| 873 | rem_nsec = do_div(ts, 1000000000); | ||
| 874 | |||
| 873 | if (!buf) | 875 | if (!buf) |
| 874 | return 15; | 876 | return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts); |
| 875 | 877 | ||
| 876 | rem_nsec = do_div(ts, 1000000000); | ||
| 877 | return sprintf(buf, "[%5lu.%06lu] ", | 878 | return sprintf(buf, "[%5lu.%06lu] ", |
| 878 | (unsigned long)ts, rem_nsec / 1000); | 879 | (unsigned long)ts, rem_nsec / 1000); |
| 879 | } | 880 | } |
diff --git a/mm/memory.c b/mm/memory.c index e0a9b0ce4f10..49fb1cf08611 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -184,10 +184,14 @@ static int tlb_next_batch(struct mmu_gather *tlb) | |||
| 184 | return 1; | 184 | return 1; |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | if (tlb->batch_count == MAX_GATHER_BATCH_COUNT) | ||
| 188 | return 0; | ||
| 189 | |||
| 187 | batch = (void *)__get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); | 190 | batch = (void *)__get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); |
| 188 | if (!batch) | 191 | if (!batch) |
| 189 | return 0; | 192 | return 0; |
| 190 | 193 | ||
| 194 | tlb->batch_count++; | ||
| 191 | batch->next = NULL; | 195 | batch->next = NULL; |
| 192 | batch->nr = 0; | 196 | batch->nr = 0; |
| 193 | batch->max = MAX_GATHER_BATCH; | 197 | batch->max = MAX_GATHER_BATCH; |
| @@ -216,6 +220,7 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm) | |||
| 216 | tlb->local.nr = 0; | 220 | tlb->local.nr = 0; |
| 217 | tlb->local.max = ARRAY_SIZE(tlb->__pages); | 221 | tlb->local.max = ARRAY_SIZE(tlb->__pages); |
| 218 | tlb->active = &tlb->local; | 222 | tlb->active = &tlb->local; |
| 223 | tlb->batch_count = 0; | ||
| 219 | 224 | ||
| 220 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | 225 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
| 221 | tlb->batch = NULL; | 226 | tlb->batch = NULL; |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 4ba5e37127fc..bc6cc0e913bd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -221,11 +221,6 @@ EXPORT_SYMBOL(nr_online_nodes); | |||
| 221 | 221 | ||
| 222 | int page_group_by_mobility_disabled __read_mostly; | 222 | int page_group_by_mobility_disabled __read_mostly; |
| 223 | 223 | ||
| 224 | /* | ||
| 225 | * NOTE: | ||
| 226 | * Don't use set_pageblock_migratetype(page, MIGRATE_ISOLATE) directly. | ||
| 227 | * Instead, use {un}set_pageblock_isolate. | ||
| 228 | */ | ||
| 229 | void set_pageblock_migratetype(struct page *page, int migratetype) | 224 | void set_pageblock_migratetype(struct page *page, int migratetype) |
| 230 | { | 225 | { |
| 231 | 226 | ||
| @@ -1655,20 +1650,6 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, | |||
| 1655 | return true; | 1650 | return true; |
| 1656 | } | 1651 | } |
| 1657 | 1652 | ||
| 1658 | #ifdef CONFIG_MEMORY_ISOLATION | ||
| 1659 | static inline unsigned long nr_zone_isolate_freepages(struct zone *zone) | ||
| 1660 | { | ||
| 1661 | if (unlikely(zone->nr_pageblock_isolate)) | ||
| 1662 | return zone->nr_pageblock_isolate * pageblock_nr_pages; | ||
| 1663 | return 0; | ||
| 1664 | } | ||
| 1665 | #else | ||
| 1666 | static inline unsigned long nr_zone_isolate_freepages(struct zone *zone) | ||
| 1667 | { | ||
| 1668 | return 0; | ||
| 1669 | } | ||
| 1670 | #endif | ||
| 1671 | |||
| 1672 | bool zone_watermark_ok(struct zone *z, int order, unsigned long mark, | 1653 | bool zone_watermark_ok(struct zone *z, int order, unsigned long mark, |
| 1673 | int classzone_idx, int alloc_flags) | 1654 | int classzone_idx, int alloc_flags) |
| 1674 | { | 1655 | { |
| @@ -1684,14 +1665,6 @@ bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark, | |||
| 1684 | if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark) | 1665 | if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark) |
| 1685 | free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES); | 1666 | free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES); |
| 1686 | 1667 | ||
| 1687 | /* | ||
| 1688 | * If the zone has MIGRATE_ISOLATE type free pages, we should consider | ||
| 1689 | * it. nr_zone_isolate_freepages is never accurate so kswapd might not | ||
| 1690 | * sleep although it could do so. But this is more desirable for memory | ||
| 1691 | * hotplug than sleeping which can cause a livelock in the direct | ||
| 1692 | * reclaim path. | ||
| 1693 | */ | ||
| 1694 | free_pages -= nr_zone_isolate_freepages(z); | ||
| 1695 | return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags, | 1668 | return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags, |
| 1696 | free_pages); | 1669 | free_pages); |
| 1697 | } | 1670 | } |
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 9d2264ea4606..383bdbb98b04 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c | |||
| @@ -8,28 +8,6 @@ | |||
| 8 | #include <linux/memory.h> | 8 | #include <linux/memory.h> |
| 9 | #include "internal.h" | 9 | #include "internal.h" |
| 10 | 10 | ||
| 11 | /* called while holding zone->lock */ | ||
| 12 | static void set_pageblock_isolate(struct page *page) | ||
| 13 | { | ||
| 14 | if (get_pageblock_migratetype(page) == MIGRATE_ISOLATE) | ||
| 15 | return; | ||
| 16 | |||
| 17 | set_pageblock_migratetype(page, MIGRATE_ISOLATE); | ||
| 18 | page_zone(page)->nr_pageblock_isolate++; | ||
| 19 | } | ||
| 20 | |||
| 21 | /* called while holding zone->lock */ | ||
| 22 | static void restore_pageblock_isolate(struct page *page, int migratetype) | ||
| 23 | { | ||
| 24 | struct zone *zone = page_zone(page); | ||
| 25 | if (WARN_ON(get_pageblock_migratetype(page) != MIGRATE_ISOLATE)) | ||
| 26 | return; | ||
| 27 | |||
| 28 | BUG_ON(zone->nr_pageblock_isolate <= 0); | ||
| 29 | set_pageblock_migratetype(page, migratetype); | ||
| 30 | zone->nr_pageblock_isolate--; | ||
| 31 | } | ||
| 32 | |||
| 33 | int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages) | 11 | int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages) |
| 34 | { | 12 | { |
| 35 | struct zone *zone; | 13 | struct zone *zone; |
| @@ -80,7 +58,7 @@ out: | |||
| 80 | unsigned long nr_pages; | 58 | unsigned long nr_pages; |
| 81 | int migratetype = get_pageblock_migratetype(page); | 59 | int migratetype = get_pageblock_migratetype(page); |
| 82 | 60 | ||
| 83 | set_pageblock_isolate(page); | 61 | set_pageblock_migratetype(page, MIGRATE_ISOLATE); |
| 84 | nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE); | 62 | nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE); |
| 85 | 63 | ||
| 86 | __mod_zone_freepage_state(zone, -nr_pages, migratetype); | 64 | __mod_zone_freepage_state(zone, -nr_pages, migratetype); |
| @@ -103,7 +81,7 @@ void unset_migratetype_isolate(struct page *page, unsigned migratetype) | |||
| 103 | goto out; | 81 | goto out; |
| 104 | nr_pages = move_freepages_block(zone, page, migratetype); | 82 | nr_pages = move_freepages_block(zone, page, migratetype); |
| 105 | __mod_zone_freepage_state(zone, nr_pages, migratetype); | 83 | __mod_zone_freepage_state(zone, nr_pages, migratetype); |
| 106 | restore_pageblock_isolate(page, migratetype); | 84 | set_pageblock_migratetype(page, migratetype); |
| 107 | out: | 85 | out: |
| 108 | spin_unlock_irqrestore(&zone->lock, flags); | 86 | spin_unlock_irqrestore(&zone->lock, flags); |
| 109 | } | 87 | } |
diff --git a/tools/testing/selftests/ipc/Makefile b/tools/testing/selftests/ipc/Makefile new file mode 100644 index 000000000000..5386fd7c43ae --- /dev/null +++ b/tools/testing/selftests/ipc/Makefile | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | uname_M := $(shell uname -m 2>/dev/null || echo not) | ||
| 2 | ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/) | ||
| 3 | ifeq ($(ARCH),i386) | ||
| 4 | ARCH := X86 | ||
| 5 | CFLAGS := -DCONFIG_X86_32 -D__i386__ | ||
| 6 | endif | ||
| 7 | ifeq ($(ARCH),x86_64) | ||
| 8 | ARCH := X86 | ||
| 9 | CFLAGS := -DCONFIG_X86_64 -D__x86_64__ | ||
| 10 | endif | ||
| 11 | |||
| 12 | CFLAGS += -I../../../../usr/include/ | ||
| 13 | |||
| 14 | all: | ||
| 15 | ifeq ($(ARCH),X86) | ||
| 16 | gcc $(CFLAGS) msgque.c -o msgque_test | ||
| 17 | else | ||
| 18 | echo "Not an x86 target, can't build msgque selftest" | ||
| 19 | endif | ||
| 20 | |||
| 21 | run_tests: all | ||
| 22 | ./msgque_test | ||
| 23 | |||
| 24 | clean: | ||
| 25 | rm -fr ./msgque_test | ||
diff --git a/tools/testing/selftests/ipc/msgque.c b/tools/testing/selftests/ipc/msgque.c new file mode 100644 index 000000000000..d66418237d21 --- /dev/null +++ b/tools/testing/selftests/ipc/msgque.c | |||
| @@ -0,0 +1,246 @@ | |||
| 1 | #include <stdlib.h> | ||
| 2 | #include <stdio.h> | ||
| 3 | #include <string.h> | ||
| 4 | #include <errno.h> | ||
| 5 | #include <linux/msg.h> | ||
| 6 | #include <fcntl.h> | ||
| 7 | |||
| 8 | #define MAX_MSG_SIZE 32 | ||
| 9 | |||
| 10 | struct msg1 { | ||
| 11 | int msize; | ||
| 12 | long mtype; | ||
| 13 | char mtext[MAX_MSG_SIZE]; | ||
| 14 | }; | ||
| 15 | |||
| 16 | #define TEST_STRING "Test sysv5 msg" | ||
| 17 | #define MSG_TYPE 1 | ||
| 18 | |||
| 19 | #define ANOTHER_TEST_STRING "Yet another test sysv5 msg" | ||
| 20 | #define ANOTHER_MSG_TYPE 26538 | ||
| 21 | |||
| 22 | struct msgque_data { | ||
| 23 | key_t key; | ||
| 24 | int msq_id; | ||
| 25 | int qbytes; | ||
| 26 | int qnum; | ||
| 27 | int mode; | ||
| 28 | struct msg1 *messages; | ||
| 29 | }; | ||
| 30 | |||
| 31 | int restore_queue(struct msgque_data *msgque) | ||
| 32 | { | ||
| 33 | int fd, ret, id, i; | ||
| 34 | char buf[32]; | ||
| 35 | |||
| 36 | fd = open("/proc/sys/kernel/msg_next_id", O_WRONLY); | ||
| 37 | if (fd == -1) { | ||
| 38 | printf("Failed to open /proc/sys/kernel/msg_next_id\n"); | ||
| 39 | return -errno; | ||
| 40 | } | ||
| 41 | sprintf(buf, "%d", msgque->msq_id); | ||
| 42 | |||
| 43 | ret = write(fd, buf, strlen(buf)); | ||
| 44 | if (ret != strlen(buf)) { | ||
| 45 | printf("Failed to write to /proc/sys/kernel/msg_next_id\n"); | ||
| 46 | return -errno; | ||
| 47 | } | ||
| 48 | |||
| 49 | id = msgget(msgque->key, msgque->mode | IPC_CREAT | IPC_EXCL); | ||
| 50 | if (id == -1) { | ||
| 51 | printf("Failed to create queue\n"); | ||
| 52 | return -errno; | ||
| 53 | } | ||
| 54 | |||
| 55 | if (id != msgque->msq_id) { | ||
| 56 | printf("Restored queue has wrong id (%d instead of %d)\n", | ||
| 57 | id, msgque->msq_id); | ||
| 58 | ret = -EFAULT; | ||
| 59 | goto destroy; | ||
| 60 | } | ||
| 61 | |||
| 62 | for (i = 0; i < msgque->qnum; i++) { | ||
| 63 | if (msgsnd(msgque->msq_id, &msgque->messages[i].mtype, | ||
| 64 | msgque->messages[i].msize, IPC_NOWAIT) != 0) { | ||
| 65 | printf("msgsnd failed (%m)\n"); | ||
| 66 | ret = -errno; | ||
| 67 | goto destroy; | ||
| 68 | }; | ||
| 69 | } | ||
| 70 | return 0; | ||
| 71 | |||
| 72 | destroy: | ||
| 73 | if (msgctl(id, IPC_RMID, 0)) | ||
| 74 | printf("Failed to destroy queue: %d\n", -errno); | ||
| 75 | return ret; | ||
| 76 | } | ||
| 77 | |||
| 78 | int check_and_destroy_queue(struct msgque_data *msgque) | ||
| 79 | { | ||
| 80 | struct msg1 message; | ||
| 81 | int cnt = 0, ret; | ||
| 82 | |||
| 83 | while (1) { | ||
| 84 | ret = msgrcv(msgque->msq_id, &message.mtype, MAX_MSG_SIZE, | ||
| 85 | 0, IPC_NOWAIT); | ||
| 86 | if (ret < 0) { | ||
| 87 | if (errno == ENOMSG) | ||
| 88 | break; | ||
| 89 | printf("Failed to read IPC message: %m\n"); | ||
| 90 | ret = -errno; | ||
| 91 | goto err; | ||
| 92 | } | ||
| 93 | if (ret != msgque->messages[cnt].msize) { | ||
| 94 | printf("Wrong message size: %d (expected %d)\n", ret, | ||
| 95 | msgque->messages[cnt].msize); | ||
| 96 | ret = -EINVAL; | ||
| 97 | goto err; | ||
| 98 | } | ||
| 99 | if (message.mtype != msgque->messages[cnt].mtype) { | ||
| 100 | printf("Wrong message type\n"); | ||
| 101 | ret = -EINVAL; | ||
| 102 | goto err; | ||
| 103 | } | ||
| 104 | if (memcmp(message.mtext, msgque->messages[cnt].mtext, ret)) { | ||
| 105 | printf("Wrong message content\n"); | ||
| 106 | ret = -EINVAL; | ||
| 107 | goto err; | ||
| 108 | } | ||
| 109 | cnt++; | ||
| 110 | } | ||
| 111 | |||
| 112 | if (cnt != msgque->qnum) { | ||
| 113 | printf("Wrong message number\n"); | ||
| 114 | ret = -EINVAL; | ||
| 115 | goto err; | ||
| 116 | } | ||
| 117 | |||
| 118 | ret = 0; | ||
| 119 | err: | ||
| 120 | if (msgctl(msgque->msq_id, IPC_RMID, 0)) { | ||
| 121 | printf("Failed to destroy queue: %d\n", -errno); | ||
| 122 | return -errno; | ||
| 123 | } | ||
| 124 | return ret; | ||
| 125 | } | ||
| 126 | |||
| 127 | int dump_queue(struct msgque_data *msgque) | ||
| 128 | { | ||
| 129 | struct msqid64_ds ds; | ||
| 130 | int kern_id; | ||
| 131 | int i, ret; | ||
| 132 | |||
| 133 | for (kern_id = 0; kern_id < 256; kern_id++) { | ||
| 134 | ret = msgctl(kern_id, MSG_STAT, &ds); | ||
| 135 | if (ret < 0) { | ||
| 136 | if (errno == -EINVAL) | ||
| 137 | continue; | ||
| 138 | printf("Failed to get stats for IPC queue with id %d\n", | ||
| 139 | kern_id); | ||
| 140 | return -errno; | ||
| 141 | } | ||
| 142 | |||
| 143 | if (ret == msgque->msq_id) | ||
| 144 | break; | ||
| 145 | } | ||
| 146 | |||
| 147 | msgque->messages = malloc(sizeof(struct msg1) * ds.msg_qnum); | ||
| 148 | if (msgque->messages == NULL) { | ||
| 149 | printf("Failed to get stats for IPC queue\n"); | ||
| 150 | return -ENOMEM; | ||
| 151 | } | ||
| 152 | |||
| 153 | msgque->qnum = ds.msg_qnum; | ||
| 154 | msgque->mode = ds.msg_perm.mode; | ||
| 155 | msgque->qbytes = ds.msg_qbytes; | ||
| 156 | |||
| 157 | for (i = 0; i < msgque->qnum; i++) { | ||
| 158 | ret = msgrcv(msgque->msq_id, &msgque->messages[i].mtype, | ||
| 159 | MAX_MSG_SIZE, i, IPC_NOWAIT | MSG_COPY); | ||
| 160 | if (ret < 0) { | ||
| 161 | printf("Failed to copy IPC message: %m (%d)\n", errno); | ||
| 162 | return -errno; | ||
| 163 | } | ||
| 164 | msgque->messages[i].msize = ret; | ||
| 165 | } | ||
| 166 | return 0; | ||
| 167 | } | ||
| 168 | |||
| 169 | int fill_msgque(struct msgque_data *msgque) | ||
| 170 | { | ||
| 171 | struct msg1 msgbuf; | ||
| 172 | |||
| 173 | msgbuf.mtype = MSG_TYPE; | ||
| 174 | memcpy(msgbuf.mtext, TEST_STRING, sizeof(TEST_STRING)); | ||
| 175 | if (msgsnd(msgque->msq_id, &msgbuf.mtype, sizeof(TEST_STRING), | ||
| 176 | IPC_NOWAIT) != 0) { | ||
| 177 | printf("First message send failed (%m)\n"); | ||
| 178 | return -errno; | ||
| 179 | }; | ||
| 180 | |||
| 181 | msgbuf.mtype = ANOTHER_MSG_TYPE; | ||
| 182 | memcpy(msgbuf.mtext, ANOTHER_TEST_STRING, sizeof(ANOTHER_TEST_STRING)); | ||
| 183 | if (msgsnd(msgque->msq_id, &msgbuf.mtype, sizeof(ANOTHER_TEST_STRING), | ||
| 184 | IPC_NOWAIT) != 0) { | ||
| 185 | printf("Second message send failed (%m)\n"); | ||
| 186 | return -errno; | ||
| 187 | }; | ||
| 188 | return 0; | ||
| 189 | } | ||
| 190 | |||
| 191 | int main(int argc, char **argv) | ||
| 192 | { | ||
| 193 | int msg, pid, err; | ||
| 194 | struct msgque_data msgque; | ||
| 195 | |||
| 196 | msgque.key = ftok(argv[0], 822155650); | ||
| 197 | if (msgque.key == -1) { | ||
| 198 | printf("Can't make key\n"); | ||
| 199 | return -errno; | ||
| 200 | } | ||
| 201 | |||
| 202 | msgque.msq_id = msgget(msgque.key, IPC_CREAT | IPC_EXCL | 0666); | ||
| 203 | if (msgque.msq_id == -1) { | ||
| 204 | printf("Can't create queue\n"); | ||
| 205 | goto err_out; | ||
| 206 | } | ||
| 207 | |||
| 208 | err = fill_msgque(&msgque); | ||
| 209 | if (err) { | ||
| 210 | printf("Failed to fill queue\n"); | ||
| 211 | goto err_destroy; | ||
| 212 | } | ||
| 213 | |||
| 214 | err = dump_queue(&msgque); | ||
| 215 | if (err) { | ||
| 216 | printf("Failed to dump queue\n"); | ||
| 217 | goto err_destroy; | ||
| 218 | } | ||
| 219 | |||
| 220 | err = check_and_destroy_queue(&msgque); | ||
| 221 | if (err) { | ||
| 222 | printf("Failed to check and destroy queue\n"); | ||
| 223 | goto err_out; | ||
| 224 | } | ||
| 225 | |||
| 226 | err = restore_queue(&msgque); | ||
| 227 | if (err) { | ||
| 228 | printf("Failed to restore queue\n"); | ||
| 229 | goto err_destroy; | ||
| 230 | } | ||
| 231 | |||
| 232 | err = check_and_destroy_queue(&msgque); | ||
| 233 | if (err) { | ||
| 234 | printf("Failed to test queue\n"); | ||
| 235 | goto err_out; | ||
| 236 | } | ||
| 237 | return 0; | ||
| 238 | |||
| 239 | err_destroy: | ||
| 240 | if (msgctl(msgque.msq_id, IPC_RMID, 0)) { | ||
| 241 | printf("Failed to destroy queue: %d\n", -errno); | ||
| 242 | return -errno; | ||
| 243 | } | ||
| 244 | err_out: | ||
| 245 | return err; | ||
| 246 | } | ||
