diff options
116 files changed, 863 insertions, 354 deletions
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index dd10b51b4e65..5405f7aecefc 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
| @@ -32,8 +32,6 @@ DocBook/ | |||
| 32 | - directory with DocBook templates etc. for kernel documentation. | 32 | - directory with DocBook templates etc. for kernel documentation. |
| 33 | HOWTO | 33 | HOWTO |
| 34 | - the process and procedures of how to do Linux kernel development. | 34 | - the process and procedures of how to do Linux kernel development. |
| 35 | IO-mapping.txt | ||
| 36 | - how to access I/O mapped memory from within device drivers. | ||
| 37 | IPMI.txt | 35 | IPMI.txt |
| 38 | - info on Linux Intelligent Platform Management Interface (IPMI) Driver. | 36 | - info on Linux Intelligent Platform Management Interface (IPMI) Driver. |
| 39 | IRQ-affinity.txt | 37 | IRQ-affinity.txt |
| @@ -84,6 +82,8 @@ blockdev/ | |||
| 84 | - info on block devices & drivers | 82 | - info on block devices & drivers |
| 85 | btmrvl.txt | 83 | btmrvl.txt |
| 86 | - info on Marvell Bluetooth driver usage. | 84 | - info on Marvell Bluetooth driver usage. |
| 85 | bus-virt-phys-mapping.txt | ||
| 86 | - how to access I/O mapped memory from within device drivers. | ||
| 87 | cachetlb.txt | 87 | cachetlb.txt |
| 88 | - describes the cache/TLB flushing interfaces Linux uses. | 88 | - describes the cache/TLB flushing interfaces Linux uses. |
| 89 | cdrom/ | 89 | cdrom/ |
| @@ -168,6 +168,8 @@ initrd.txt | |||
| 168 | - how to use the RAM disk as an initial/temporary root filesystem. | 168 | - how to use the RAM disk as an initial/temporary root filesystem. |
| 169 | input/ | 169 | input/ |
| 170 | - info on Linux input device support. | 170 | - info on Linux input device support. |
| 171 | io-mapping.txt | ||
| 172 | - description of io_mapping functions in linux/io-mapping.h | ||
| 171 | io_ordering.txt | 173 | io_ordering.txt |
| 172 | - info on ordering I/O writes to memory-mapped addresses. | 174 | - info on ordering I/O writes to memory-mapped addresses. |
| 173 | ioctl/ | 175 | ioctl/ |
diff --git a/Documentation/IO-mapping.txt b/Documentation/bus-virt-phys-mapping.txt index 1b5aa10df845..1b5aa10df845 100644 --- a/Documentation/IO-mapping.txt +++ b/Documentation/bus-virt-phys-mapping.txt | |||
diff --git a/MAINTAINERS b/MAINTAINERS index 58848125b8bf..db3d0f5061f9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -5336,6 +5336,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git | |||
| 5336 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git | 5336 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git |
| 5337 | S: Maintained | 5337 | S: Maintained |
| 5338 | F: arch/sparc/ | 5338 | F: arch/sparc/ |
| 5339 | F: drivers/sbus | ||
| 5339 | 5340 | ||
| 5340 | SPARC SERIAL DRIVERS | 5341 | SPARC SERIAL DRIVERS |
| 5341 | M: "David S. Miller" <davem@davemloft.net> | 5342 | M: "David S. Miller" <davem@davemloft.net> |
diff --git a/arch/sparc/configs/sparc64_defconfig b/arch/sparc/configs/sparc64_defconfig index 259e3fd50993..1dc07a0014c1 100644 --- a/arch/sparc/configs/sparc64_defconfig +++ b/arch/sparc/configs/sparc64_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.34-rc3 | 3 | # Linux kernel version: 2.6.34 |
| 4 | # Sat Apr 3 15:49:56 2010 | 4 | # Wed May 26 21:14:01 2010 |
| 5 | # | 5 | # |
| 6 | CONFIG_64BIT=y | 6 | CONFIG_64BIT=y |
| 7 | CONFIG_SPARC=y | 7 | CONFIG_SPARC=y |
| @@ -107,10 +107,9 @@ CONFIG_PERF_COUNTERS=y | |||
| 107 | # CONFIG_DEBUG_PERF_USE_VMALLOC is not set | 107 | # CONFIG_DEBUG_PERF_USE_VMALLOC is not set |
| 108 | CONFIG_VM_EVENT_COUNTERS=y | 108 | CONFIG_VM_EVENT_COUNTERS=y |
| 109 | CONFIG_PCI_QUIRKS=y | 109 | CONFIG_PCI_QUIRKS=y |
| 110 | CONFIG_SLUB_DEBUG=y | ||
| 111 | # CONFIG_COMPAT_BRK is not set | 110 | # CONFIG_COMPAT_BRK is not set |
| 112 | # CONFIG_SLAB is not set | 111 | CONFIG_SLAB=y |
| 113 | CONFIG_SLUB=y | 112 | # CONFIG_SLUB is not set |
| 114 | # CONFIG_SLOB is not set | 113 | # CONFIG_SLOB is not set |
| 115 | CONFIG_PROFILING=y | 114 | CONFIG_PROFILING=y |
| 116 | CONFIG_TRACEPOINTS=y | 115 | CONFIG_TRACEPOINTS=y |
| @@ -239,6 +238,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | |||
| 239 | CONFIG_SPARSEMEM_VMEMMAP=y | 238 | CONFIG_SPARSEMEM_VMEMMAP=y |
| 240 | CONFIG_PAGEFLAGS_EXTENDED=y | 239 | CONFIG_PAGEFLAGS_EXTENDED=y |
| 241 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 240 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
| 241 | # CONFIG_COMPACTION is not set | ||
| 242 | CONFIG_MIGRATION=y | 242 | CONFIG_MIGRATION=y |
| 243 | CONFIG_PHYS_ADDR_T_64BIT=y | 243 | CONFIG_PHYS_ADDR_T_64BIT=y |
| 244 | CONFIG_ZONE_DMA_FLAG=0 | 244 | CONFIG_ZONE_DMA_FLAG=0 |
| @@ -351,6 +351,7 @@ CONFIG_IPV6_TUNNEL=m | |||
| 351 | # CONFIG_RDS is not set | 351 | # CONFIG_RDS is not set |
| 352 | # CONFIG_TIPC is not set | 352 | # CONFIG_TIPC is not set |
| 353 | # CONFIG_ATM is not set | 353 | # CONFIG_ATM is not set |
| 354 | # CONFIG_L2TP is not set | ||
| 354 | # CONFIG_BRIDGE is not set | 355 | # CONFIG_BRIDGE is not set |
| 355 | # CONFIG_NET_DSA is not set | 356 | # CONFIG_NET_DSA is not set |
| 356 | CONFIG_VLAN_8021Q=m | 357 | CONFIG_VLAN_8021Q=m |
| @@ -367,6 +368,7 @@ CONFIG_VLAN_8021Q=m | |||
| 367 | # CONFIG_IEEE802154 is not set | 368 | # CONFIG_IEEE802154 is not set |
| 368 | # CONFIG_NET_SCHED is not set | 369 | # CONFIG_NET_SCHED is not set |
| 369 | # CONFIG_DCB is not set | 370 | # CONFIG_DCB is not set |
| 371 | CONFIG_RPS=y | ||
| 370 | 372 | ||
| 371 | # | 373 | # |
| 372 | # Network testing | 374 | # Network testing |
| @@ -386,9 +388,14 @@ CONFIG_WIRELESS=y | |||
| 386 | # | 388 | # |
| 387 | # CFG80211 needs to be enabled for MAC80211 | 389 | # CFG80211 needs to be enabled for MAC80211 |
| 388 | # | 390 | # |
| 391 | |||
| 392 | # | ||
| 393 | # Some wireless drivers require a rate control algorithm | ||
| 394 | # | ||
| 389 | # CONFIG_WIMAX is not set | 395 | # CONFIG_WIMAX is not set |
| 390 | # CONFIG_RFKILL is not set | 396 | # CONFIG_RFKILL is not set |
| 391 | # CONFIG_NET_9P is not set | 397 | # CONFIG_NET_9P is not set |
| 398 | # CONFIG_CAIF is not set | ||
| 392 | 399 | ||
| 393 | # | 400 | # |
| 394 | # Device Drivers | 401 | # Device Drivers |
| @@ -658,6 +665,7 @@ CONFIG_PHYLIB=m | |||
| 658 | # CONFIG_NATIONAL_PHY is not set | 665 | # CONFIG_NATIONAL_PHY is not set |
| 659 | # CONFIG_STE10XP is not set | 666 | # CONFIG_STE10XP is not set |
| 660 | # CONFIG_LSI_ET1011C_PHY is not set | 667 | # CONFIG_LSI_ET1011C_PHY is not set |
| 668 | # CONFIG_MICREL_PHY is not set | ||
| 661 | # CONFIG_MDIO_BITBANG is not set | 669 | # CONFIG_MDIO_BITBANG is not set |
| 662 | CONFIG_NET_ETHERNET=y | 670 | CONFIG_NET_ETHERNET=y |
| 663 | CONFIG_MII=m | 671 | CONFIG_MII=m |
| @@ -734,6 +742,8 @@ CONFIG_NETDEV_10000=y | |||
| 734 | # CONFIG_CHELSIO_T1 is not set | 742 | # CONFIG_CHELSIO_T1 is not set |
| 735 | CONFIG_CHELSIO_T3_DEPENDS=y | 743 | CONFIG_CHELSIO_T3_DEPENDS=y |
| 736 | # CONFIG_CHELSIO_T3 is not set | 744 | # CONFIG_CHELSIO_T3 is not set |
| 745 | CONFIG_CHELSIO_T4_DEPENDS=y | ||
| 746 | # CONFIG_CHELSIO_T4 is not set | ||
| 737 | # CONFIG_ENIC is not set | 747 | # CONFIG_ENIC is not set |
| 738 | # CONFIG_IXGBE is not set | 748 | # CONFIG_IXGBE is not set |
| 739 | # CONFIG_IXGBEVF is not set | 749 | # CONFIG_IXGBEVF is not set |
| @@ -766,6 +776,7 @@ CONFIG_NIU=m | |||
| 766 | # CONFIG_USB_PEGASUS is not set | 776 | # CONFIG_USB_PEGASUS is not set |
| 767 | # CONFIG_USB_RTL8150 is not set | 777 | # CONFIG_USB_RTL8150 is not set |
| 768 | # CONFIG_USB_USBNET is not set | 778 | # CONFIG_USB_USBNET is not set |
| 779 | # CONFIG_USB_IPHETH is not set | ||
| 769 | # CONFIG_WAN is not set | 780 | # CONFIG_WAN is not set |
| 770 | # CONFIG_FDDI is not set | 781 | # CONFIG_FDDI is not set |
| 771 | # CONFIG_HIPPI is not set | 782 | # CONFIG_HIPPI is not set |
| @@ -778,7 +789,6 @@ CONFIG_PPP_DEFLATE=m | |||
| 778 | CONFIG_PPP_BSDCOMP=m | 789 | CONFIG_PPP_BSDCOMP=m |
| 779 | CONFIG_PPP_MPPE=m | 790 | CONFIG_PPP_MPPE=m |
| 780 | CONFIG_PPPOE=m | 791 | CONFIG_PPPOE=m |
| 781 | # CONFIG_PPPOL2TP is not set | ||
| 782 | # CONFIG_SLIP is not set | 792 | # CONFIG_SLIP is not set |
| 783 | CONFIG_SLHC=m | 793 | CONFIG_SLHC=m |
| 784 | # CONFIG_NET_FC is not set | 794 | # CONFIG_NET_FC is not set |
| @@ -816,6 +826,7 @@ CONFIG_INPUT_KEYBOARD=y | |||
| 816 | CONFIG_KEYBOARD_ATKBD=y | 826 | CONFIG_KEYBOARD_ATKBD=y |
| 817 | # CONFIG_QT2160 is not set | 827 | # CONFIG_QT2160 is not set |
| 818 | CONFIG_KEYBOARD_LKKBD=m | 828 | CONFIG_KEYBOARD_LKKBD=m |
| 829 | # CONFIG_KEYBOARD_TCA6416 is not set | ||
| 819 | # CONFIG_KEYBOARD_MAX7359 is not set | 830 | # CONFIG_KEYBOARD_MAX7359 is not set |
| 820 | # CONFIG_KEYBOARD_NEWTON is not set | 831 | # CONFIG_KEYBOARD_NEWTON is not set |
| 821 | # CONFIG_KEYBOARD_OPENCORES is not set | 832 | # CONFIG_KEYBOARD_OPENCORES is not set |
| @@ -840,6 +851,7 @@ CONFIG_MOUSE_SERIAL=y | |||
| 840 | # CONFIG_INPUT_TABLET is not set | 851 | # CONFIG_INPUT_TABLET is not set |
| 841 | # CONFIG_INPUT_TOUCHSCREEN is not set | 852 | # CONFIG_INPUT_TOUCHSCREEN is not set |
| 842 | CONFIG_INPUT_MISC=y | 853 | CONFIG_INPUT_MISC=y |
| 854 | # CONFIG_INPUT_AD714X is not set | ||
| 843 | CONFIG_INPUT_SPARCSPKR=y | 855 | CONFIG_INPUT_SPARCSPKR=y |
| 844 | # CONFIG_INPUT_ATI_REMOTE is not set | 856 | # CONFIG_INPUT_ATI_REMOTE is not set |
| 845 | # CONFIG_INPUT_ATI_REMOTE2 is not set | 857 | # CONFIG_INPUT_ATI_REMOTE2 is not set |
| @@ -848,6 +860,7 @@ CONFIG_INPUT_SPARCSPKR=y | |||
| 848 | # CONFIG_INPUT_YEALINK is not set | 860 | # CONFIG_INPUT_YEALINK is not set |
| 849 | # CONFIG_INPUT_CM109 is not set | 861 | # CONFIG_INPUT_CM109 is not set |
| 850 | # CONFIG_INPUT_UINPUT is not set | 862 | # CONFIG_INPUT_UINPUT is not set |
| 863 | # CONFIG_INPUT_PCF8574 is not set | ||
| 851 | 864 | ||
| 852 | # | 865 | # |
| 853 | # Hardware I/O ports | 866 | # Hardware I/O ports |
| @@ -871,6 +884,7 @@ CONFIG_HW_CONSOLE=y | |||
| 871 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | 884 | # CONFIG_VT_HW_CONSOLE_BINDING is not set |
| 872 | # CONFIG_DEVKMEM is not set | 885 | # CONFIG_DEVKMEM is not set |
| 873 | # CONFIG_SERIAL_NONSTANDARD is not set | 886 | # CONFIG_SERIAL_NONSTANDARD is not set |
| 887 | # CONFIG_N_GSM is not set | ||
| 874 | # CONFIG_NOZOMI is not set | 888 | # CONFIG_NOZOMI is not set |
| 875 | 889 | ||
| 876 | # | 890 | # |
| @@ -893,6 +907,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y | |||
| 893 | # CONFIG_SERIAL_JSM is not set | 907 | # CONFIG_SERIAL_JSM is not set |
| 894 | # CONFIG_SERIAL_TIMBERDALE is not set | 908 | # CONFIG_SERIAL_TIMBERDALE is not set |
| 895 | # CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set | 909 | # CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set |
| 910 | # CONFIG_SERIAL_ALTERA_JTAGUART is not set | ||
| 911 | # CONFIG_SERIAL_ALTERA_UART is not set | ||
| 896 | CONFIG_UNIX98_PTYS=y | 912 | CONFIG_UNIX98_PTYS=y |
| 897 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | 913 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set |
| 898 | # CONFIG_LEGACY_PTYS is not set | 914 | # CONFIG_LEGACY_PTYS is not set |
| @@ -1306,11 +1322,14 @@ CONFIG_USB_HIDDEV=y | |||
| 1306 | CONFIG_HID_A4TECH=y | 1322 | CONFIG_HID_A4TECH=y |
| 1307 | CONFIG_HID_APPLE=y | 1323 | CONFIG_HID_APPLE=y |
| 1308 | CONFIG_HID_BELKIN=y | 1324 | CONFIG_HID_BELKIN=y |
| 1325 | # CONFIG_HID_CANDO is not set | ||
| 1309 | CONFIG_HID_CHERRY=y | 1326 | CONFIG_HID_CHERRY=y |
| 1310 | CONFIG_HID_CHICONY=y | 1327 | CONFIG_HID_CHICONY=y |
| 1328 | # CONFIG_HID_PRODIKEYS is not set | ||
| 1311 | CONFIG_HID_CYPRESS=y | 1329 | CONFIG_HID_CYPRESS=y |
| 1312 | CONFIG_HID_DRAGONRISE=y | 1330 | CONFIG_HID_DRAGONRISE=y |
| 1313 | # CONFIG_DRAGONRISE_FF is not set | 1331 | # CONFIG_DRAGONRISE_FF is not set |
| 1332 | # CONFIG_HID_EGALAX is not set | ||
| 1314 | CONFIG_HID_EZKEY=y | 1333 | CONFIG_HID_EZKEY=y |
| 1315 | CONFIG_HID_KYE=y | 1334 | CONFIG_HID_KYE=y |
| 1316 | CONFIG_HID_GYRATION=y | 1335 | CONFIG_HID_GYRATION=y |
| @@ -1328,7 +1347,9 @@ CONFIG_HID_ORTEK=y | |||
| 1328 | CONFIG_HID_PANTHERLORD=y | 1347 | CONFIG_HID_PANTHERLORD=y |
| 1329 | # CONFIG_PANTHERLORD_FF is not set | 1348 | # CONFIG_PANTHERLORD_FF is not set |
| 1330 | CONFIG_HID_PETALYNX=y | 1349 | CONFIG_HID_PETALYNX=y |
| 1350 | # CONFIG_HID_PICOLCD is not set | ||
| 1331 | # CONFIG_HID_QUANTA is not set | 1351 | # CONFIG_HID_QUANTA is not set |
| 1352 | # CONFIG_HID_ROCCAT_KONE is not set | ||
| 1332 | CONFIG_HID_SAMSUNG=y | 1353 | CONFIG_HID_SAMSUNG=y |
| 1333 | CONFIG_HID_SONY=y | 1354 | CONFIG_HID_SONY=y |
| 1334 | # CONFIG_HID_STANTUM is not set | 1355 | # CONFIG_HID_STANTUM is not set |
| @@ -1342,6 +1363,7 @@ CONFIG_HID_THRUSTMASTER=y | |||
| 1342 | # CONFIG_THRUSTMASTER_FF is not set | 1363 | # CONFIG_THRUSTMASTER_FF is not set |
| 1343 | CONFIG_HID_ZEROPLUS=y | 1364 | CONFIG_HID_ZEROPLUS=y |
| 1344 | # CONFIG_ZEROPLUS_FF is not set | 1365 | # CONFIG_ZEROPLUS_FF is not set |
| 1366 | # CONFIG_HID_ZYDACRON is not set | ||
| 1345 | CONFIG_USB_SUPPORT=y | 1367 | CONFIG_USB_SUPPORT=y |
| 1346 | CONFIG_USB_ARCH_HAS_HCD=y | 1368 | CONFIG_USB_ARCH_HAS_HCD=y |
| 1347 | CONFIG_USB_ARCH_HAS_OHCI=y | 1369 | CONFIG_USB_ARCH_HAS_OHCI=y |
| @@ -1356,7 +1378,6 @@ CONFIG_USB=y | |||
| 1356 | # CONFIG_USB_DEVICEFS is not set | 1378 | # CONFIG_USB_DEVICEFS is not set |
| 1357 | # CONFIG_USB_DEVICE_CLASS is not set | 1379 | # CONFIG_USB_DEVICE_CLASS is not set |
| 1358 | # CONFIG_USB_DYNAMIC_MINORS is not set | 1380 | # CONFIG_USB_DYNAMIC_MINORS is not set |
| 1359 | # CONFIG_USB_OTG is not set | ||
| 1360 | # CONFIG_USB_MON is not set | 1381 | # CONFIG_USB_MON is not set |
| 1361 | # CONFIG_USB_WUSB is not set | 1382 | # CONFIG_USB_WUSB is not set |
| 1362 | # CONFIG_USB_WUSB_CBAF is not set | 1383 | # CONFIG_USB_WUSB_CBAF is not set |
| @@ -1521,10 +1542,6 @@ CONFIG_RTC_DRV_STARFIRE=y | |||
| 1521 | # CONFIG_DMADEVICES is not set | 1542 | # CONFIG_DMADEVICES is not set |
| 1522 | # CONFIG_AUXDISPLAY is not set | 1543 | # CONFIG_AUXDISPLAY is not set |
| 1523 | # CONFIG_UIO is not set | 1544 | # CONFIG_UIO is not set |
| 1524 | |||
| 1525 | # | ||
| 1526 | # TI VLYNQ | ||
| 1527 | # | ||
| 1528 | # CONFIG_STAGING is not set | 1545 | # CONFIG_STAGING is not set |
| 1529 | 1546 | ||
| 1530 | # | 1547 | # |
| @@ -1706,8 +1723,8 @@ CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 | |||
| 1706 | CONFIG_SCHEDSTATS=y | 1723 | CONFIG_SCHEDSTATS=y |
| 1707 | # CONFIG_TIMER_STATS is not set | 1724 | # CONFIG_TIMER_STATS is not set |
| 1708 | # CONFIG_DEBUG_OBJECTS is not set | 1725 | # CONFIG_DEBUG_OBJECTS is not set |
| 1709 | # CONFIG_SLUB_DEBUG_ON is not set | 1726 | # CONFIG_DEBUG_SLAB is not set |
| 1710 | # CONFIG_SLUB_STATS is not set | 1727 | # CONFIG_DEBUG_KMEMLEAK is not set |
| 1711 | # CONFIG_DEBUG_RT_MUTEXES is not set | 1728 | # CONFIG_DEBUG_RT_MUTEXES is not set |
| 1712 | # CONFIG_RT_MUTEX_TESTER is not set | 1729 | # CONFIG_RT_MUTEX_TESTER is not set |
| 1713 | # CONFIG_DEBUG_SPINLOCK is not set | 1730 | # CONFIG_DEBUG_SPINLOCK is not set |
| @@ -1742,6 +1759,9 @@ CONFIG_SYSCTL_SYSCALL_CHECK=y | |||
| 1742 | # CONFIG_DEBUG_PAGEALLOC is not set | 1759 | # CONFIG_DEBUG_PAGEALLOC is not set |
| 1743 | CONFIG_NOP_TRACER=y | 1760 | CONFIG_NOP_TRACER=y |
| 1744 | CONFIG_HAVE_FUNCTION_TRACER=y | 1761 | CONFIG_HAVE_FUNCTION_TRACER=y |
| 1762 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
| 1763 | CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y | ||
| 1764 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
| 1745 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1765 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
| 1746 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | 1766 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
| 1747 | CONFIG_HAVE_SYSCALL_TRACEPOINTS=y | 1767 | CONFIG_HAVE_SYSCALL_TRACEPOINTS=y |
| @@ -1769,12 +1789,12 @@ CONFIG_BLK_DEV_IO_TRACE=y | |||
| 1769 | # CONFIG_RING_BUFFER_BENCHMARK is not set | 1789 | # CONFIG_RING_BUFFER_BENCHMARK is not set |
| 1770 | # CONFIG_DYNAMIC_DEBUG is not set | 1790 | # CONFIG_DYNAMIC_DEBUG is not set |
| 1771 | # CONFIG_DMA_API_DEBUG is not set | 1791 | # CONFIG_DMA_API_DEBUG is not set |
| 1792 | # CONFIG_ATOMIC64_SELFTEST is not set | ||
| 1772 | # CONFIG_SAMPLES is not set | 1793 | # CONFIG_SAMPLES is not set |
| 1773 | CONFIG_HAVE_ARCH_KGDB=y | 1794 | CONFIG_HAVE_ARCH_KGDB=y |
| 1774 | # CONFIG_KGDB is not set | 1795 | # CONFIG_KGDB is not set |
| 1775 | # CONFIG_DEBUG_STACK_USAGE is not set | 1796 | # CONFIG_DEBUG_STACK_USAGE is not set |
| 1776 | # CONFIG_DEBUG_DCFLUSH is not set | 1797 | # CONFIG_DEBUG_DCFLUSH is not set |
| 1777 | # CONFIG_STACK_DEBUG is not set | ||
| 1778 | # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set | 1798 | # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set |
| 1779 | 1799 | ||
| 1780 | # | 1800 | # |
| @@ -1895,6 +1915,7 @@ CONFIG_CRYPTO_DEFLATE=y | |||
| 1895 | # | 1915 | # |
| 1896 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 1916 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
| 1897 | CONFIG_CRYPTO_HW=y | 1917 | CONFIG_CRYPTO_HW=y |
| 1918 | # CONFIG_CRYPTO_DEV_NIAGARA2 is not set | ||
| 1898 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | 1919 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set |
| 1899 | CONFIG_BINARY_PRINTF=y | 1920 | CONFIG_BINARY_PRINTF=y |
| 1900 | 1921 | ||
diff --git a/arch/sparc/include/asm/cache.h b/arch/sparc/include/asm/cache.h index 0588b8c7faa2..69358b590c91 100644 --- a/arch/sparc/include/asm/cache.h +++ b/arch/sparc/include/asm/cache.h | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | 11 | ||
| 12 | #define L1_CACHE_SHIFT 5 | 12 | #define L1_CACHE_SHIFT 5 |
| 13 | #define L1_CACHE_BYTES 32 | 13 | #define L1_CACHE_BYTES 32 |
| 14 | #define L1_CACHE_ALIGN(x) ((((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))) | ||
| 15 | 14 | ||
| 16 | #ifdef CONFIG_SPARC32 | 15 | #ifdef CONFIG_SPARC32 |
| 17 | #define SMP_CACHE_BYTES_SHIFT 5 | 16 | #define SMP_CACHE_BYTES_SHIFT 5 |
diff --git a/arch/sparc/include/asm/pgtable_32.h b/arch/sparc/include/asm/pgtable_32.h index 77f906d8cc21..0ece77f47753 100644 --- a/arch/sparc/include/asm/pgtable_32.h +++ b/arch/sparc/include/asm/pgtable_32.h | |||
| @@ -142,13 +142,12 @@ BTFIXUPDEF_CALL_CONST(unsigned long, pgd_page_vaddr, pgd_t) | |||
| 142 | #define pmd_page(pmd) BTFIXUP_CALL(pmd_page)(pmd) | 142 | #define pmd_page(pmd) BTFIXUP_CALL(pmd_page)(pmd) |
| 143 | #define pgd_page_vaddr(pgd) BTFIXUP_CALL(pgd_page_vaddr)(pgd) | 143 | #define pgd_page_vaddr(pgd) BTFIXUP_CALL(pgd_page_vaddr)(pgd) |
| 144 | 144 | ||
| 145 | BTFIXUPDEF_SETHI(none_mask) | ||
| 146 | BTFIXUPDEF_CALL_CONST(int, pte_present, pte_t) | 145 | BTFIXUPDEF_CALL_CONST(int, pte_present, pte_t) |
| 147 | BTFIXUPDEF_CALL(void, pte_clear, pte_t *) | 146 | BTFIXUPDEF_CALL(void, pte_clear, pte_t *) |
| 148 | 147 | ||
| 149 | static inline int pte_none(pte_t pte) | 148 | static inline int pte_none(pte_t pte) |
| 150 | { | 149 | { |
| 151 | return !(pte_val(pte) & ~BTFIXUP_SETHI(none_mask)); | 150 | return !pte_val(pte); |
| 152 | } | 151 | } |
| 153 | 152 | ||
| 154 | #define pte_present(pte) BTFIXUP_CALL(pte_present)(pte) | 153 | #define pte_present(pte) BTFIXUP_CALL(pte_present)(pte) |
| @@ -160,7 +159,7 @@ BTFIXUPDEF_CALL(void, pmd_clear, pmd_t *) | |||
| 160 | 159 | ||
| 161 | static inline int pmd_none(pmd_t pmd) | 160 | static inline int pmd_none(pmd_t pmd) |
| 162 | { | 161 | { |
| 163 | return !(pmd_val(pmd) & ~BTFIXUP_SETHI(none_mask)); | 162 | return !pmd_val(pmd); |
| 164 | } | 163 | } |
| 165 | 164 | ||
| 166 | #define pmd_bad(pmd) BTFIXUP_CALL(pmd_bad)(pmd) | 165 | #define pmd_bad(pmd) BTFIXUP_CALL(pmd_bad)(pmd) |
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index 0ec92c8861dd..44faabc3c02c 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
| @@ -657,6 +657,7 @@ static u64 maybe_change_configuration(struct cpu_hw_events *cpuc, u64 pcr) | |||
| 657 | cpuc->current_idx[i] = idx; | 657 | cpuc->current_idx[i] = idx; |
| 658 | 658 | ||
| 659 | enc = perf_event_get_enc(cpuc->events[i]); | 659 | enc = perf_event_get_enc(cpuc->events[i]); |
| 660 | pcr &= ~mask_for_index(idx); | ||
| 660 | pcr |= event_encoding(enc, idx); | 661 | pcr |= event_encoding(enc, idx); |
| 661 | } | 662 | } |
| 662 | out: | 663 | out: |
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index ab036a72de5a..e11b4612dabb 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c | |||
| @@ -183,7 +183,7 @@ void sun4d_free_irq(unsigned int irq, void *dev_id) | |||
| 183 | goto out_unlock; | 183 | goto out_unlock; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | if (action && tmp) | 186 | if (tmp) |
| 187 | tmp->next = action->next; | 187 | tmp->next = action->next; |
| 188 | else | 188 | else |
| 189 | *actionp = action->next; | 189 | *actionp = action->next; |
diff --git a/arch/sparc/kernel/ttable.S b/arch/sparc/kernel/ttable.S index 76d837fc47d3..c6dfdaa29e20 100644 --- a/arch/sparc/kernel/ttable.S +++ b/arch/sparc/kernel/ttable.S | |||
| @@ -64,7 +64,7 @@ tl0_irq6: TRAP_IRQ(smp_call_function_single_client, 6) | |||
| 64 | tl0_irq6: BTRAP(0x46) | 64 | tl0_irq6: BTRAP(0x46) |
| 65 | #endif | 65 | #endif |
| 66 | tl0_irq7: TRAP_IRQ(deferred_pcr_work_irq, 7) | 66 | tl0_irq7: TRAP_IRQ(deferred_pcr_work_irq, 7) |
| 67 | #ifdef CONFIG_KGDB | 67 | #if defined(CONFIG_KGDB) && defined(CONFIG_SMP) |
| 68 | tl0_irq8: TRAP_IRQ(smp_kgdb_capture_client, 8) | 68 | tl0_irq8: TRAP_IRQ(smp_kgdb_capture_client, 8) |
| 69 | #else | 69 | #else |
| 70 | tl0_irq8: BTRAP(0x48) | 70 | tl0_irq8: BTRAP(0x48) |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index f5f75a58e0b3..b0b43aa5e45a 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
| @@ -2215,8 +2215,6 @@ void __init ld_mmu_srmmu(void) | |||
| 2215 | BTFIXUPSET_CALL(pmd_page, srmmu_pmd_page, BTFIXUPCALL_NORM); | 2215 | BTFIXUPSET_CALL(pmd_page, srmmu_pmd_page, BTFIXUPCALL_NORM); |
| 2216 | BTFIXUPSET_CALL(pgd_page_vaddr, srmmu_pgd_page, BTFIXUPCALL_NORM); | 2216 | BTFIXUPSET_CALL(pgd_page_vaddr, srmmu_pgd_page, BTFIXUPCALL_NORM); |
| 2217 | 2217 | ||
| 2218 | BTFIXUPSET_SETHI(none_mask, 0xF0000000); | ||
| 2219 | |||
| 2220 | BTFIXUPSET_CALL(pte_present, srmmu_pte_present, BTFIXUPCALL_NORM); | 2218 | BTFIXUPSET_CALL(pte_present, srmmu_pte_present, BTFIXUPCALL_NORM); |
| 2221 | BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_SWAPO0G0); | 2219 | BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_SWAPO0G0); |
| 2222 | 2220 | ||
diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c index cf38846753dd..4289f90f8697 100644 --- a/arch/sparc/mm/sun4c.c +++ b/arch/sparc/mm/sun4c.c | |||
| @@ -2087,9 +2087,6 @@ void __init ld_mmu_sun4c(void) | |||
| 2087 | 2087 | ||
| 2088 | BTFIXUPSET_CALL(set_pte, sun4c_set_pte, BTFIXUPCALL_STO1O0); | 2088 | BTFIXUPSET_CALL(set_pte, sun4c_set_pte, BTFIXUPCALL_STO1O0); |
| 2089 | 2089 | ||
| 2090 | /* The 2.4.18 code does not set this on sun4c, how does it work? XXX */ | ||
| 2091 | /* BTFIXUPSET_SETHI(none_mask, 0x00000000); */ /* Defaults to zero? */ | ||
| 2092 | |||
| 2093 | BTFIXUPSET_CALL(pte_pfn, sun4c_pte_pfn, BTFIXUPCALL_NORM); | 2090 | BTFIXUPSET_CALL(pte_pfn, sun4c_pte_pfn, BTFIXUPCALL_NORM); |
| 2094 | #if 0 /* PAGE_SHIFT <= 12 */ /* Eek. Investigate. XXX */ | 2091 | #if 0 /* PAGE_SHIFT <= 12 */ /* Eek. Investigate. XXX */ |
| 2095 | BTFIXUPSET_CALL(pmd_page, sun4c_pmd_page, BTFIXUPCALL_ANDNINT(PAGE_SIZE - 1)); | 2092 | BTFIXUPSET_CALL(pmd_page, sun4c_pmd_page, BTFIXUPCALL_ANDNINT(PAGE_SIZE - 1)); |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index de3b63ae3da2..a60df9ae6454 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
| @@ -238,6 +238,15 @@ void __init setup_per_cpu_areas(void) | |||
| 238 | #ifdef CONFIG_NUMA | 238 | #ifdef CONFIG_NUMA |
| 239 | per_cpu(x86_cpu_to_node_map, cpu) = | 239 | per_cpu(x86_cpu_to_node_map, cpu) = |
| 240 | early_per_cpu_map(x86_cpu_to_node_map, cpu); | 240 | early_per_cpu_map(x86_cpu_to_node_map, cpu); |
| 241 | /* | ||
| 242 | * Ensure that the boot cpu numa_node is correct when the boot | ||
| 243 | * cpu is on a node that doesn't have memory installed. | ||
| 244 | * Also cpu_up() will call cpu_to_node() for APs when | ||
| 245 | * MEMORY_HOTPLUG is defined, before per_cpu(numa_node) is set | ||
| 246 | * up later with c_init aka intel_init/amd_init. | ||
| 247 | * So set them all (boot cpu and all APs). | ||
| 248 | */ | ||
| 249 | set_cpu_numa_node(cpu, early_cpu_to_node(cpu)); | ||
| 241 | #endif | 250 | #endif |
| 242 | #endif | 251 | #endif |
| 243 | /* | 252 | /* |
| @@ -257,14 +266,6 @@ void __init setup_per_cpu_areas(void) | |||
| 257 | early_per_cpu_ptr(x86_cpu_to_node_map) = NULL; | 266 | early_per_cpu_ptr(x86_cpu_to_node_map) = NULL; |
| 258 | #endif | 267 | #endif |
| 259 | 268 | ||
| 260 | #if defined(CONFIG_X86_64) && defined(CONFIG_NUMA) | ||
| 261 | /* | ||
| 262 | * make sure boot cpu numa_node is right, when boot cpu is on the | ||
| 263 | * node that doesn't have mem installed | ||
| 264 | */ | ||
| 265 | set_cpu_numa_node(boot_cpu_id, early_cpu_to_node(boot_cpu_id)); | ||
| 266 | #endif | ||
| 267 | |||
| 268 | /* Setup node to cpumask map */ | 269 | /* Setup node to cpumask map */ |
| 269 | setup_node_to_cpumask_map(); | 270 | setup_node_to_cpumask_map(); |
| 270 | 271 | ||
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 3699613e8830..b1ed0a1a5913 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2926,7 +2926,7 @@ static int kvm_mmu_remove_some_alloc_mmu_pages(struct kvm *kvm) | |||
| 2926 | return kvm_mmu_zap_page(kvm, page) + 1; | 2926 | return kvm_mmu_zap_page(kvm, page) + 1; |
| 2927 | } | 2927 | } |
| 2928 | 2928 | ||
| 2929 | static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask) | 2929 | static int mmu_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) |
| 2930 | { | 2930 | { |
| 2931 | struct kvm *kvm; | 2931 | struct kvm *kvm; |
| 2932 | struct kvm *kvm_freed = NULL; | 2932 | struct kvm *kvm_freed = NULL; |
diff --git a/drivers/clocksource/cs5535-clockevt.c b/drivers/clocksource/cs5535-clockevt.c index d7be69f13154..b7dab32ce63c 100644 --- a/drivers/clocksource/cs5535-clockevt.c +++ b/drivers/clocksource/cs5535-clockevt.c | |||
| @@ -194,6 +194,6 @@ err_timer: | |||
| 194 | 194 | ||
| 195 | module_init(cs5535_mfgpt_init); | 195 | module_init(cs5535_mfgpt_init); |
| 196 | 196 | ||
| 197 | MODULE_AUTHOR("Andres Salomon <dilinger@collabora.co.uk>"); | 197 | MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); |
| 198 | MODULE_DESCRIPTION("CS5535/CS5536 MFGPT clock event driver"); | 198 | MODULE_DESCRIPTION("CS5535/CS5536 MFGPT clock event driver"); |
| 199 | MODULE_LICENSE("GPL"); | 199 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index aedef7941b22..0d2f9dbb47e4 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
| @@ -209,7 +209,7 @@ config EDAC_I5100 | |||
| 209 | 209 | ||
| 210 | config EDAC_MPC85XX | 210 | config EDAC_MPC85XX |
| 211 | tristate "Freescale MPC83xx / MPC85xx" | 211 | tristate "Freescale MPC83xx / MPC85xx" |
| 212 | depends on EDAC_MM_EDAC && FSL_SOC && (PPC_83xx || MPC85xx) | 212 | depends on EDAC_MM_EDAC && FSL_SOC && (PPC_83xx || PPC_85xx) |
| 213 | help | 213 | help |
| 214 | Support for error detection and correction on the Freescale | 214 | Support for error detection and correction on the Freescale |
| 215 | MPC8349, MPC8560, MPC8540, MPC8548 | 215 | MPC8349, MPC8560, MPC8540, MPC8548 |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 52ca09bf4726..f39b00a46eda 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
| @@ -1120,6 +1120,7 @@ static struct of_device_id mpc85xx_mc_err_of_match[] = { | |||
| 1120 | { .compatible = "fsl,mpc8555-memory-controller", }, | 1120 | { .compatible = "fsl,mpc8555-memory-controller", }, |
| 1121 | { .compatible = "fsl,mpc8560-memory-controller", }, | 1121 | { .compatible = "fsl,mpc8560-memory-controller", }, |
| 1122 | { .compatible = "fsl,mpc8568-memory-controller", }, | 1122 | { .compatible = "fsl,mpc8568-memory-controller", }, |
| 1123 | { .compatible = "fsl,mpc8569-memory-controller", }, | ||
| 1123 | { .compatible = "fsl,mpc8572-memory-controller", }, | 1124 | { .compatible = "fsl,mpc8572-memory-controller", }, |
| 1124 | { .compatible = "fsl,mpc8349-memory-controller", }, | 1125 | { .compatible = "fsl,mpc8349-memory-controller", }, |
| 1125 | { .compatible = "fsl,p2020-memory-controller", }, | 1126 | { .compatible = "fsl,p2020-memory-controller", }, |
diff --git a/drivers/gpio/cs5535-gpio.c b/drivers/gpio/cs5535-gpio.c index f73a1555e49d..e23c06893d19 100644 --- a/drivers/gpio/cs5535-gpio.c +++ b/drivers/gpio/cs5535-gpio.c | |||
| @@ -352,6 +352,6 @@ static void __exit cs5535_gpio_exit(void) | |||
| 352 | module_init(cs5535_gpio_init); | 352 | module_init(cs5535_gpio_init); |
| 353 | module_exit(cs5535_gpio_exit); | 353 | module_exit(cs5535_gpio_exit); |
| 354 | 354 | ||
| 355 | MODULE_AUTHOR("Andres Salomon <dilinger@collabora.co.uk>"); | 355 | MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); |
| 356 | MODULE_DESCRIPTION("AMD CS5535/CS5536 GPIO driver"); | 356 | MODULE_DESCRIPTION("AMD CS5535/CS5536 GPIO driver"); |
| 357 | MODULE_LICENSE("GPL"); | 357 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 8757ecf6e96b..51bd301cf10d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -4742,6 +4742,16 @@ i915_gem_load(struct drm_device *dev) | |||
| 4742 | list_add(&dev_priv->mm.shrink_list, &shrink_list); | 4742 | list_add(&dev_priv->mm.shrink_list, &shrink_list); |
| 4743 | spin_unlock(&shrink_list_lock); | 4743 | spin_unlock(&shrink_list_lock); |
| 4744 | 4744 | ||
| 4745 | /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ | ||
| 4746 | if (IS_GEN3(dev)) { | ||
| 4747 | u32 tmp = I915_READ(MI_ARB_STATE); | ||
| 4748 | if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) { | ||
| 4749 | /* arb state is a masked write, so set bit + bit in mask */ | ||
| 4750 | tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT); | ||
| 4751 | I915_WRITE(MI_ARB_STATE, tmp); | ||
| 4752 | } | ||
| 4753 | } | ||
| 4754 | |||
| 4745 | /* Old X drivers will take 0-2 for front, back, depth buffers */ | 4755 | /* Old X drivers will take 0-2 for front, back, depth buffers */ |
| 4746 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 4756 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 4747 | dev_priv->fence_reg_start = 3; | 4757 | dev_priv->fence_reg_start = 3; |
| @@ -4978,7 +4988,7 @@ i915_gpu_is_active(struct drm_device *dev) | |||
| 4978 | } | 4988 | } |
| 4979 | 4989 | ||
| 4980 | static int | 4990 | static int |
| 4981 | i915_gem_shrink(int nr_to_scan, gfp_t gfp_mask) | 4991 | i915_gem_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) |
| 4982 | { | 4992 | { |
| 4983 | drm_i915_private_t *dev_priv, *next_dev; | 4993 | drm_i915_private_t *dev_priv, *next_dev; |
| 4984 | struct drm_i915_gem_object *obj_priv, *next_obj; | 4994 | struct drm_i915_gem_object *obj_priv, *next_obj; |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 150400f40534..6d9b0288272a 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -359,6 +359,70 @@ | |||
| 359 | #define LM_BURST_LENGTH 0x00000700 | 359 | #define LM_BURST_LENGTH 0x00000700 |
| 360 | #define LM_FIFO_WATERMARK 0x0000001F | 360 | #define LM_FIFO_WATERMARK 0x0000001F |
| 361 | #define MI_ARB_STATE 0x020e4 /* 915+ only */ | 361 | #define MI_ARB_STATE 0x020e4 /* 915+ only */ |
| 362 | #define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */ | ||
| 363 | |||
| 364 | /* Make render/texture TLB fetches lower priorty than associated data | ||
| 365 | * fetches. This is not turned on by default | ||
| 366 | */ | ||
| 367 | #define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15) | ||
| 368 | |||
| 369 | /* Isoch request wait on GTT enable (Display A/B/C streams). | ||
| 370 | * Make isoch requests stall on the TLB update. May cause | ||
| 371 | * display underruns (test mode only) | ||
| 372 | */ | ||
| 373 | #define MI_ARB_ISOCH_WAIT_GTT (1 << 14) | ||
| 374 | |||
| 375 | /* Block grant count for isoch requests when block count is | ||
| 376 | * set to a finite value. | ||
| 377 | */ | ||
| 378 | #define MI_ARB_BLOCK_GRANT_MASK (3 << 12) | ||
| 379 | #define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */ | ||
| 380 | #define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */ | ||
| 381 | #define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */ | ||
| 382 | #define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */ | ||
| 383 | |||
| 384 | /* Enable render writes to complete in C2/C3/C4 power states. | ||
| 385 | * If this isn't enabled, render writes are prevented in low | ||
| 386 | * power states. That seems bad to me. | ||
| 387 | */ | ||
| 388 | #define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11) | ||
| 389 | |||
| 390 | /* This acknowledges an async flip immediately instead | ||
| 391 | * of waiting for 2TLB fetches. | ||
| 392 | */ | ||
| 393 | #define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10) | ||
| 394 | |||
| 395 | /* Enables non-sequential data reads through arbiter | ||
| 396 | */ | ||
| 397 | #define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9) | ||
| 398 | |||
| 399 | /* Disable FSB snooping of cacheable write cycles from binner/render | ||
| 400 | * command stream | ||
| 401 | */ | ||
| 402 | #define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8) | ||
| 403 | |||
| 404 | /* Arbiter time slice for non-isoch streams */ | ||
| 405 | #define MI_ARB_TIME_SLICE_MASK (7 << 5) | ||
| 406 | #define MI_ARB_TIME_SLICE_1 (0 << 5) | ||
| 407 | #define MI_ARB_TIME_SLICE_2 (1 << 5) | ||
| 408 | #define MI_ARB_TIME_SLICE_4 (2 << 5) | ||
| 409 | #define MI_ARB_TIME_SLICE_6 (3 << 5) | ||
| 410 | #define MI_ARB_TIME_SLICE_8 (4 << 5) | ||
| 411 | #define MI_ARB_TIME_SLICE_10 (5 << 5) | ||
| 412 | #define MI_ARB_TIME_SLICE_14 (6 << 5) | ||
| 413 | #define MI_ARB_TIME_SLICE_16 (7 << 5) | ||
| 414 | |||
| 415 | /* Low priority grace period page size */ | ||
| 416 | #define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */ | ||
| 417 | #define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4) | ||
| 418 | |||
| 419 | /* Disable display A/B trickle feed */ | ||
| 420 | #define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2) | ||
| 421 | |||
| 422 | /* Set display plane priority */ | ||
| 423 | #define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */ | ||
| 424 | #define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */ | ||
| 425 | |||
| 362 | #define CACHE_MODE_0 0x02120 /* 915+ only */ | 426 | #define CACHE_MODE_0 0x02120 /* 915+ only */ |
| 363 | #define CM0_MASK_SHIFT 16 | 427 | #define CM0_MASK_SHIFT 16 |
| 364 | #define CM0_IZ_OPT_DISABLE (1<<6) | 428 | #define CM0_IZ_OPT_DISABLE (1<<6) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index fc924b649195..e492919faf44 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
| @@ -203,36 +203,26 @@ struct methods { | |||
| 203 | const bool rw; | 203 | const bool rw; |
| 204 | }; | 204 | }; |
| 205 | 205 | ||
| 206 | static struct methods nv04_methods[] = { | 206 | static struct methods shadow_methods[] = { |
| 207 | { "PROM", load_vbios_prom, false }, | ||
| 208 | { "PRAMIN", load_vbios_pramin, true }, | ||
| 209 | { "PCIROM", load_vbios_pci, true }, | ||
| 210 | }; | ||
| 211 | |||
| 212 | static struct methods nv50_methods[] = { | ||
| 213 | { "ACPI", load_vbios_acpi, true }, | ||
| 214 | { "PRAMIN", load_vbios_pramin, true }, | 207 | { "PRAMIN", load_vbios_pramin, true }, |
| 215 | { "PROM", load_vbios_prom, false }, | 208 | { "PROM", load_vbios_prom, false }, |
| 216 | { "PCIROM", load_vbios_pci, true }, | 209 | { "PCIROM", load_vbios_pci, true }, |
| 210 | { "ACPI", load_vbios_acpi, true }, | ||
| 217 | }; | 211 | }; |
| 218 | 212 | ||
| 219 | #define METHODCNT 3 | ||
| 220 | |||
| 221 | static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) | 213 | static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) |
| 222 | { | 214 | { |
| 223 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 215 | const int nr_methods = ARRAY_SIZE(shadow_methods); |
| 224 | struct methods *methods; | 216 | struct methods *methods = shadow_methods; |
| 225 | int i; | ||
| 226 | int testscore = 3; | 217 | int testscore = 3; |
| 227 | int scores[METHODCNT]; | 218 | int scores[nr_methods], i; |
| 228 | 219 | ||
| 229 | if (nouveau_vbios) { | 220 | if (nouveau_vbios) { |
| 230 | methods = nv04_methods; | 221 | for (i = 0; i < nr_methods; i++) |
| 231 | for (i = 0; i < METHODCNT; i++) | ||
| 232 | if (!strcasecmp(nouveau_vbios, methods[i].desc)) | 222 | if (!strcasecmp(nouveau_vbios, methods[i].desc)) |
| 233 | break; | 223 | break; |
| 234 | 224 | ||
| 235 | if (i < METHODCNT) { | 225 | if (i < nr_methods) { |
| 236 | NV_INFO(dev, "Attempting to use BIOS image from %s\n", | 226 | NV_INFO(dev, "Attempting to use BIOS image from %s\n", |
| 237 | methods[i].desc); | 227 | methods[i].desc); |
| 238 | 228 | ||
| @@ -244,12 +234,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) | |||
| 244 | NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios); | 234 | NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios); |
| 245 | } | 235 | } |
| 246 | 236 | ||
| 247 | if (dev_priv->card_type < NV_50) | 237 | for (i = 0; i < nr_methods; i++) { |
| 248 | methods = nv04_methods; | ||
| 249 | else | ||
| 250 | methods = nv50_methods; | ||
| 251 | |||
| 252 | for (i = 0; i < METHODCNT; i++) { | ||
| 253 | NV_TRACE(dev, "Attempting to load BIOS image from %s\n", | 238 | NV_TRACE(dev, "Attempting to load BIOS image from %s\n", |
| 254 | methods[i].desc); | 239 | methods[i].desc); |
| 255 | data[0] = data[1] = 0; /* avoid reuse of previous image */ | 240 | data[0] = data[1] = 0; /* avoid reuse of previous image */ |
| @@ -260,7 +245,7 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) | |||
| 260 | } | 245 | } |
| 261 | 246 | ||
| 262 | while (--testscore > 0) { | 247 | while (--testscore > 0) { |
| 263 | for (i = 0; i < METHODCNT; i++) { | 248 | for (i = 0; i < nr_methods; i++) { |
| 264 | if (scores[i] == testscore) { | 249 | if (scores[i] == testscore) { |
| 265 | NV_TRACE(dev, "Using BIOS image from %s\n", | 250 | NV_TRACE(dev, "Using BIOS image from %s\n", |
| 266 | methods[i].desc); | 251 | methods[i].desc); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index c9a4a0d2a115..257ea130ae13 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
| @@ -387,7 +387,8 @@ int nouveau_fbcon_init(struct drm_device *dev) | |||
| 387 | dev_priv->nfbdev = nfbdev; | 387 | dev_priv->nfbdev = nfbdev; |
| 388 | nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs; | 388 | nfbdev->helper.funcs = &nouveau_fbcon_helper_funcs; |
| 389 | 389 | ||
| 390 | ret = drm_fb_helper_init(dev, &nfbdev->helper, 2, 4); | 390 | ret = drm_fb_helper_init(dev, &nfbdev->helper, |
| 391 | nv_two_heads(dev) ? 2 : 1, 4); | ||
| 391 | if (ret) { | 392 | if (ret) { |
| 392 | kfree(nfbdev); | 393 | kfree(nfbdev); |
| 393 | return ret; | 394 | return ret; |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 3970e62eaab8..aab5ba040bd6 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -2354,6 +2354,7 @@ void r100_mc_init(struct radeon_device *rdev) | |||
| 2354 | if (rdev->flags & RADEON_IS_IGP) | 2354 | if (rdev->flags & RADEON_IS_IGP) |
| 2355 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; | 2355 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; |
| 2356 | radeon_vram_location(rdev, &rdev->mc, base); | 2356 | radeon_vram_location(rdev, &rdev->mc, base); |
| 2357 | rdev->mc.gtt_base_align = 0; | ||
| 2357 | if (!(rdev->flags & RADEON_IS_AGP)) | 2358 | if (!(rdev->flags & RADEON_IS_AGP)) |
| 2358 | radeon_gtt_location(rdev, &rdev->mc); | 2359 | radeon_gtt_location(rdev, &rdev->mc); |
| 2359 | radeon_update_bandwidth_info(rdev); | 2360 | radeon_update_bandwidth_info(rdev); |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 7e81db5eb804..19a7ef7ee344 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -481,6 +481,7 @@ void r300_mc_init(struct radeon_device *rdev) | |||
| 481 | if (rdev->flags & RADEON_IS_IGP) | 481 | if (rdev->flags & RADEON_IS_IGP) |
| 482 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; | 482 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; |
| 483 | radeon_vram_location(rdev, &rdev->mc, base); | 483 | radeon_vram_location(rdev, &rdev->mc, base); |
| 484 | rdev->mc.gtt_base_align = 0; | ||
| 484 | if (!(rdev->flags & RADEON_IS_AGP)) | 485 | if (!(rdev->flags & RADEON_IS_AGP)) |
| 485 | radeon_gtt_location(rdev, &rdev->mc); | 486 | radeon_gtt_location(rdev, &rdev->mc); |
| 486 | radeon_update_bandwidth_info(rdev); | 487 | radeon_update_bandwidth_info(rdev); |
| @@ -1176,6 +1177,8 @@ int r300_cs_parse(struct radeon_cs_parser *p) | |||
| 1176 | int r; | 1177 | int r; |
| 1177 | 1178 | ||
| 1178 | track = kzalloc(sizeof(*track), GFP_KERNEL); | 1179 | track = kzalloc(sizeof(*track), GFP_KERNEL); |
| 1180 | if (track == NULL) | ||
| 1181 | return -ENOMEM; | ||
| 1179 | r100_cs_track_clear(p->rdev, track); | 1182 | r100_cs_track_clear(p->rdev, track); |
| 1180 | p->track = track; | 1183 | p->track = track; |
| 1181 | do { | 1184 | do { |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 34330df28483..694af7cc23ac 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -125,6 +125,7 @@ void r520_mc_init(struct radeon_device *rdev) | |||
| 125 | r520_vram_get_type(rdev); | 125 | r520_vram_get_type(rdev); |
| 126 | r100_vram_init_sizes(rdev); | 126 | r100_vram_init_sizes(rdev); |
| 127 | radeon_vram_location(rdev, &rdev->mc, 0); | 127 | radeon_vram_location(rdev, &rdev->mc, 0); |
| 128 | rdev->mc.gtt_base_align = 0; | ||
| 128 | if (!(rdev->flags & RADEON_IS_AGP)) | 129 | if (!(rdev->flags & RADEON_IS_AGP)) |
| 129 | radeon_gtt_location(rdev, &rdev->mc); | 130 | radeon_gtt_location(rdev, &rdev->mc); |
| 130 | radeon_update_bandwidth_info(rdev); | 131 | radeon_update_bandwidth_info(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 3d6645ce2151..e100f69faeec 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1179,6 +1179,7 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) | |||
| 1179 | if (rdev->flags & RADEON_IS_IGP) | 1179 | if (rdev->flags & RADEON_IS_IGP) |
| 1180 | base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; | 1180 | base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; |
| 1181 | radeon_vram_location(rdev, &rdev->mc, base); | 1181 | radeon_vram_location(rdev, &rdev->mc, base); |
| 1182 | rdev->mc.gtt_base_align = 0; | ||
| 1182 | radeon_gtt_location(rdev, mc); | 1183 | radeon_gtt_location(rdev, mc); |
| 1183 | } | 1184 | } |
| 1184 | } | 1185 | } |
diff --git a/drivers/gpu/drm/radeon/r600_blit.c b/drivers/gpu/drm/radeon/r600_blit.c index f4fb88ece2bb..ca5c29f70779 100644 --- a/drivers/gpu/drm/radeon/r600_blit.c +++ b/drivers/gpu/drm/radeon/r600_blit.c | |||
| @@ -538,9 +538,12 @@ int | |||
| 538 | r600_prepare_blit_copy(struct drm_device *dev, struct drm_file *file_priv) | 538 | r600_prepare_blit_copy(struct drm_device *dev, struct drm_file *file_priv) |
| 539 | { | 539 | { |
| 540 | drm_radeon_private_t *dev_priv = dev->dev_private; | 540 | drm_radeon_private_t *dev_priv = dev->dev_private; |
| 541 | int ret; | ||
| 541 | DRM_DEBUG("\n"); | 542 | DRM_DEBUG("\n"); |
| 542 | 543 | ||
| 543 | r600_nomm_get_vb(dev); | 544 | ret = r600_nomm_get_vb(dev); |
| 545 | if (ret) | ||
| 546 | return ret; | ||
| 544 | 547 | ||
| 545 | dev_priv->blit_vb->file_priv = file_priv; | 548 | dev_priv->blit_vb->file_priv = file_priv; |
| 546 | 549 | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index ab61aaa887bb..2f94dc66c183 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -351,6 +351,7 @@ struct radeon_mc { | |||
| 351 | int vram_mtrr; | 351 | int vram_mtrr; |
| 352 | bool vram_is_ddr; | 352 | bool vram_is_ddr; |
| 353 | bool igp_sideport_enabled; | 353 | bool igp_sideport_enabled; |
| 354 | u64 gtt_base_align; | ||
| 354 | }; | 355 | }; |
| 355 | 356 | ||
| 356 | bool radeon_combios_sideport_present(struct radeon_device *rdev); | 357 | bool radeon_combios_sideport_present(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 99bd8a9c56b3..10673ae59cfa 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -280,6 +280,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | |||
| 280 | } | 280 | } |
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | /* ASUS HD 3600 board lists the DVI port as HDMI */ | ||
| 284 | if ((dev->pdev->device == 0x9598) && | ||
| 285 | (dev->pdev->subsystem_vendor == 0x1043) && | ||
| 286 | (dev->pdev->subsystem_device == 0x01e4)) { | ||
| 287 | if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { | ||
| 288 | *connector_type = DRM_MODE_CONNECTOR_DVII; | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 283 | /* ASUS HD 3450 board lists the DVI port as HDMI */ | 292 | /* ASUS HD 3450 board lists the DVI port as HDMI */ |
| 284 | if ((dev->pdev->device == 0x95C5) && | 293 | if ((dev->pdev->device == 0x95C5) && |
| 285 | (dev->pdev->subsystem_vendor == 0x1043) && | 294 | (dev->pdev->subsystem_vendor == 0x1043) && |
| @@ -1029,8 +1038,15 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev) | |||
| 1029 | data_offset); | 1038 | data_offset); |
| 1030 | switch (crev) { | 1039 | switch (crev) { |
| 1031 | case 1: | 1040 | case 1: |
| 1032 | if (igp_info->info.ucMemoryType & 0xf0) | 1041 | /* AMD IGPS */ |
| 1033 | return true; | 1042 | if ((rdev->family == CHIP_RS690) || |
| 1043 | (rdev->family == CHIP_RS740)) { | ||
| 1044 | if (igp_info->info.ulBootUpMemoryClock) | ||
| 1045 | return true; | ||
| 1046 | } else { | ||
| 1047 | if (igp_info->info.ucMemoryType & 0xf0) | ||
| 1048 | return true; | ||
| 1049 | } | ||
| 1034 | break; | 1050 | break; |
| 1035 | case 2: | 1051 | case 2: |
| 1036 | if (igp_info->info_2.ucMemoryType & 0x0f) | 1052 | if (igp_info->info_2.ucMemoryType & 0x0f) |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index f58f8bd8f77b..adccbc2c202c 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -771,14 +771,14 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect | |||
| 771 | } else | 771 | } else |
| 772 | ret = connector_status_connected; | 772 | ret = connector_status_connected; |
| 773 | 773 | ||
| 774 | /* multiple connectors on the same encoder with the same ddc line | 774 | /* This gets complicated. We have boards with VGA + HDMI with a |
| 775 | * This tends to be HDMI and DVI on the same encoder with the | 775 | * shared DDC line and we have boards with DVI-D + HDMI with a shared |
| 776 | * same ddc line. If the edid says HDMI, consider the HDMI port | 776 | * DDC line. The latter is more complex because with DVI<->HDMI adapters |
| 777 | * connected and the DVI port disconnected. If the edid doesn't | 777 | * you don't really know what's connected to which port as both are digital. |
| 778 | * say HDMI, vice versa. | ||
| 779 | */ | 778 | */ |
| 780 | if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { | 779 | if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { |
| 781 | struct drm_device *dev = connector->dev; | 780 | struct drm_device *dev = connector->dev; |
| 781 | struct radeon_device *rdev = dev->dev_private; | ||
| 782 | struct drm_connector *list_connector; | 782 | struct drm_connector *list_connector; |
| 783 | struct radeon_connector *list_radeon_connector; | 783 | struct radeon_connector *list_radeon_connector; |
| 784 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { | 784 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { |
| @@ -788,15 +788,10 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect | |||
| 788 | if (list_radeon_connector->shared_ddc && | 788 | if (list_radeon_connector->shared_ddc && |
| 789 | (list_radeon_connector->ddc_bus->rec.i2c_id == | 789 | (list_radeon_connector->ddc_bus->rec.i2c_id == |
| 790 | radeon_connector->ddc_bus->rec.i2c_id)) { | 790 | radeon_connector->ddc_bus->rec.i2c_id)) { |
| 791 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) { | 791 | /* cases where both connectors are digital */ |
| 792 | if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { | 792 | if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { |
| 793 | kfree(radeon_connector->edid); | 793 | /* hpd is our only option in this case */ |
| 794 | radeon_connector->edid = NULL; | 794 | if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
| 795 | ret = connector_status_disconnected; | ||
| 796 | } | ||
| 797 | } else { | ||
| 798 | if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) || | ||
| 799 | (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) { | ||
| 800 | kfree(radeon_connector->edid); | 795 | kfree(radeon_connector->edid); |
| 801 | radeon_connector->edid = NULL; | 796 | radeon_connector->edid = NULL; |
| 802 | ret = connector_status_disconnected; | 797 | ret = connector_status_disconnected; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 5f317317aba2..dd279da90546 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -226,20 +226,20 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) | |||
| 226 | { | 226 | { |
| 227 | u64 size_af, size_bf; | 227 | u64 size_af, size_bf; |
| 228 | 228 | ||
| 229 | size_af = 0xFFFFFFFF - mc->vram_end; | 229 | size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align; |
| 230 | size_bf = mc->vram_start; | 230 | size_bf = mc->vram_start & ~mc->gtt_base_align; |
| 231 | if (size_bf > size_af) { | 231 | if (size_bf > size_af) { |
| 232 | if (mc->gtt_size > size_bf) { | 232 | if (mc->gtt_size > size_bf) { |
| 233 | dev_warn(rdev->dev, "limiting GTT\n"); | 233 | dev_warn(rdev->dev, "limiting GTT\n"); |
| 234 | mc->gtt_size = size_bf; | 234 | mc->gtt_size = size_bf; |
| 235 | } | 235 | } |
| 236 | mc->gtt_start = mc->vram_start - mc->gtt_size; | 236 | mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size; |
| 237 | } else { | 237 | } else { |
| 238 | if (mc->gtt_size > size_af) { | 238 | if (mc->gtt_size > size_af) { |
| 239 | dev_warn(rdev->dev, "limiting GTT\n"); | 239 | dev_warn(rdev->dev, "limiting GTT\n"); |
| 240 | mc->gtt_size = size_af; | 240 | mc->gtt_size = size_af; |
| 241 | } | 241 | } |
| 242 | mc->gtt_start = mc->vram_end + 1; | 242 | mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align; |
| 243 | } | 243 | } |
| 244 | mc->gtt_end = mc->gtt_start + mc->gtt_size - 1; | 244 | mc->gtt_end = mc->gtt_start + mc->gtt_size - 1; |
| 245 | dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n", | 245 | dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_tv.c b/drivers/gpu/drm/radeon/radeon_legacy_tv.c index f2ed27c8055b..032040397743 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_tv.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_tv.c | |||
| @@ -642,8 +642,8 @@ void radeon_legacy_tv_mode_set(struct drm_encoder *encoder, | |||
| 642 | } | 642 | } |
| 643 | flicker_removal = (tmp + 500) / 1000; | 643 | flicker_removal = (tmp + 500) / 1000; |
| 644 | 644 | ||
| 645 | if (flicker_removal < 2) | 645 | if (flicker_removal < 3) |
| 646 | flicker_removal = 2; | 646 | flicker_removal = 3; |
| 647 | for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { | 647 | for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { |
| 648 | if (flicker_removal == SLOPE_limit[i]) | 648 | if (flicker_removal == SLOPE_limit[i]) |
| 649 | break; | 649 | break; |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 9e4240b3bf0b..f454c9a5e7f2 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -57,7 +57,9 @@ void rs400_gart_adjust_size(struct radeon_device *rdev) | |||
| 57 | } | 57 | } |
| 58 | if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) { | 58 | if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) { |
| 59 | /* FIXME: RS400 & RS480 seems to have issue with GART size | 59 | /* FIXME: RS400 & RS480 seems to have issue with GART size |
| 60 | * if 4G of system memory (needs more testing) */ | 60 | * if 4G of system memory (needs more testing) |
| 61 | */ | ||
| 62 | /* XXX is this still an issue with proper alignment? */ | ||
| 61 | rdev->mc.gtt_size = 32 * 1024 * 1024; | 63 | rdev->mc.gtt_size = 32 * 1024 * 1024; |
| 62 | DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n"); | 64 | DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n"); |
| 63 | } | 65 | } |
| @@ -263,6 +265,7 @@ void rs400_mc_init(struct radeon_device *rdev) | |||
| 263 | r100_vram_init_sizes(rdev); | 265 | r100_vram_init_sizes(rdev); |
| 264 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; | 266 | base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; |
| 265 | radeon_vram_location(rdev, &rdev->mc, base); | 267 | radeon_vram_location(rdev, &rdev->mc, base); |
| 268 | rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1; | ||
| 266 | radeon_gtt_location(rdev, &rdev->mc); | 269 | radeon_gtt_location(rdev, &rdev->mc); |
| 267 | radeon_update_bandwidth_info(rdev); | 270 | radeon_update_bandwidth_info(rdev); |
| 268 | } | 271 | } |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 7bb4c3e52f3b..6dc15ea8ba33 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -698,6 +698,7 @@ void rs600_mc_init(struct radeon_device *rdev) | |||
| 698 | base = G_000004_MC_FB_START(base) << 16; | 698 | base = G_000004_MC_FB_START(base) << 16; |
| 699 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 699 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 700 | radeon_vram_location(rdev, &rdev->mc, base); | 700 | radeon_vram_location(rdev, &rdev->mc, base); |
| 701 | rdev->mc.gtt_base_align = 0; | ||
| 701 | radeon_gtt_location(rdev, &rdev->mc); | 702 | radeon_gtt_location(rdev, &rdev->mc); |
| 702 | radeon_update_bandwidth_info(rdev); | 703 | radeon_update_bandwidth_info(rdev); |
| 703 | } | 704 | } |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index f4f0a61bcdce..ce4ecbe10816 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -162,6 +162,7 @@ void rs690_mc_init(struct radeon_device *rdev) | |||
| 162 | rs690_pm_info(rdev); | 162 | rs690_pm_info(rdev); |
| 163 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 163 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 164 | radeon_vram_location(rdev, &rdev->mc, base); | 164 | radeon_vram_location(rdev, &rdev->mc, base); |
| 165 | rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1; | ||
| 165 | radeon_gtt_location(rdev, &rdev->mc); | 166 | radeon_gtt_location(rdev, &rdev->mc); |
| 166 | radeon_update_bandwidth_info(rdev); | 167 | radeon_update_bandwidth_info(rdev); |
| 167 | } | 168 | } |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 7d9a7b0a180a..0c9c169a6852 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -195,6 +195,7 @@ void rv515_mc_init(struct radeon_device *rdev) | |||
| 195 | rv515_vram_get_type(rdev); | 195 | rv515_vram_get_type(rdev); |
| 196 | r100_vram_init_sizes(rdev); | 196 | r100_vram_init_sizes(rdev); |
| 197 | radeon_vram_location(rdev, &rdev->mc, 0); | 197 | radeon_vram_location(rdev, &rdev->mc, 0); |
| 198 | rdev->mc.gtt_base_align = 0; | ||
| 198 | if (!(rdev->flags & RADEON_IS_AGP)) | 199 | if (!(rdev->flags & RADEON_IS_AGP)) |
| 199 | radeon_gtt_location(rdev, &rdev->mc); | 200 | radeon_gtt_location(rdev, &rdev->mc); |
| 200 | radeon_update_bandwidth_info(rdev); | 201 | radeon_update_bandwidth_info(rdev); |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index b1d67dc973dc..d233c65f3f7f 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
| @@ -40,7 +40,9 @@ | |||
| 40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
| 41 | 41 | ||
| 42 | #include <asm/atomic.h> | 42 | #include <asm/atomic.h> |
| 43 | #ifdef TTM_HAS_AGP | ||
| 43 | #include <asm/agp.h> | 44 | #include <asm/agp.h> |
| 45 | #endif | ||
| 44 | 46 | ||
| 45 | #include "ttm/ttm_bo_driver.h" | 47 | #include "ttm/ttm_bo_driver.h" |
| 46 | #include "ttm/ttm_page_alloc.h" | 48 | #include "ttm/ttm_page_alloc.h" |
| @@ -392,7 +394,7 @@ static int ttm_pool_get_num_unused_pages(void) | |||
| 392 | /** | 394 | /** |
| 393 | * Callback for mm to request pool to reduce number of page held. | 395 | * Callback for mm to request pool to reduce number of page held. |
| 394 | */ | 396 | */ |
| 395 | static int ttm_pool_mm_shrink(int shrink_pages, gfp_t gfp_mask) | 397 | static int ttm_pool_mm_shrink(struct shrinker *shrink, int shrink_pages, gfp_t gfp_mask) |
| 396 | { | 398 | { |
| 397 | static atomic_t start_pool = ATOMIC_INIT(0); | 399 | static atomic_t start_pool = ATOMIC_INIT(0); |
| 398 | unsigned i; | 400 | unsigned i; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index f1d626112415..437ac786277a 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
| @@ -972,6 +972,7 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | |||
| 972 | ret = copy_from_user(rects, user_rects, rects_size); | 972 | ret = copy_from_user(rects, user_rects, rects_size); |
| 973 | if (unlikely(ret != 0)) { | 973 | if (unlikely(ret != 0)) { |
| 974 | DRM_ERROR("Failed to get rects.\n"); | 974 | DRM_ERROR("Failed to get rects.\n"); |
| 975 | ret = -EFAULT; | ||
| 975 | goto out_free; | 976 | goto out_free; |
| 976 | } | 977 | } |
| 977 | 978 | ||
diff --git a/drivers/misc/cs5535-mfgpt.c b/drivers/misc/cs5535-mfgpt.c index 9bec24db4d41..2d44b3300104 100644 --- a/drivers/misc/cs5535-mfgpt.c +++ b/drivers/misc/cs5535-mfgpt.c | |||
| @@ -366,6 +366,6 @@ static int __init cs5535_mfgpt_init(void) | |||
| 366 | 366 | ||
| 367 | module_init(cs5535_mfgpt_init); | 367 | module_init(cs5535_mfgpt_init); |
| 368 | 368 | ||
| 369 | MODULE_AUTHOR("Andres Salomon <dilinger@collabora.co.uk>"); | 369 | MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); |
| 370 | MODULE_DESCRIPTION("CS5535/CS5536 MFGPT timer driver"); | 370 | MODULE_DESCRIPTION("CS5535/CS5536 MFGPT timer driver"); |
| 371 | MODULE_LICENSE("GPL"); | 371 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index af217924a76e..ad30f074ee15 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
| @@ -365,6 +365,26 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 365 | 365 | ||
| 366 | static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | 366 | static int __devexit sdhci_s3c_remove(struct platform_device *pdev) |
| 367 | { | 367 | { |
| 368 | struct sdhci_host *host = platform_get_drvdata(pdev); | ||
| 369 | struct sdhci_s3c *sc = sdhci_priv(host); | ||
| 370 | int ptr; | ||
| 371 | |||
| 372 | sdhci_remove_host(host, 1); | ||
| 373 | |||
| 374 | for (ptr = 0; ptr < 3; ptr++) { | ||
| 375 | clk_disable(sc->clk_bus[ptr]); | ||
| 376 | clk_put(sc->clk_bus[ptr]); | ||
| 377 | } | ||
| 378 | clk_disable(sc->clk_io); | ||
| 379 | clk_put(sc->clk_io); | ||
| 380 | |||
| 381 | iounmap(host->ioaddr); | ||
| 382 | release_resource(sc->ioarea); | ||
| 383 | kfree(sc->ioarea); | ||
| 384 | |||
| 385 | sdhci_free_host(host); | ||
| 386 | platform_set_drvdata(pdev, NULL); | ||
| 387 | |||
| 368 | return 0; | 388 | return 0; |
| 369 | } | 389 | } |
| 370 | 390 | ||
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 7acb3edc47ef..2602852cc55a 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c | |||
| @@ -677,7 +677,7 @@ static int ibmveth_close(struct net_device *netdev) | |||
| 677 | if (!adapter->pool_config) | 677 | if (!adapter->pool_config) |
| 678 | netif_stop_queue(netdev); | 678 | netif_stop_queue(netdev); |
| 679 | 679 | ||
| 680 | free_irq(netdev->irq, netdev); | 680 | h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); |
| 681 | 681 | ||
| 682 | do { | 682 | do { |
| 683 | lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); | 683 | lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); |
| @@ -689,6 +689,8 @@ static int ibmveth_close(struct net_device *netdev) | |||
| 689 | lpar_rc); | 689 | lpar_rc); |
| 690 | } | 690 | } |
| 691 | 691 | ||
| 692 | free_irq(netdev->irq, netdev); | ||
| 693 | |||
| 692 | adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8); | 694 | adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8); |
| 693 | 695 | ||
| 694 | ibmveth_cleanup(adapter); | 696 | ibmveth_cleanup(adapter); |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 5b3dfb4ab279..33525bf2a3d3 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -1168,6 +1168,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id) | |||
| 1168 | int interrupts, nr_serviced = 0, i; | 1168 | int interrupts, nr_serviced = 0, i; |
| 1169 | struct ei_device *ei_local; | 1169 | struct ei_device *ei_local; |
| 1170 | int handled = 0; | 1170 | int handled = 0; |
| 1171 | unsigned long flags; | ||
| 1171 | 1172 | ||
| 1172 | e8390_base = dev->base_addr; | 1173 | e8390_base = dev->base_addr; |
| 1173 | ei_local = netdev_priv(dev); | 1174 | ei_local = netdev_priv(dev); |
| @@ -1176,7 +1177,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id) | |||
| 1176 | * Protect the irq test too. | 1177 | * Protect the irq test too. |
| 1177 | */ | 1178 | */ |
| 1178 | 1179 | ||
| 1179 | spin_lock(&ei_local->page_lock); | 1180 | spin_lock_irqsave(&ei_local->page_lock, flags); |
| 1180 | 1181 | ||
| 1181 | if (ei_local->irqlock) | 1182 | if (ei_local->irqlock) |
| 1182 | { | 1183 | { |
| @@ -1188,7 +1189,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id) | |||
| 1188 | dev->name, inb_p(e8390_base + EN0_ISR), | 1189 | dev->name, inb_p(e8390_base + EN0_ISR), |
| 1189 | inb_p(e8390_base + EN0_IMR)); | 1190 | inb_p(e8390_base + EN0_IMR)); |
| 1190 | #endif | 1191 | #endif |
| 1191 | spin_unlock(&ei_local->page_lock); | 1192 | spin_unlock_irqrestore(&ei_local->page_lock, flags); |
| 1192 | return IRQ_NONE; | 1193 | return IRQ_NONE; |
| 1193 | } | 1194 | } |
| 1194 | 1195 | ||
| @@ -1261,7 +1262,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id) | |||
| 1261 | ei_local->irqlock = 0; | 1262 | ei_local->irqlock = 0; |
| 1262 | outb_p(ENISR_ALL, e8390_base + EN0_IMR); | 1263 | outb_p(ENISR_ALL, e8390_base + EN0_IMR); |
| 1263 | 1264 | ||
| 1264 | spin_unlock(&ei_local->page_lock); | 1265 | spin_unlock_irqrestore(&ei_local->page_lock, flags); |
| 1265 | return IRQ_RETVAL(handled); | 1266 | return IRQ_RETVAL(handled); |
| 1266 | } | 1267 | } |
| 1267 | 1268 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 96b6cfbf0a3a..cdc6a5c2e70d 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -1316,7 +1316,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp, | |||
| 1316 | { 0x7c800000, 0x28000000, RTL_GIGA_MAC_VER_26 }, | 1316 | { 0x7c800000, 0x28000000, RTL_GIGA_MAC_VER_26 }, |
| 1317 | 1317 | ||
| 1318 | /* 8168C family. */ | 1318 | /* 8168C family. */ |
| 1319 | { 0x7cf00000, 0x3ca00000, RTL_GIGA_MAC_VER_24 }, | 1319 | { 0x7cf00000, 0x3cb00000, RTL_GIGA_MAC_VER_24 }, |
| 1320 | { 0x7cf00000, 0x3c900000, RTL_GIGA_MAC_VER_23 }, | 1320 | { 0x7cf00000, 0x3c900000, RTL_GIGA_MAC_VER_23 }, |
| 1321 | { 0x7cf00000, 0x3c800000, RTL_GIGA_MAC_VER_18 }, | 1321 | { 0x7cf00000, 0x3c800000, RTL_GIGA_MAC_VER_18 }, |
| 1322 | { 0x7c800000, 0x3c800000, RTL_GIGA_MAC_VER_24 }, | 1322 | { 0x7c800000, 0x3c800000, RTL_GIGA_MAC_VER_24 }, |
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index 77b359162d6c..23c15aa9fbd5 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
| @@ -730,13 +730,17 @@ static int ath9k_hif_usb_alloc_urbs(struct hif_device_usb *hif_dev) | |||
| 730 | 730 | ||
| 731 | /* RX */ | 731 | /* RX */ |
| 732 | if (ath9k_hif_usb_alloc_rx_urbs(hif_dev) < 0) | 732 | if (ath9k_hif_usb_alloc_rx_urbs(hif_dev) < 0) |
| 733 | goto err; | 733 | goto err_rx; |
| 734 | 734 | ||
| 735 | /* Register Read */ | 735 | /* Register Read */ |
| 736 | if (ath9k_hif_usb_alloc_reg_in_urb(hif_dev) < 0) | 736 | if (ath9k_hif_usb_alloc_reg_in_urb(hif_dev) < 0) |
| 737 | goto err; | 737 | goto err_reg; |
| 738 | 738 | ||
| 739 | return 0; | 739 | return 0; |
| 740 | err_reg: | ||
| 741 | ath9k_hif_usb_dealloc_rx_urbs(hif_dev); | ||
| 742 | err_rx: | ||
| 743 | ath9k_hif_usb_dealloc_tx_urbs(hif_dev); | ||
| 740 | err: | 744 | err: |
| 741 | return -ENOMEM; | 745 | return -ENOMEM; |
| 742 | } | 746 | } |
diff --git a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c index d24dc7dc0723..972a9c3af39e 100644 --- a/drivers/net/wireless/hostap/hostap_pci.c +++ b/drivers/net/wireless/hostap/hostap_pci.c | |||
| @@ -330,6 +330,7 @@ static int prism2_pci_probe(struct pci_dev *pdev, | |||
| 330 | 330 | ||
| 331 | dev->irq = pdev->irq; | 331 | dev->irq = pdev->irq; |
| 332 | hw_priv->mem_start = mem; | 332 | hw_priv->mem_start = mem; |
| 333 | dev->base_addr = (unsigned long) mem; | ||
| 333 | 334 | ||
| 334 | prism2_pci_cor_sreset(local); | 335 | prism2_pci_cor_sreset(local); |
| 335 | 336 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.h b/drivers/net/wireless/iwlwifi/iwl-sta.h index c2a453a1a991..dc43ebd1f1fd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.h +++ b/drivers/net/wireless/iwlwifi/iwl-sta.h | |||
| @@ -97,6 +97,17 @@ static inline void iwl_clear_driver_stations(struct iwl_priv *priv) | |||
| 97 | spin_lock_irqsave(&priv->sta_lock, flags); | 97 | spin_lock_irqsave(&priv->sta_lock, flags); |
| 98 | memset(priv->stations, 0, sizeof(priv->stations)); | 98 | memset(priv->stations, 0, sizeof(priv->stations)); |
| 99 | priv->num_stations = 0; | 99 | priv->num_stations = 0; |
| 100 | |||
| 101 | /* | ||
| 102 | * Remove all key information that is not stored as part of station | ||
| 103 | * information since mac80211 may not have had a | ||
| 104 | * chance to remove all the keys. When device is reconfigured by | ||
| 105 | * mac80211 after an error all keys will be reconfigured. | ||
| 106 | */ | ||
| 107 | priv->ucode_key_table = 0; | ||
| 108 | priv->key_mapping_key = 0; | ||
| 109 | memset(priv->wep_keys, 0, sizeof(priv->wep_keys)); | ||
| 110 | |||
| 100 | spin_unlock_irqrestore(&priv->sta_lock, flags); | 111 | spin_unlock_irqrestore(&priv->sta_lock, flags); |
| 101 | } | 112 | } |
| 102 | 113 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 3ae468c4d760..f20d3eeeea7f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -854,6 +854,11 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
| 854 | BIT(NL80211_IFTYPE_WDS); | 854 | BIT(NL80211_IFTYPE_WDS); |
| 855 | 855 | ||
| 856 | /* | 856 | /* |
| 857 | * Initialize configuration work. | ||
| 858 | */ | ||
| 859 | INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); | ||
| 860 | |||
| 861 | /* | ||
| 857 | * Let the driver probe the device to detect the capabilities. | 862 | * Let the driver probe the device to detect the capabilities. |
| 858 | */ | 863 | */ |
| 859 | retval = rt2x00dev->ops->lib->probe_hw(rt2x00dev); | 864 | retval = rt2x00dev->ops->lib->probe_hw(rt2x00dev); |
| @@ -863,11 +868,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
| 863 | } | 868 | } |
| 864 | 869 | ||
| 865 | /* | 870 | /* |
| 866 | * Initialize configuration work. | ||
| 867 | */ | ||
| 868 | INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); | ||
| 869 | |||
| 870 | /* | ||
| 871 | * Allocate queue array. | 871 | * Allocate queue array. |
| 872 | */ | 872 | */ |
| 873 | retval = rt2x00queue_allocate(rt2x00dev); | 873 | retval = rt2x00queue_allocate(rt2x00dev); |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 29f91fac1dff..a4cd9adfcbc0 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
| @@ -857,8 +857,10 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev) | |||
| 857 | { | 857 | { |
| 858 | pcmcia_release_configuration(p_dev); | 858 | pcmcia_release_configuration(p_dev); |
| 859 | pcmcia_release_io(p_dev, &p_dev->io); | 859 | pcmcia_release_io(p_dev, &p_dev->io); |
| 860 | if (p_dev->_irq) | 860 | if (p_dev->_irq) { |
| 861 | free_irq(p_dev->irq, p_dev->priv); | 861 | free_irq(p_dev->irq, p_dev->priv); |
| 862 | p_dev->_irq = 0; | ||
| 863 | } | ||
| 862 | if (p_dev->win) | 864 | if (p_dev->win) |
| 863 | pcmcia_release_window(p_dev, p_dev->win); | 865 | pcmcia_release_window(p_dev, p_dev->win); |
| 864 | } | 866 | } |
diff --git a/drivers/power/ds2782_battery.c b/drivers/power/ds2782_battery.c index d762a0cbc6af..2afbeec8b791 100644 --- a/drivers/power/ds2782_battery.c +++ b/drivers/power/ds2782_battery.c | |||
| @@ -163,7 +163,7 @@ static int ds2782_get_capacity(struct ds278x_info *info, int *capacity) | |||
| 163 | if (err) | 163 | if (err) |
| 164 | return err; | 164 | return err; |
| 165 | *capacity = raw; | 165 | *capacity = raw; |
| 166 | return raw; | 166 | return 0; |
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | static int ds2786_get_current(struct ds278x_info *info, int *current_uA) | 169 | static int ds2786_get_current(struct ds278x_info *info, int *current_uA) |
diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index d53e62ab09da..aacbe14e2e7a 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c | |||
| @@ -554,7 +554,7 @@ static int opiocgetnext(unsigned int cmd, void __user *argp) | |||
| 554 | static int openprom_bsd_ioctl(struct file * file, | 554 | static int openprom_bsd_ioctl(struct file * file, |
| 555 | unsigned int cmd, unsigned long arg) | 555 | unsigned int cmd, unsigned long arg) |
| 556 | { | 556 | { |
| 557 | DATA *data = (DATA *) file->private_data; | 557 | DATA *data = file->private_data; |
| 558 | void __user *argp = (void __user *)arg; | 558 | void __user *argp = (void __user *)arg; |
| 559 | int err; | 559 | int err; |
| 560 | 560 | ||
| @@ -601,7 +601,7 @@ static int openprom_bsd_ioctl(struct file * file, | |||
| 601 | static long openprom_ioctl(struct file * file, | 601 | static long openprom_ioctl(struct file * file, |
| 602 | unsigned int cmd, unsigned long arg) | 602 | unsigned int cmd, unsigned long arg) |
| 603 | { | 603 | { |
| 604 | DATA *data = (DATA *) file->private_data; | 604 | DATA *data = file->private_data; |
| 605 | 605 | ||
| 606 | switch (cmd) { | 606 | switch (cmd) { |
| 607 | case OPROMGETOPT: | 607 | case OPROMGETOPT: |
diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c index ed7d958b0a01..544f2e25d0e5 100644 --- a/drivers/serial/suncore.c +++ b/drivers/serial/suncore.c | |||
| @@ -71,7 +71,9 @@ int sunserial_console_match(struct console *con, struct device_node *dp, | |||
| 71 | 71 | ||
| 72 | con->index = line; | 72 | con->index = line; |
| 73 | drv->cons = con; | 73 | drv->cons = con; |
| 74 | add_preferred_console(con->name, line, NULL); | 74 | |
| 75 | if (!console_set_on_cmdline) | ||
| 76 | add_preferred_console(con->name, line, NULL); | ||
| 75 | 77 | ||
| 76 | return 1; | 78 | return 1; |
| 77 | } | 79 | } |
diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c index 234459c2f012..ffbf4553f665 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c | |||
| @@ -1500,20 +1500,25 @@ out_unmap: | |||
| 1500 | static int __devexit su_remove(struct of_device *op) | 1500 | static int __devexit su_remove(struct of_device *op) |
| 1501 | { | 1501 | { |
| 1502 | struct uart_sunsu_port *up = dev_get_drvdata(&op->dev); | 1502 | struct uart_sunsu_port *up = dev_get_drvdata(&op->dev); |
| 1503 | bool kbdms = false; | ||
| 1503 | 1504 | ||
| 1504 | if (up->su_type == SU_PORT_MS || | 1505 | if (up->su_type == SU_PORT_MS || |
| 1505 | up->su_type == SU_PORT_KBD) { | 1506 | up->su_type == SU_PORT_KBD) |
| 1507 | kbdms = true; | ||
| 1508 | |||
| 1509 | if (kbdms) { | ||
| 1506 | #ifdef CONFIG_SERIO | 1510 | #ifdef CONFIG_SERIO |
| 1507 | serio_unregister_port(&up->serio); | 1511 | serio_unregister_port(&up->serio); |
| 1508 | #endif | 1512 | #endif |
| 1509 | kfree(up); | 1513 | } else if (up->port.type != PORT_UNKNOWN) |
| 1510 | } else if (up->port.type != PORT_UNKNOWN) { | ||
| 1511 | uart_remove_one_port(&sunsu_reg, &up->port); | 1514 | uart_remove_one_port(&sunsu_reg, &up->port); |
| 1512 | } | ||
| 1513 | 1515 | ||
| 1514 | if (up->port.membase) | 1516 | if (up->port.membase) |
| 1515 | of_iounmap(&op->resource[0], up->port.membase, up->reg_size); | 1517 | of_iounmap(&op->resource[0], up->port.membase, up->reg_size); |
| 1516 | 1518 | ||
| 1519 | if (kbdms) | ||
| 1520 | kfree(up); | ||
| 1521 | |||
| 1517 | dev_set_drvdata(&op->dev, NULL); | 1522 | dev_set_drvdata(&op->dev, NULL); |
| 1518 | 1523 | ||
| 1519 | return 0; | 1524 | return 0; |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index d69eccf5f197..2aaa0f75c6cf 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
| @@ -136,7 +136,7 @@ struct ffs_data { | |||
| 136 | * handling setup requests immidiatelly user space may be so | 136 | * handling setup requests immidiatelly user space may be so |
| 137 | * slow that another setup will be sent to the gadget but this | 137 | * slow that another setup will be sent to the gadget but this |
| 138 | * time not to us but another function and then there could be | 138 | * time not to us but another function and then there could be |
| 139 | * a race. Is taht the case? Or maybe we can use cdev->req | 139 | * a race. Is that the case? Or maybe we can use cdev->req |
| 140 | * after all, maybe we just need some spinlock for that? */ | 140 | * after all, maybe we just need some spinlock for that? */ |
| 141 | struct usb_request *ep0req; /* P: mutex */ | 141 | struct usb_request *ep0req; /* P: mutex */ |
| 142 | struct completion ep0req_completion; /* P: mutex */ | 142 | struct completion ep0req_completion; /* P: mutex */ |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 57a593c58cf4..d219070fed3d 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -177,8 +177,8 @@ static void handle_tx(struct vhost_net *net) | |||
| 177 | break; | 177 | break; |
| 178 | } | 178 | } |
| 179 | if (err != len) | 179 | if (err != len) |
| 180 | pr_err("Truncated TX packet: " | 180 | pr_debug("Truncated TX packet: " |
| 181 | " len %d != %zd\n", err, len); | 181 | " len %d != %zd\n", err, len); |
| 182 | vhost_add_used_and_signal(&net->dev, vq, head, 0); | 182 | vhost_add_used_and_signal(&net->dev, vq, head, 0); |
| 183 | total_len += len; | 183 | total_len += len; |
| 184 | if (unlikely(total_len >= VHOST_NET_WEIGHT)) { | 184 | if (unlikely(total_len >= VHOST_NET_WEIGHT)) { |
| @@ -275,8 +275,8 @@ static void handle_rx(struct vhost_net *net) | |||
| 275 | } | 275 | } |
| 276 | /* TODO: Should check and handle checksum. */ | 276 | /* TODO: Should check and handle checksum. */ |
| 277 | if (err > len) { | 277 | if (err > len) { |
| 278 | pr_err("Discarded truncated rx packet: " | 278 | pr_debug("Discarded truncated rx packet: " |
| 279 | " len %d > %zd\n", err, len); | 279 | " len %d > %zd\n", err, len); |
| 280 | vhost_discard_vq_desc(vq); | 280 | vhost_discard_vq_desc(vq); |
| 281 | continue; | 281 | continue; |
| 282 | } | 282 | } |
| @@ -534,11 +534,16 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) | |||
| 534 | rcu_assign_pointer(vq->private_data, sock); | 534 | rcu_assign_pointer(vq->private_data, sock); |
| 535 | vhost_net_enable_vq(n, vq); | 535 | vhost_net_enable_vq(n, vq); |
| 536 | done: | 536 | done: |
| 537 | mutex_unlock(&vq->mutex); | ||
| 538 | |||
| 537 | if (oldsock) { | 539 | if (oldsock) { |
| 538 | vhost_net_flush_vq(n, index); | 540 | vhost_net_flush_vq(n, index); |
| 539 | fput(oldsock->file); | 541 | fput(oldsock->file); |
| 540 | } | 542 | } |
| 541 | 543 | ||
| 544 | mutex_unlock(&n->dev.mutex); | ||
| 545 | return 0; | ||
| 546 | |||
| 542 | err_vq: | 547 | err_vq: |
| 543 | mutex_unlock(&vq->mutex); | 548 | mutex_unlock(&vq->mutex); |
| 544 | err: | 549 | err: |
diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c index 515cf1978d19..c4e17642d9c5 100644 --- a/drivers/video/aty/radeon_pm.c +++ b/drivers/video/aty/radeon_pm.c | |||
| @@ -2872,7 +2872,7 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlis | |||
| 2872 | } | 2872 | } |
| 2873 | 2873 | ||
| 2874 | #if 0 | 2874 | #if 0 |
| 2875 | /* Power down TV DAC, taht saves a significant amount of power, | 2875 | /* Power down TV DAC, that saves a significant amount of power, |
| 2876 | * we'll have something better once we actually have some TVOut | 2876 | * we'll have something better once we actually have some TVOut |
| 2877 | * support | 2877 | * support |
| 2878 | */ | 2878 | */ |
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 0d1d966b0fe4..c3df14ce2cc2 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
| @@ -2304,12 +2304,17 @@ noinline int btrfs_leaf_free_space(struct btrfs_root *root, | |||
| 2304 | return ret; | 2304 | return ret; |
| 2305 | } | 2305 | } |
| 2306 | 2306 | ||
| 2307 | /* | ||
| 2308 | * min slot controls the lowest index we're willing to push to the | ||
| 2309 | * right. We'll push up to and including min_slot, but no lower | ||
| 2310 | */ | ||
| 2307 | static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | 2311 | static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, |
| 2308 | struct btrfs_root *root, | 2312 | struct btrfs_root *root, |
| 2309 | struct btrfs_path *path, | 2313 | struct btrfs_path *path, |
| 2310 | int data_size, int empty, | 2314 | int data_size, int empty, |
| 2311 | struct extent_buffer *right, | 2315 | struct extent_buffer *right, |
| 2312 | int free_space, u32 left_nritems) | 2316 | int free_space, u32 left_nritems, |
| 2317 | u32 min_slot) | ||
| 2313 | { | 2318 | { |
| 2314 | struct extent_buffer *left = path->nodes[0]; | 2319 | struct extent_buffer *left = path->nodes[0]; |
| 2315 | struct extent_buffer *upper = path->nodes[1]; | 2320 | struct extent_buffer *upper = path->nodes[1]; |
| @@ -2327,7 +2332,7 @@ static noinline int __push_leaf_right(struct btrfs_trans_handle *trans, | |||
| 2327 | if (empty) | 2332 | if (empty) |
| 2328 | nr = 0; | 2333 | nr = 0; |
| 2329 | else | 2334 | else |
| 2330 | nr = 1; | 2335 | nr = max_t(u32, 1, min_slot); |
| 2331 | 2336 | ||
| 2332 | if (path->slots[0] >= left_nritems) | 2337 | if (path->slots[0] >= left_nritems) |
| 2333 | push_space += data_size; | 2338 | push_space += data_size; |
| @@ -2469,10 +2474,14 @@ out_unlock: | |||
| 2469 | * | 2474 | * |
| 2470 | * returns 1 if the push failed because the other node didn't have enough | 2475 | * returns 1 if the push failed because the other node didn't have enough |
| 2471 | * room, 0 if everything worked out and < 0 if there were major errors. | 2476 | * room, 0 if everything worked out and < 0 if there were major errors. |
| 2477 | * | ||
| 2478 | * this will push starting from min_slot to the end of the leaf. It won't | ||
| 2479 | * push any slot lower than min_slot | ||
| 2472 | */ | 2480 | */ |
| 2473 | static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root | 2481 | static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root |
| 2474 | *root, struct btrfs_path *path, int data_size, | 2482 | *root, struct btrfs_path *path, |
| 2475 | int empty) | 2483 | int min_data_size, int data_size, |
| 2484 | int empty, u32 min_slot) | ||
| 2476 | { | 2485 | { |
| 2477 | struct extent_buffer *left = path->nodes[0]; | 2486 | struct extent_buffer *left = path->nodes[0]; |
| 2478 | struct extent_buffer *right; | 2487 | struct extent_buffer *right; |
| @@ -2514,8 +2523,8 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root | |||
| 2514 | if (left_nritems == 0) | 2523 | if (left_nritems == 0) |
| 2515 | goto out_unlock; | 2524 | goto out_unlock; |
| 2516 | 2525 | ||
| 2517 | return __push_leaf_right(trans, root, path, data_size, empty, | 2526 | return __push_leaf_right(trans, root, path, min_data_size, empty, |
| 2518 | right, free_space, left_nritems); | 2527 | right, free_space, left_nritems, min_slot); |
| 2519 | out_unlock: | 2528 | out_unlock: |
| 2520 | btrfs_tree_unlock(right); | 2529 | btrfs_tree_unlock(right); |
| 2521 | free_extent_buffer(right); | 2530 | free_extent_buffer(right); |
| @@ -2525,12 +2534,17 @@ out_unlock: | |||
| 2525 | /* | 2534 | /* |
| 2526 | * push some data in the path leaf to the left, trying to free up at | 2535 | * push some data in the path leaf to the left, trying to free up at |
| 2527 | * least data_size bytes. returns zero if the push worked, nonzero otherwise | 2536 | * least data_size bytes. returns zero if the push worked, nonzero otherwise |
| 2537 | * | ||
| 2538 | * max_slot can put a limit on how far into the leaf we'll push items. The | ||
| 2539 | * item at 'max_slot' won't be touched. Use (u32)-1 to make us do all the | ||
| 2540 | * items | ||
| 2528 | */ | 2541 | */ |
| 2529 | static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | 2542 | static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, |
| 2530 | struct btrfs_root *root, | 2543 | struct btrfs_root *root, |
| 2531 | struct btrfs_path *path, int data_size, | 2544 | struct btrfs_path *path, int data_size, |
| 2532 | int empty, struct extent_buffer *left, | 2545 | int empty, struct extent_buffer *left, |
| 2533 | int free_space, int right_nritems) | 2546 | int free_space, u32 right_nritems, |
| 2547 | u32 max_slot) | ||
| 2534 | { | 2548 | { |
| 2535 | struct btrfs_disk_key disk_key; | 2549 | struct btrfs_disk_key disk_key; |
| 2536 | struct extent_buffer *right = path->nodes[0]; | 2550 | struct extent_buffer *right = path->nodes[0]; |
| @@ -2549,9 +2563,9 @@ static noinline int __push_leaf_left(struct btrfs_trans_handle *trans, | |||
| 2549 | slot = path->slots[1]; | 2563 | slot = path->slots[1]; |
| 2550 | 2564 | ||
| 2551 | if (empty) | 2565 | if (empty) |
| 2552 | nr = right_nritems; | 2566 | nr = min(right_nritems, max_slot); |
| 2553 | else | 2567 | else |
| 2554 | nr = right_nritems - 1; | 2568 | nr = min(right_nritems - 1, max_slot); |
| 2555 | 2569 | ||
| 2556 | for (i = 0; i < nr; i++) { | 2570 | for (i = 0; i < nr; i++) { |
| 2557 | item = btrfs_item_nr(right, i); | 2571 | item = btrfs_item_nr(right, i); |
| @@ -2712,10 +2726,14 @@ out: | |||
| 2712 | /* | 2726 | /* |
| 2713 | * push some data in the path leaf to the left, trying to free up at | 2727 | * push some data in the path leaf to the left, trying to free up at |
| 2714 | * least data_size bytes. returns zero if the push worked, nonzero otherwise | 2728 | * least data_size bytes. returns zero if the push worked, nonzero otherwise |
| 2729 | * | ||
| 2730 | * max_slot can put a limit on how far into the leaf we'll push items. The | ||
| 2731 | * item at 'max_slot' won't be touched. Use (u32)-1 to make us push all the | ||
| 2732 | * items | ||
| 2715 | */ | 2733 | */ |
| 2716 | static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root | 2734 | static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root |
| 2717 | *root, struct btrfs_path *path, int data_size, | 2735 | *root, struct btrfs_path *path, int min_data_size, |
| 2718 | int empty) | 2736 | int data_size, int empty, u32 max_slot) |
| 2719 | { | 2737 | { |
| 2720 | struct extent_buffer *right = path->nodes[0]; | 2738 | struct extent_buffer *right = path->nodes[0]; |
| 2721 | struct extent_buffer *left; | 2739 | struct extent_buffer *left; |
| @@ -2761,8 +2779,9 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root | |||
| 2761 | goto out; | 2779 | goto out; |
| 2762 | } | 2780 | } |
| 2763 | 2781 | ||
| 2764 | return __push_leaf_left(trans, root, path, data_size, | 2782 | return __push_leaf_left(trans, root, path, min_data_size, |
| 2765 | empty, left, free_space, right_nritems); | 2783 | empty, left, free_space, right_nritems, |
| 2784 | max_slot); | ||
| 2766 | out: | 2785 | out: |
| 2767 | btrfs_tree_unlock(left); | 2786 | btrfs_tree_unlock(left); |
| 2768 | free_extent_buffer(left); | 2787 | free_extent_buffer(left); |
| @@ -2855,6 +2874,64 @@ static noinline int copy_for_split(struct btrfs_trans_handle *trans, | |||
| 2855 | } | 2874 | } |
| 2856 | 2875 | ||
| 2857 | /* | 2876 | /* |
| 2877 | * double splits happen when we need to insert a big item in the middle | ||
| 2878 | * of a leaf. A double split can leave us with 3 mostly empty leaves: | ||
| 2879 | * leaf: [ slots 0 - N] [ our target ] [ N + 1 - total in leaf ] | ||
| 2880 | * A B C | ||
| 2881 | * | ||
| 2882 | * We avoid this by trying to push the items on either side of our target | ||
| 2883 | * into the adjacent leaves. If all goes well we can avoid the double split | ||
| 2884 | * completely. | ||
| 2885 | */ | ||
| 2886 | static noinline int push_for_double_split(struct btrfs_trans_handle *trans, | ||
| 2887 | struct btrfs_root *root, | ||
| 2888 | struct btrfs_path *path, | ||
| 2889 | int data_size) | ||
| 2890 | { | ||
| 2891 | int ret; | ||
| 2892 | int progress = 0; | ||
| 2893 | int slot; | ||
| 2894 | u32 nritems; | ||
| 2895 | |||
| 2896 | slot = path->slots[0]; | ||
| 2897 | |||
| 2898 | /* | ||
| 2899 | * try to push all the items after our slot into the | ||
| 2900 | * right leaf | ||
| 2901 | */ | ||
| 2902 | ret = push_leaf_right(trans, root, path, 1, data_size, 0, slot); | ||
| 2903 | if (ret < 0) | ||
| 2904 | return ret; | ||
| 2905 | |||
| 2906 | if (ret == 0) | ||
| 2907 | progress++; | ||
| 2908 | |||
| 2909 | nritems = btrfs_header_nritems(path->nodes[0]); | ||
| 2910 | /* | ||
| 2911 | * our goal is to get our slot at the start or end of a leaf. If | ||
| 2912 | * we've done so we're done | ||
| 2913 | */ | ||
| 2914 | if (path->slots[0] == 0 || path->slots[0] == nritems) | ||
| 2915 | return 0; | ||
| 2916 | |||
| 2917 | if (btrfs_leaf_free_space(root, path->nodes[0]) >= data_size) | ||
| 2918 | return 0; | ||
| 2919 | |||
| 2920 | /* try to push all the items before our slot into the next leaf */ | ||
| 2921 | slot = path->slots[0]; | ||
| 2922 | ret = push_leaf_left(trans, root, path, 1, data_size, 0, slot); | ||
| 2923 | if (ret < 0) | ||
| 2924 | return ret; | ||
| 2925 | |||
| 2926 | if (ret == 0) | ||
| 2927 | progress++; | ||
| 2928 | |||
| 2929 | if (progress) | ||
| 2930 | return 0; | ||
| 2931 | return 1; | ||
| 2932 | } | ||
| 2933 | |||
| 2934 | /* | ||
| 2858 | * split the path's leaf in two, making sure there is at least data_size | 2935 | * split the path's leaf in two, making sure there is at least data_size |
| 2859 | * available for the resulting leaf level of the path. | 2936 | * available for the resulting leaf level of the path. |
| 2860 | * | 2937 | * |
| @@ -2876,6 +2953,7 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans, | |||
| 2876 | int wret; | 2953 | int wret; |
| 2877 | int split; | 2954 | int split; |
| 2878 | int num_doubles = 0; | 2955 | int num_doubles = 0; |
| 2956 | int tried_avoid_double = 0; | ||
| 2879 | 2957 | ||
| 2880 | l = path->nodes[0]; | 2958 | l = path->nodes[0]; |
| 2881 | slot = path->slots[0]; | 2959 | slot = path->slots[0]; |
| @@ -2884,12 +2962,14 @@ static noinline int split_leaf(struct btrfs_trans_handle *trans, | |||
| 2884 | return -EOVERFLOW; | 2962 | return -EOVERFLOW; |
| 2885 | 2963 | ||
| 2886 | /* first try to make some room by pushing left and right */ | 2964 | /* first try to make some room by pushing left and right */ |
| 2887 | if (data_size && ins_key->type != BTRFS_DIR_ITEM_KEY) { | 2965 | if (data_size) { |
| 2888 | wret = push_leaf_right(trans, root, path, data_size, 0); | 2966 | wret = push_leaf_right(trans, root, path, data_size, |
| 2967 | data_size, 0, 0); | ||
| 2889 | if (wret < 0) | 2968 | if (wret < 0) |
| 2890 | return wret; | 2969 | return wret; |
| 2891 | if (wret) { | 2970 | if (wret) { |
| 2892 | wret = push_leaf_left(trans, root, path, data_size, 0); | 2971 | wret = push_leaf_left(trans, root, path, data_size, |
| 2972 | data_size, 0, (u32)-1); | ||
| 2893 | if (wret < 0) | 2973 | if (wret < 0) |
| 2894 | return wret; | 2974 | return wret; |
| 2895 | } | 2975 | } |
| @@ -2923,6 +3003,8 @@ again: | |||
| 2923 | if (mid != nritems && | 3003 | if (mid != nritems && |
| 2924 | leaf_space_used(l, mid, nritems - mid) + | 3004 | leaf_space_used(l, mid, nritems - mid) + |
| 2925 | data_size > BTRFS_LEAF_DATA_SIZE(root)) { | 3005 | data_size > BTRFS_LEAF_DATA_SIZE(root)) { |
| 3006 | if (data_size && !tried_avoid_double) | ||
| 3007 | goto push_for_double; | ||
| 2926 | split = 2; | 3008 | split = 2; |
| 2927 | } | 3009 | } |
| 2928 | } | 3010 | } |
| @@ -2939,6 +3021,8 @@ again: | |||
| 2939 | if (mid != nritems && | 3021 | if (mid != nritems && |
| 2940 | leaf_space_used(l, mid, nritems - mid) + | 3022 | leaf_space_used(l, mid, nritems - mid) + |
| 2941 | data_size > BTRFS_LEAF_DATA_SIZE(root)) { | 3023 | data_size > BTRFS_LEAF_DATA_SIZE(root)) { |
| 3024 | if (data_size && !tried_avoid_double) | ||
| 3025 | goto push_for_double; | ||
| 2942 | split = 2 ; | 3026 | split = 2 ; |
| 2943 | } | 3027 | } |
| 2944 | } | 3028 | } |
| @@ -3019,6 +3103,13 @@ again: | |||
| 3019 | } | 3103 | } |
| 3020 | 3104 | ||
| 3021 | return ret; | 3105 | return ret; |
| 3106 | |||
| 3107 | push_for_double: | ||
| 3108 | push_for_double_split(trans, root, path, data_size); | ||
| 3109 | tried_avoid_double = 1; | ||
| 3110 | if (btrfs_leaf_free_space(root, path->nodes[0]) >= data_size) | ||
| 3111 | return 0; | ||
| 3112 | goto again; | ||
| 3022 | } | 3113 | } |
| 3023 | 3114 | ||
| 3024 | static noinline int setup_leaf_for_split(struct btrfs_trans_handle *trans, | 3115 | static noinline int setup_leaf_for_split(struct btrfs_trans_handle *trans, |
| @@ -3915,13 +4006,15 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 3915 | extent_buffer_get(leaf); | 4006 | extent_buffer_get(leaf); |
| 3916 | 4007 | ||
| 3917 | btrfs_set_path_blocking(path); | 4008 | btrfs_set_path_blocking(path); |
| 3918 | wret = push_leaf_left(trans, root, path, 1, 1); | 4009 | wret = push_leaf_left(trans, root, path, 1, 1, |
| 4010 | 1, (u32)-1); | ||
| 3919 | if (wret < 0 && wret != -ENOSPC) | 4011 | if (wret < 0 && wret != -ENOSPC) |
| 3920 | ret = wret; | 4012 | ret = wret; |
| 3921 | 4013 | ||
| 3922 | if (path->nodes[0] == leaf && | 4014 | if (path->nodes[0] == leaf && |
| 3923 | btrfs_header_nritems(leaf)) { | 4015 | btrfs_header_nritems(leaf)) { |
| 3924 | wret = push_leaf_right(trans, root, path, 1, 1); | 4016 | wret = push_leaf_right(trans, root, path, 1, |
| 4017 | 1, 1, 0); | ||
| 3925 | if (wret < 0 && wret != -ENOSPC) | 4018 | if (wret < 0 && wret != -ENOSPC) |
| 3926 | ret = wret; | 4019 | ret = wret; |
| 3927 | } | 4020 | } |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 4dbaf89b1337..9254b3d58dbe 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -1458,7 +1458,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 1458 | */ | 1458 | */ |
| 1459 | 1459 | ||
| 1460 | /* the destination must be opened for writing */ | 1460 | /* the destination must be opened for writing */ |
| 1461 | if (!(file->f_mode & FMODE_WRITE)) | 1461 | if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) |
| 1462 | return -EINVAL; | 1462 | return -EINVAL; |
| 1463 | 1463 | ||
| 1464 | ret = mnt_want_write(file->f_path.mnt); | 1464 | ret = mnt_want_write(file->f_path.mnt); |
| @@ -1511,7 +1511,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 1511 | 1511 | ||
| 1512 | /* determine range to clone */ | 1512 | /* determine range to clone */ |
| 1513 | ret = -EINVAL; | 1513 | ret = -EINVAL; |
| 1514 | if (off >= src->i_size || off + len > src->i_size) | 1514 | if (off + len > src->i_size || off + len < off) |
| 1515 | goto out_unlock; | 1515 | goto out_unlock; |
| 1516 | if (len == 0) | 1516 | if (len == 0) |
| 1517 | olen = len = src->i_size - off; | 1517 | olen = len = src->i_size - off; |
| @@ -1578,6 +1578,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 1578 | u64 disko = 0, diskl = 0; | 1578 | u64 disko = 0, diskl = 0; |
| 1579 | u64 datao = 0, datal = 0; | 1579 | u64 datao = 0, datal = 0; |
| 1580 | u8 comp; | 1580 | u8 comp; |
| 1581 | u64 endoff; | ||
| 1581 | 1582 | ||
| 1582 | size = btrfs_item_size_nr(leaf, slot); | 1583 | size = btrfs_item_size_nr(leaf, slot); |
| 1583 | read_extent_buffer(leaf, buf, | 1584 | read_extent_buffer(leaf, buf, |
| @@ -1712,9 +1713,18 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
| 1712 | btrfs_release_path(root, path); | 1713 | btrfs_release_path(root, path); |
| 1713 | 1714 | ||
| 1714 | inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 1715 | inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
| 1715 | if (new_key.offset + datal > inode->i_size) | 1716 | |
| 1716 | btrfs_i_size_write(inode, | 1717 | /* |
| 1717 | new_key.offset + datal); | 1718 | * we round up to the block size at eof when |
| 1719 | * determining which extents to clone above, | ||
| 1720 | * but shouldn't round up the file size | ||
| 1721 | */ | ||
| 1722 | endoff = new_key.offset + datal; | ||
| 1723 | if (endoff > off+olen) | ||
| 1724 | endoff = off+olen; | ||
| 1725 | if (endoff > inode->i_size) | ||
| 1726 | btrfs_i_size_write(inode, endoff); | ||
| 1727 | |||
| 1718 | BTRFS_I(inode)->flags = BTRFS_I(src)->flags; | 1728 | BTRFS_I(inode)->flags = BTRFS_I(src)->flags; |
| 1719 | ret = btrfs_update_inode(trans, root, inode); | 1729 | ret = btrfs_update_inode(trans, root, inode); |
| 1720 | BUG_ON(ret); | 1730 | BUG_ON(ret); |
diff --git a/fs/ceph/auth_x.c b/fs/ceph/auth_x.c index 3fe49042d8ad..6d44053ecff1 100644 --- a/fs/ceph/auth_x.c +++ b/fs/ceph/auth_x.c | |||
| @@ -613,6 +613,9 @@ static void ceph_x_destroy(struct ceph_auth_client *ac) | |||
| 613 | remove_ticket_handler(ac, th); | 613 | remove_ticket_handler(ac, th); |
| 614 | } | 614 | } |
| 615 | 615 | ||
| 616 | if (xi->auth_authorizer.buf) | ||
| 617 | ceph_buffer_put(xi->auth_authorizer.buf); | ||
| 618 | |||
| 616 | kfree(ac->private); | 619 | kfree(ac->private); |
| 617 | ac->private = NULL; | 620 | ac->private = NULL; |
| 618 | } | 621 | } |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 3ab79f6c4ce8..416c08d315db 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -1514,6 +1514,9 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, | |||
| 1514 | ceph_encode_filepath(&p, end, ino1, path1); | 1514 | ceph_encode_filepath(&p, end, ino1, path1); |
| 1515 | ceph_encode_filepath(&p, end, ino2, path2); | 1515 | ceph_encode_filepath(&p, end, ino2, path2); |
| 1516 | 1516 | ||
| 1517 | /* make note of release offset, in case we need to replay */ | ||
| 1518 | req->r_request_release_offset = p - msg->front.iov_base; | ||
| 1519 | |||
| 1517 | /* cap releases */ | 1520 | /* cap releases */ |
| 1518 | releases = 0; | 1521 | releases = 0; |
| 1519 | if (req->r_inode_drop) | 1522 | if (req->r_inode_drop) |
| @@ -1580,6 +1583,32 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc, | |||
| 1580 | dout("prepare_send_request %p tid %lld %s (attempt %d)\n", req, | 1583 | dout("prepare_send_request %p tid %lld %s (attempt %d)\n", req, |
| 1581 | req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); | 1584 | req->r_tid, ceph_mds_op_name(req->r_op), req->r_attempts); |
| 1582 | 1585 | ||
| 1586 | if (req->r_got_unsafe) { | ||
| 1587 | /* | ||
| 1588 | * Replay. Do not regenerate message (and rebuild | ||
| 1589 | * paths, etc.); just use the original message. | ||
| 1590 | * Rebuilding paths will break for renames because | ||
| 1591 | * d_move mangles the src name. | ||
| 1592 | */ | ||
| 1593 | msg = req->r_request; | ||
| 1594 | rhead = msg->front.iov_base; | ||
| 1595 | |||
| 1596 | flags = le32_to_cpu(rhead->flags); | ||
| 1597 | flags |= CEPH_MDS_FLAG_REPLAY; | ||
| 1598 | rhead->flags = cpu_to_le32(flags); | ||
| 1599 | |||
| 1600 | if (req->r_target_inode) | ||
| 1601 | rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); | ||
| 1602 | |||
| 1603 | rhead->num_retry = req->r_attempts - 1; | ||
| 1604 | |||
| 1605 | /* remove cap/dentry releases from message */ | ||
| 1606 | rhead->num_releases = 0; | ||
| 1607 | msg->hdr.front_len = cpu_to_le32(req->r_request_release_offset); | ||
| 1608 | msg->front.iov_len = req->r_request_release_offset; | ||
| 1609 | return 0; | ||
| 1610 | } | ||
| 1611 | |||
| 1583 | if (req->r_request) { | 1612 | if (req->r_request) { |
| 1584 | ceph_msg_put(req->r_request); | 1613 | ceph_msg_put(req->r_request); |
| 1585 | req->r_request = NULL; | 1614 | req->r_request = NULL; |
| @@ -1601,13 +1630,9 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc, | |||
| 1601 | rhead->flags = cpu_to_le32(flags); | 1630 | rhead->flags = cpu_to_le32(flags); |
| 1602 | rhead->num_fwd = req->r_num_fwd; | 1631 | rhead->num_fwd = req->r_num_fwd; |
| 1603 | rhead->num_retry = req->r_attempts - 1; | 1632 | rhead->num_retry = req->r_attempts - 1; |
| 1633 | rhead->ino = 0; | ||
| 1604 | 1634 | ||
| 1605 | dout(" r_locked_dir = %p\n", req->r_locked_dir); | 1635 | dout(" r_locked_dir = %p\n", req->r_locked_dir); |
| 1606 | |||
| 1607 | if (req->r_target_inode && req->r_got_unsafe) | ||
| 1608 | rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode)); | ||
| 1609 | else | ||
| 1610 | rhead->ino = 0; | ||
| 1611 | return 0; | 1636 | return 0; |
| 1612 | } | 1637 | } |
| 1613 | 1638 | ||
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index b292fa42a66d..952410c60d09 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
| @@ -188,6 +188,7 @@ struct ceph_mds_request { | |||
| 188 | int r_old_inode_drop, r_old_inode_unless; | 188 | int r_old_inode_drop, r_old_inode_unless; |
| 189 | 189 | ||
| 190 | struct ceph_msg *r_request; /* original request */ | 190 | struct ceph_msg *r_request; /* original request */ |
| 191 | int r_request_release_offset; | ||
| 191 | struct ceph_msg *r_reply; | 192 | struct ceph_msg *r_reply; |
| 192 | struct ceph_mds_reply_info_parsed r_reply_info; | 193 | struct ceph_mds_reply_info_parsed r_reply_info; |
| 193 | int r_err; | 194 | int r_err; |
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c index 9ad43a310a41..15167b2daa55 100644 --- a/fs/ceph/messenger.c +++ b/fs/ceph/messenger.c | |||
| @@ -43,7 +43,8 @@ static void ceph_fault(struct ceph_connection *con); | |||
| 43 | * nicely render a sockaddr as a string. | 43 | * nicely render a sockaddr as a string. |
| 44 | */ | 44 | */ |
| 45 | #define MAX_ADDR_STR 20 | 45 | #define MAX_ADDR_STR 20 |
| 46 | static char addr_str[MAX_ADDR_STR][40]; | 46 | #define MAX_ADDR_STR_LEN 60 |
| 47 | static char addr_str[MAX_ADDR_STR][MAX_ADDR_STR_LEN]; | ||
| 47 | static DEFINE_SPINLOCK(addr_str_lock); | 48 | static DEFINE_SPINLOCK(addr_str_lock); |
| 48 | static int last_addr_str; | 49 | static int last_addr_str; |
| 49 | 50 | ||
| @@ -52,7 +53,6 @@ const char *pr_addr(const struct sockaddr_storage *ss) | |||
| 52 | int i; | 53 | int i; |
| 53 | char *s; | 54 | char *s; |
| 54 | struct sockaddr_in *in4 = (void *)ss; | 55 | struct sockaddr_in *in4 = (void *)ss; |
| 55 | unsigned char *quad = (void *)&in4->sin_addr.s_addr; | ||
| 56 | struct sockaddr_in6 *in6 = (void *)ss; | 56 | struct sockaddr_in6 *in6 = (void *)ss; |
| 57 | 57 | ||
| 58 | spin_lock(&addr_str_lock); | 58 | spin_lock(&addr_str_lock); |
| @@ -64,25 +64,13 @@ const char *pr_addr(const struct sockaddr_storage *ss) | |||
| 64 | 64 | ||
| 65 | switch (ss->ss_family) { | 65 | switch (ss->ss_family) { |
| 66 | case AF_INET: | 66 | case AF_INET: |
| 67 | sprintf(s, "%u.%u.%u.%u:%u", | 67 | snprintf(s, MAX_ADDR_STR_LEN, "%pI4:%u", &in4->sin_addr, |
| 68 | (unsigned int)quad[0], | 68 | (unsigned int)ntohs(in4->sin_port)); |
| 69 | (unsigned int)quad[1], | ||
| 70 | (unsigned int)quad[2], | ||
| 71 | (unsigned int)quad[3], | ||
| 72 | (unsigned int)ntohs(in4->sin_port)); | ||
| 73 | break; | 69 | break; |
| 74 | 70 | ||
| 75 | case AF_INET6: | 71 | case AF_INET6: |
| 76 | sprintf(s, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%u", | 72 | snprintf(s, MAX_ADDR_STR_LEN, "[%pI6c]:%u", &in6->sin6_addr, |
| 77 | in6->sin6_addr.s6_addr16[0], | 73 | (unsigned int)ntohs(in6->sin6_port)); |
| 78 | in6->sin6_addr.s6_addr16[1], | ||
| 79 | in6->sin6_addr.s6_addr16[2], | ||
| 80 | in6->sin6_addr.s6_addr16[3], | ||
| 81 | in6->sin6_addr.s6_addr16[4], | ||
| 82 | in6->sin6_addr.s6_addr16[5], | ||
| 83 | in6->sin6_addr.s6_addr16[6], | ||
| 84 | in6->sin6_addr.s6_addr16[7], | ||
| 85 | (unsigned int)ntohs(in6->sin6_port)); | ||
| 86 | break; | 74 | break; |
| 87 | 75 | ||
| 88 | default: | 76 | default: |
| @@ -215,12 +203,13 @@ static void set_sock_callbacks(struct socket *sock, | |||
| 215 | */ | 203 | */ |
| 216 | static struct socket *ceph_tcp_connect(struct ceph_connection *con) | 204 | static struct socket *ceph_tcp_connect(struct ceph_connection *con) |
| 217 | { | 205 | { |
| 218 | struct sockaddr *paddr = (struct sockaddr *)&con->peer_addr.in_addr; | 206 | struct sockaddr_storage *paddr = &con->peer_addr.in_addr; |
| 219 | struct socket *sock; | 207 | struct socket *sock; |
| 220 | int ret; | 208 | int ret; |
| 221 | 209 | ||
| 222 | BUG_ON(con->sock); | 210 | BUG_ON(con->sock); |
| 223 | ret = sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); | 211 | ret = sock_create_kern(con->peer_addr.in_addr.ss_family, SOCK_STREAM, |
| 212 | IPPROTO_TCP, &sock); | ||
| 224 | if (ret) | 213 | if (ret) |
| 225 | return ERR_PTR(ret); | 214 | return ERR_PTR(ret); |
| 226 | con->sock = sock; | 215 | con->sock = sock; |
| @@ -234,7 +223,8 @@ static struct socket *ceph_tcp_connect(struct ceph_connection *con) | |||
| 234 | 223 | ||
| 235 | dout("connect %s\n", pr_addr(&con->peer_addr.in_addr)); | 224 | dout("connect %s\n", pr_addr(&con->peer_addr.in_addr)); |
| 236 | 225 | ||
| 237 | ret = sock->ops->connect(sock, paddr, sizeof(*paddr), O_NONBLOCK); | 226 | ret = sock->ops->connect(sock, (struct sockaddr *)paddr, sizeof(*paddr), |
| 227 | O_NONBLOCK); | ||
| 238 | if (ret == -EINPROGRESS) { | 228 | if (ret == -EINPROGRESS) { |
| 239 | dout("connect %s EINPROGRESS sk_state = %u\n", | 229 | dout("connect %s EINPROGRESS sk_state = %u\n", |
| 240 | pr_addr(&con->peer_addr.in_addr), | 230 | pr_addr(&con->peer_addr.in_addr), |
| @@ -1009,19 +999,32 @@ int ceph_parse_ips(const char *c, const char *end, | |||
| 1009 | struct sockaddr_in *in4 = (void *)ss; | 999 | struct sockaddr_in *in4 = (void *)ss; |
| 1010 | struct sockaddr_in6 *in6 = (void *)ss; | 1000 | struct sockaddr_in6 *in6 = (void *)ss; |
| 1011 | int port; | 1001 | int port; |
| 1002 | char delim = ','; | ||
| 1003 | |||
| 1004 | if (*p == '[') { | ||
| 1005 | delim = ']'; | ||
| 1006 | p++; | ||
| 1007 | } | ||
| 1012 | 1008 | ||
| 1013 | memset(ss, 0, sizeof(*ss)); | 1009 | memset(ss, 0, sizeof(*ss)); |
| 1014 | if (in4_pton(p, end - p, (u8 *)&in4->sin_addr.s_addr, | 1010 | if (in4_pton(p, end - p, (u8 *)&in4->sin_addr.s_addr, |
| 1015 | ',', &ipend)) { | 1011 | delim, &ipend)) |
| 1016 | ss->ss_family = AF_INET; | 1012 | ss->ss_family = AF_INET; |
| 1017 | } else if (in6_pton(p, end - p, (u8 *)&in6->sin6_addr.s6_addr, | 1013 | else if (in6_pton(p, end - p, (u8 *)&in6->sin6_addr.s6_addr, |
| 1018 | ',', &ipend)) { | 1014 | delim, &ipend)) |
| 1019 | ss->ss_family = AF_INET6; | 1015 | ss->ss_family = AF_INET6; |
| 1020 | } else { | 1016 | else |
| 1021 | goto bad; | 1017 | goto bad; |
| 1022 | } | ||
| 1023 | p = ipend; | 1018 | p = ipend; |
| 1024 | 1019 | ||
| 1020 | if (delim == ']') { | ||
| 1021 | if (*p != ']') { | ||
| 1022 | dout("missing matching ']'\n"); | ||
| 1023 | goto bad; | ||
| 1024 | } | ||
| 1025 | p++; | ||
| 1026 | } | ||
| 1027 | |||
| 1025 | /* port? */ | 1028 | /* port? */ |
| 1026 | if (p < end && *p == ':') { | 1029 | if (p < end && *p == ':') { |
| 1027 | port = 0; | 1030 | port = 0; |
| @@ -1055,7 +1058,7 @@ int ceph_parse_ips(const char *c, const char *end, | |||
| 1055 | return 0; | 1058 | return 0; |
| 1056 | 1059 | ||
| 1057 | bad: | 1060 | bad: |
| 1058 | pr_err("parse_ips bad ip '%s'\n", c); | 1061 | pr_err("parse_ips bad ip '%.*s'\n", (int)(end - c), c); |
| 1059 | return -EINVAL; | 1062 | return -EINVAL; |
| 1060 | } | 1063 | } |
| 1061 | 1064 | ||
| @@ -2015,20 +2018,20 @@ void ceph_con_revoke(struct ceph_connection *con, struct ceph_msg *msg) | |||
| 2015 | { | 2018 | { |
| 2016 | mutex_lock(&con->mutex); | 2019 | mutex_lock(&con->mutex); |
| 2017 | if (!list_empty(&msg->list_head)) { | 2020 | if (!list_empty(&msg->list_head)) { |
| 2018 | dout("con_revoke %p msg %p\n", con, msg); | 2021 | dout("con_revoke %p msg %p - was on queue\n", con, msg); |
| 2019 | list_del_init(&msg->list_head); | 2022 | list_del_init(&msg->list_head); |
| 2020 | ceph_msg_put(msg); | 2023 | ceph_msg_put(msg); |
| 2021 | msg->hdr.seq = 0; | 2024 | msg->hdr.seq = 0; |
| 2022 | if (con->out_msg == msg) { | 2025 | } |
| 2023 | ceph_msg_put(con->out_msg); | 2026 | if (con->out_msg == msg) { |
| 2024 | con->out_msg = NULL; | 2027 | dout("con_revoke %p msg %p - was sending\n", con, msg); |
| 2025 | } | 2028 | con->out_msg = NULL; |
| 2026 | if (con->out_kvec_is_msg) { | 2029 | if (con->out_kvec_is_msg) { |
| 2027 | con->out_skip = con->out_kvec_bytes; | 2030 | con->out_skip = con->out_kvec_bytes; |
| 2028 | con->out_kvec_is_msg = false; | 2031 | con->out_kvec_is_msg = false; |
| 2029 | } | 2032 | } |
| 2030 | } else { | 2033 | ceph_msg_put(msg); |
| 2031 | dout("con_revoke %p msg %p - not queued (sent?)\n", con, msg); | 2034 | msg->hdr.seq = 0; |
| 2032 | } | 2035 | } |
| 2033 | mutex_unlock(&con->mutex); | 2036 | mutex_unlock(&con->mutex); |
| 2034 | } | 2037 | } |
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 50ce64ebd330..277f8b339577 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
| @@ -568,6 +568,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | |||
| 568 | if (ev > CEPH_PG_POOL_VERSION) { | 568 | if (ev > CEPH_PG_POOL_VERSION) { |
| 569 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", | 569 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", |
| 570 | ev, CEPH_PG_POOL_VERSION); | 570 | ev, CEPH_PG_POOL_VERSION); |
| 571 | kfree(pi); | ||
| 571 | goto bad; | 572 | goto bad; |
| 572 | } | 573 | } |
| 573 | __decode_pool(p, pi); | 574 | __decode_pool(p, pi); |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 484e52bb40bb..2cb1a70214d7 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -923,7 +923,7 @@ init_cifs(void) | |||
| 923 | goto out_unregister_filesystem; | 923 | goto out_unregister_filesystem; |
| 924 | #endif | 924 | #endif |
| 925 | #ifdef CONFIG_CIFS_DFS_UPCALL | 925 | #ifdef CONFIG_CIFS_DFS_UPCALL |
| 926 | rc = register_key_type(&key_type_dns_resolver); | 926 | rc = cifs_init_dns_resolver(); |
| 927 | if (rc) | 927 | if (rc) |
| 928 | goto out_unregister_key_type; | 928 | goto out_unregister_key_type; |
| 929 | #endif | 929 | #endif |
| @@ -935,7 +935,7 @@ init_cifs(void) | |||
| 935 | 935 | ||
| 936 | out_unregister_resolver_key: | 936 | out_unregister_resolver_key: |
| 937 | #ifdef CONFIG_CIFS_DFS_UPCALL | 937 | #ifdef CONFIG_CIFS_DFS_UPCALL |
| 938 | unregister_key_type(&key_type_dns_resolver); | 938 | cifs_exit_dns_resolver(); |
| 939 | out_unregister_key_type: | 939 | out_unregister_key_type: |
| 940 | #endif | 940 | #endif |
| 941 | #ifdef CONFIG_CIFS_UPCALL | 941 | #ifdef CONFIG_CIFS_UPCALL |
| @@ -961,7 +961,7 @@ exit_cifs(void) | |||
| 961 | cifs_proc_clean(); | 961 | cifs_proc_clean(); |
| 962 | #ifdef CONFIG_CIFS_DFS_UPCALL | 962 | #ifdef CONFIG_CIFS_DFS_UPCALL |
| 963 | cifs_dfs_release_automount_timer(); | 963 | cifs_dfs_release_automount_timer(); |
| 964 | unregister_key_type(&key_type_dns_resolver); | 964 | cifs_exit_dns_resolver(); |
| 965 | #endif | 965 | #endif |
| 966 | #ifdef CONFIG_CIFS_UPCALL | 966 | #ifdef CONFIG_CIFS_UPCALL |
| 967 | unregister_key_type(&cifs_spnego_key_type); | 967 | unregister_key_type(&cifs_spnego_key_type); |
diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c index 4db2c5e7283f..49315cbf742d 100644 --- a/fs/cifs/dns_resolve.c +++ b/fs/cifs/dns_resolve.c | |||
| @@ -24,12 +24,16 @@ | |||
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
| 27 | #include <linux/keyctl.h> | ||
| 28 | #include <linux/key-type.h> | ||
| 27 | #include <keys/user-type.h> | 29 | #include <keys/user-type.h> |
| 28 | #include "dns_resolve.h" | 30 | #include "dns_resolve.h" |
| 29 | #include "cifsglob.h" | 31 | #include "cifsglob.h" |
| 30 | #include "cifsproto.h" | 32 | #include "cifsproto.h" |
| 31 | #include "cifs_debug.h" | 33 | #include "cifs_debug.h" |
| 32 | 34 | ||
| 35 | static const struct cred *dns_resolver_cache; | ||
| 36 | |||
| 33 | /* Checks if supplied name is IP address | 37 | /* Checks if supplied name is IP address |
| 34 | * returns: | 38 | * returns: |
| 35 | * 1 - name is IP | 39 | * 1 - name is IP |
| @@ -94,6 +98,7 @@ struct key_type key_type_dns_resolver = { | |||
| 94 | int | 98 | int |
| 95 | dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | 99 | dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) |
| 96 | { | 100 | { |
| 101 | const struct cred *saved_cred; | ||
| 97 | int rc = -EAGAIN; | 102 | int rc = -EAGAIN; |
| 98 | struct key *rkey = ERR_PTR(-EAGAIN); | 103 | struct key *rkey = ERR_PTR(-EAGAIN); |
| 99 | char *name; | 104 | char *name; |
| @@ -133,8 +138,15 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | |||
| 133 | goto skip_upcall; | 138 | goto skip_upcall; |
| 134 | } | 139 | } |
| 135 | 140 | ||
| 141 | saved_cred = override_creds(dns_resolver_cache); | ||
| 136 | rkey = request_key(&key_type_dns_resolver, name, ""); | 142 | rkey = request_key(&key_type_dns_resolver, name, ""); |
| 143 | revert_creds(saved_cred); | ||
| 137 | if (!IS_ERR(rkey)) { | 144 | if (!IS_ERR(rkey)) { |
| 145 | if (!(rkey->perm & KEY_USR_VIEW)) { | ||
| 146 | down_read(&rkey->sem); | ||
| 147 | rkey->perm |= KEY_USR_VIEW; | ||
| 148 | up_read(&rkey->sem); | ||
| 149 | } | ||
| 138 | len = rkey->type_data.x[0]; | 150 | len = rkey->type_data.x[0]; |
| 139 | data = rkey->payload.data; | 151 | data = rkey->payload.data; |
| 140 | } else { | 152 | } else { |
| @@ -165,4 +177,61 @@ out: | |||
| 165 | return rc; | 177 | return rc; |
| 166 | } | 178 | } |
| 167 | 179 | ||
| 180 | int __init cifs_init_dns_resolver(void) | ||
| 181 | { | ||
| 182 | struct cred *cred; | ||
| 183 | struct key *keyring; | ||
| 184 | int ret; | ||
| 185 | |||
| 186 | printk(KERN_NOTICE "Registering the %s key type\n", | ||
| 187 | key_type_dns_resolver.name); | ||
| 188 | |||
| 189 | /* create an override credential set with a special thread keyring in | ||
| 190 | * which DNS requests are cached | ||
| 191 | * | ||
| 192 | * this is used to prevent malicious redirections from being installed | ||
| 193 | * with add_key(). | ||
| 194 | */ | ||
| 195 | cred = prepare_kernel_cred(NULL); | ||
| 196 | if (!cred) | ||
| 197 | return -ENOMEM; | ||
| 198 | |||
| 199 | keyring = key_alloc(&key_type_keyring, ".dns_resolver", 0, 0, cred, | ||
| 200 | (KEY_POS_ALL & ~KEY_POS_SETATTR) | | ||
| 201 | KEY_USR_VIEW | KEY_USR_READ, | ||
| 202 | KEY_ALLOC_NOT_IN_QUOTA); | ||
| 203 | if (IS_ERR(keyring)) { | ||
| 204 | ret = PTR_ERR(keyring); | ||
| 205 | goto failed_put_cred; | ||
| 206 | } | ||
| 207 | |||
| 208 | ret = key_instantiate_and_link(keyring, NULL, 0, NULL, NULL); | ||
| 209 | if (ret < 0) | ||
| 210 | goto failed_put_key; | ||
| 211 | |||
| 212 | ret = register_key_type(&key_type_dns_resolver); | ||
| 213 | if (ret < 0) | ||
| 214 | goto failed_put_key; | ||
| 215 | |||
| 216 | /* instruct request_key() to use this special keyring as a cache for | ||
| 217 | * the results it looks up */ | ||
| 218 | cred->thread_keyring = keyring; | ||
| 219 | cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING; | ||
| 220 | dns_resolver_cache = cred; | ||
| 221 | return 0; | ||
| 222 | |||
| 223 | failed_put_key: | ||
| 224 | key_put(keyring); | ||
| 225 | failed_put_cred: | ||
| 226 | put_cred(cred); | ||
| 227 | return ret; | ||
| 228 | } | ||
| 168 | 229 | ||
| 230 | void __exit cifs_exit_dns_resolver(void) | ||
| 231 | { | ||
| 232 | key_revoke(dns_resolver_cache->thread_keyring); | ||
| 233 | unregister_key_type(&key_type_dns_resolver); | ||
| 234 | put_cred(dns_resolver_cache); | ||
| 235 | printk(KERN_NOTICE "Unregistered %s key type\n", | ||
| 236 | key_type_dns_resolver.name); | ||
| 237 | } | ||
diff --git a/fs/cifs/dns_resolve.h b/fs/cifs/dns_resolve.h index 966e9288930b..26b9eaa9f5ee 100644 --- a/fs/cifs/dns_resolve.h +++ b/fs/cifs/dns_resolve.h | |||
| @@ -24,8 +24,8 @@ | |||
| 24 | #define _DNS_RESOLVE_H | 24 | #define _DNS_RESOLVE_H |
| 25 | 25 | ||
| 26 | #ifdef __KERNEL__ | 26 | #ifdef __KERNEL__ |
| 27 | #include <linux/key-type.h> | 27 | extern int __init cifs_init_dns_resolver(void); |
| 28 | extern struct key_type key_type_dns_resolver; | 28 | extern void __exit cifs_exit_dns_resolver(void); |
| 29 | extern int dns_resolve_server_name_to_ip(const char *unc, char **ip_addr); | 29 | extern int dns_resolve_server_name_to_ip(const char *unc, char **ip_addr); |
| 30 | #endif /* KERNEL */ | 30 | #endif /* KERNEL */ |
| 31 | 31 | ||
diff --git a/fs/dcache.c b/fs/dcache.c index c8c78ba07827..86d4db15473e 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -896,7 +896,7 @@ EXPORT_SYMBOL(shrink_dcache_parent); | |||
| 896 | * | 896 | * |
| 897 | * In this case we return -1 to tell the caller that we baled. | 897 | * In this case we return -1 to tell the caller that we baled. |
| 898 | */ | 898 | */ |
| 899 | static int shrink_dcache_memory(int nr, gfp_t gfp_mask) | 899 | static int shrink_dcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
| 900 | { | 900 | { |
| 901 | if (nr) { | 901 | if (nr) { |
| 902 | if (!(gfp_mask & __GFP_FS)) | 902 | if (!(gfp_mask & __GFP_FS)) |
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index dbab3fdc2582..0898f3ec8212 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
| @@ -1358,7 +1358,7 @@ void gfs2_glock_complete(struct gfs2_glock *gl, int ret) | |||
| 1358 | } | 1358 | } |
| 1359 | 1359 | ||
| 1360 | 1360 | ||
| 1361 | static int gfs2_shrink_glock_memory(int nr, gfp_t gfp_mask) | 1361 | static int gfs2_shrink_glock_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
| 1362 | { | 1362 | { |
| 1363 | struct gfs2_glock *gl; | 1363 | struct gfs2_glock *gl; |
| 1364 | int may_demote; | 1364 | int may_demote; |
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index b256d6f24288..8f02d3db8f42 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
| @@ -77,7 +77,7 @@ static LIST_HEAD(qd_lru_list); | |||
| 77 | static atomic_t qd_lru_count = ATOMIC_INIT(0); | 77 | static atomic_t qd_lru_count = ATOMIC_INIT(0); |
| 78 | static DEFINE_SPINLOCK(qd_lru_lock); | 78 | static DEFINE_SPINLOCK(qd_lru_lock); |
| 79 | 79 | ||
| 80 | int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask) | 80 | int gfs2_shrink_qd_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
| 81 | { | 81 | { |
| 82 | struct gfs2_quota_data *qd; | 82 | struct gfs2_quota_data *qd; |
| 83 | struct gfs2_sbd *sdp; | 83 | struct gfs2_sbd *sdp; |
diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h index 195f60c8bd14..e7d236ca48bd 100644 --- a/fs/gfs2/quota.h +++ b/fs/gfs2/quota.h | |||
| @@ -51,7 +51,7 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip) | |||
| 51 | return ret; | 51 | return ret; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | extern int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask); | 54 | extern int gfs2_shrink_qd_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask); |
| 55 | extern const struct quotactl_ops gfs2_quotactl_ops; | 55 | extern const struct quotactl_ops gfs2_quotactl_ops; |
| 56 | 56 | ||
| 57 | #endif /* __QUOTA_DOT_H__ */ | 57 | #endif /* __QUOTA_DOT_H__ */ |
diff --git a/fs/inode.c b/fs/inode.c index 2bee20ae3d65..722860b323a9 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -512,7 +512,7 @@ static void prune_icache(int nr_to_scan) | |||
| 512 | * This function is passed the number of inodes to scan, and it returns the | 512 | * This function is passed the number of inodes to scan, and it returns the |
| 513 | * total number of remaining possibly-reclaimable inodes. | 513 | * total number of remaining possibly-reclaimable inodes. |
| 514 | */ | 514 | */ |
| 515 | static int shrink_icache_memory(int nr, gfp_t gfp_mask) | 515 | static int shrink_icache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
| 516 | { | 516 | { |
| 517 | if (nr) { | 517 | if (nr) { |
| 518 | /* | 518 | /* |
diff --git a/fs/jffs2/xattr.c b/fs/jffs2/xattr.c index a2d58c96f1b4..d258e261bdc7 100644 --- a/fs/jffs2/xattr.c +++ b/fs/jffs2/xattr.c | |||
| @@ -626,7 +626,7 @@ void jffs2_xattr_free_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *i | |||
| 626 | 626 | ||
| 627 | static int check_xattr_ref_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic) | 627 | static int check_xattr_ref_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic) |
| 628 | { | 628 | { |
| 629 | /* success of check_xattr_ref_inode() means taht inode (ic) dose not have | 629 | /* success of check_xattr_ref_inode() means that inode (ic) dose not have |
| 630 | * duplicate name/value pairs. If duplicate name/value pair would be found, | 630 | * duplicate name/value pairs. If duplicate name/value pair would be found, |
| 631 | * one will be removed. | 631 | * one will be removed. |
| 632 | */ | 632 | */ |
diff --git a/fs/mbcache.c b/fs/mbcache.c index ec88ff3d04a9..e28f21b95344 100644 --- a/fs/mbcache.c +++ b/fs/mbcache.c | |||
| @@ -115,7 +115,7 @@ mb_cache_indexes(struct mb_cache *cache) | |||
| 115 | * What the mbcache registers as to get shrunk dynamically. | 115 | * What the mbcache registers as to get shrunk dynamically. |
| 116 | */ | 116 | */ |
| 117 | 117 | ||
| 118 | static int mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask); | 118 | static int mb_cache_shrink_fn(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask); |
| 119 | 119 | ||
| 120 | static struct shrinker mb_cache_shrinker = { | 120 | static struct shrinker mb_cache_shrinker = { |
| 121 | .shrink = mb_cache_shrink_fn, | 121 | .shrink = mb_cache_shrink_fn, |
| @@ -191,13 +191,14 @@ forget: | |||
| 191 | * This function is called by the kernel memory management when memory | 191 | * This function is called by the kernel memory management when memory |
| 192 | * gets low. | 192 | * gets low. |
| 193 | * | 193 | * |
| 194 | * @shrink: (ignored) | ||
| 194 | * @nr_to_scan: Number of objects to scan | 195 | * @nr_to_scan: Number of objects to scan |
| 195 | * @gfp_mask: (ignored) | 196 | * @gfp_mask: (ignored) |
| 196 | * | 197 | * |
| 197 | * Returns the number of objects which are present in the cache. | 198 | * Returns the number of objects which are present in the cache. |
| 198 | */ | 199 | */ |
| 199 | static int | 200 | static int |
| 200 | mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask) | 201 | mb_cache_shrink_fn(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) |
| 201 | { | 202 | { |
| 202 | LIST_HEAD(free_list); | 203 | LIST_HEAD(free_list); |
| 203 | struct list_head *l, *ltmp; | 204 | struct list_head *l, *ltmp; |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 782b431ef91c..e60416d3f818 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -1710,7 +1710,7 @@ static void nfs_access_free_list(struct list_head *head) | |||
| 1710 | } | 1710 | } |
| 1711 | } | 1711 | } |
| 1712 | 1712 | ||
| 1713 | int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) | 1713 | int nfs_access_cache_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) |
| 1714 | { | 1714 | { |
| 1715 | LIST_HEAD(head); | 1715 | LIST_HEAD(head); |
| 1716 | struct nfs_inode *nfsi; | 1716 | struct nfs_inode *nfsi; |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index d8bd619e386c..e70f44b9b3f4 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
| @@ -205,7 +205,8 @@ extern struct rpc_procinfo nfs4_procedures[]; | |||
| 205 | void nfs_close_context(struct nfs_open_context *ctx, int is_sync); | 205 | void nfs_close_context(struct nfs_open_context *ctx, int is_sync); |
| 206 | 206 | ||
| 207 | /* dir.c */ | 207 | /* dir.c */ |
| 208 | extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask); | 208 | extern int nfs_access_cache_shrinker(struct shrinker *shrink, |
| 209 | int nr_to_scan, gfp_t gfp_mask); | ||
| 209 | 210 | ||
| 210 | /* inode.c */ | 211 | /* inode.c */ |
| 211 | extern struct workqueue_struct *nfsiod_workqueue; | 212 | extern struct workqueue_struct *nfsiod_workqueue; |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 12c233da1b6b..437d2ca2de97 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -676,7 +676,7 @@ static void prune_dqcache(int count) | |||
| 676 | * This is called from kswapd when we think we need some | 676 | * This is called from kswapd when we think we need some |
| 677 | * more memory | 677 | * more memory |
| 678 | */ | 678 | */ |
| 679 | static int shrink_dqcache_memory(int nr, gfp_t gfp_mask) | 679 | static int shrink_dqcache_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
| 680 | { | 680 | { |
| 681 | if (nr) { | 681 | if (nr) { |
| 682 | spin_lock(&dq_list_lock); | 682 | spin_lock(&dq_list_lock); |
diff --git a/fs/ubifs/shrinker.c b/fs/ubifs/shrinker.c index 02feb59cefca..0b201114a5ad 100644 --- a/fs/ubifs/shrinker.c +++ b/fs/ubifs/shrinker.c | |||
| @@ -277,7 +277,7 @@ static int kick_a_thread(void) | |||
| 277 | return 0; | 277 | return 0; |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | int ubifs_shrinker(int nr, gfp_t gfp_mask) | 280 | int ubifs_shrinker(struct shrinker *shrink, int nr, gfp_t gfp_mask) |
| 281 | { | 281 | { |
| 282 | int freed, contention = 0; | 282 | int freed, contention = 0; |
| 283 | long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); | 283 | long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index 2eef553d50c8..04310878f449 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
| @@ -1575,7 +1575,7 @@ int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot); | |||
| 1575 | int ubifs_tnc_end_commit(struct ubifs_info *c); | 1575 | int ubifs_tnc_end_commit(struct ubifs_info *c); |
| 1576 | 1576 | ||
| 1577 | /* shrinker.c */ | 1577 | /* shrinker.c */ |
| 1578 | int ubifs_shrinker(int nr_to_scan, gfp_t gfp_mask); | 1578 | int ubifs_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask); |
| 1579 | 1579 | ||
| 1580 | /* commit.c */ | 1580 | /* commit.c */ |
| 1581 | int ubifs_bg_thread(void *info); | 1581 | int ubifs_bg_thread(void *info); |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 649ade8ef598..2ee3f7a60163 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -45,7 +45,7 @@ | |||
| 45 | 45 | ||
| 46 | static kmem_zone_t *xfs_buf_zone; | 46 | static kmem_zone_t *xfs_buf_zone; |
| 47 | STATIC int xfsbufd(void *); | 47 | STATIC int xfsbufd(void *); |
| 48 | STATIC int xfsbufd_wakeup(int, gfp_t); | 48 | STATIC int xfsbufd_wakeup(struct shrinker *, int, gfp_t); |
| 49 | STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); | 49 | STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); |
| 50 | static struct shrinker xfs_buf_shake = { | 50 | static struct shrinker xfs_buf_shake = { |
| 51 | .shrink = xfsbufd_wakeup, | 51 | .shrink = xfsbufd_wakeup, |
| @@ -340,7 +340,7 @@ _xfs_buf_lookup_pages( | |||
| 340 | __func__, gfp_mask); | 340 | __func__, gfp_mask); |
| 341 | 341 | ||
| 342 | XFS_STATS_INC(xb_page_retries); | 342 | XFS_STATS_INC(xb_page_retries); |
| 343 | xfsbufd_wakeup(0, gfp_mask); | 343 | xfsbufd_wakeup(NULL, 0, gfp_mask); |
| 344 | congestion_wait(BLK_RW_ASYNC, HZ/50); | 344 | congestion_wait(BLK_RW_ASYNC, HZ/50); |
| 345 | goto retry; | 345 | goto retry; |
| 346 | } | 346 | } |
| @@ -1762,6 +1762,7 @@ xfs_buf_runall_queues( | |||
| 1762 | 1762 | ||
| 1763 | STATIC int | 1763 | STATIC int |
| 1764 | xfsbufd_wakeup( | 1764 | xfsbufd_wakeup( |
| 1765 | struct shrinker *shrink, | ||
| 1765 | int priority, | 1766 | int priority, |
| 1766 | gfp_t mask) | 1767 | gfp_t mask) |
| 1767 | { | 1768 | { |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index f2d1718c9165..80938c736c27 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
| @@ -1883,7 +1883,6 @@ init_xfs_fs(void) | |||
| 1883 | goto out_cleanup_procfs; | 1883 | goto out_cleanup_procfs; |
| 1884 | 1884 | ||
| 1885 | vfs_initquota(); | 1885 | vfs_initquota(); |
| 1886 | xfs_inode_shrinker_init(); | ||
| 1887 | 1886 | ||
| 1888 | error = register_filesystem(&xfs_fs_type); | 1887 | error = register_filesystem(&xfs_fs_type); |
| 1889 | if (error) | 1888 | if (error) |
| @@ -1911,7 +1910,6 @@ exit_xfs_fs(void) | |||
| 1911 | { | 1910 | { |
| 1912 | vfs_exitquota(); | 1911 | vfs_exitquota(); |
| 1913 | unregister_filesystem(&xfs_fs_type); | 1912 | unregister_filesystem(&xfs_fs_type); |
| 1914 | xfs_inode_shrinker_destroy(); | ||
| 1915 | xfs_sysctl_unregister(); | 1913 | xfs_sysctl_unregister(); |
| 1916 | xfs_cleanup_procfs(); | 1914 | xfs_cleanup_procfs(); |
| 1917 | xfs_buf_terminate(); | 1915 | xfs_buf_terminate(); |
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index ef7f0218bccb..a51a07c3a70c 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
| @@ -144,6 +144,41 @@ restart: | |||
| 144 | return last_error; | 144 | return last_error; |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | /* | ||
| 148 | * Select the next per-ag structure to iterate during the walk. The reclaim | ||
| 149 | * walk is optimised only to walk AGs with reclaimable inodes in them. | ||
| 150 | */ | ||
| 151 | static struct xfs_perag * | ||
| 152 | xfs_inode_ag_iter_next_pag( | ||
| 153 | struct xfs_mount *mp, | ||
| 154 | xfs_agnumber_t *first, | ||
| 155 | int tag) | ||
| 156 | { | ||
| 157 | struct xfs_perag *pag = NULL; | ||
| 158 | |||
| 159 | if (tag == XFS_ICI_RECLAIM_TAG) { | ||
| 160 | int found; | ||
| 161 | int ref; | ||
| 162 | |||
| 163 | spin_lock(&mp->m_perag_lock); | ||
| 164 | found = radix_tree_gang_lookup_tag(&mp->m_perag_tree, | ||
| 165 | (void **)&pag, *first, 1, tag); | ||
| 166 | if (found <= 0) { | ||
| 167 | spin_unlock(&mp->m_perag_lock); | ||
| 168 | return NULL; | ||
| 169 | } | ||
| 170 | *first = pag->pag_agno + 1; | ||
| 171 | /* open coded pag reference increment */ | ||
| 172 | ref = atomic_inc_return(&pag->pag_ref); | ||
| 173 | spin_unlock(&mp->m_perag_lock); | ||
| 174 | trace_xfs_perag_get_reclaim(mp, pag->pag_agno, ref, _RET_IP_); | ||
| 175 | } else { | ||
| 176 | pag = xfs_perag_get(mp, *first); | ||
| 177 | (*first)++; | ||
| 178 | } | ||
| 179 | return pag; | ||
| 180 | } | ||
| 181 | |||
| 147 | int | 182 | int |
| 148 | xfs_inode_ag_iterator( | 183 | xfs_inode_ag_iterator( |
| 149 | struct xfs_mount *mp, | 184 | struct xfs_mount *mp, |
| @@ -154,16 +189,15 @@ xfs_inode_ag_iterator( | |||
| 154 | int exclusive, | 189 | int exclusive, |
| 155 | int *nr_to_scan) | 190 | int *nr_to_scan) |
| 156 | { | 191 | { |
| 192 | struct xfs_perag *pag; | ||
| 157 | int error = 0; | 193 | int error = 0; |
| 158 | int last_error = 0; | 194 | int last_error = 0; |
| 159 | xfs_agnumber_t ag; | 195 | xfs_agnumber_t ag; |
| 160 | int nr; | 196 | int nr; |
| 161 | 197 | ||
| 162 | nr = nr_to_scan ? *nr_to_scan : INT_MAX; | 198 | nr = nr_to_scan ? *nr_to_scan : INT_MAX; |
| 163 | for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { | 199 | ag = 0; |
| 164 | struct xfs_perag *pag; | 200 | while ((pag = xfs_inode_ag_iter_next_pag(mp, &ag, tag))) { |
| 165 | |||
| 166 | pag = xfs_perag_get(mp, ag); | ||
| 167 | error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, | 201 | error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, |
| 168 | exclusive, &nr); | 202 | exclusive, &nr); |
| 169 | xfs_perag_put(pag); | 203 | xfs_perag_put(pag); |
| @@ -640,6 +674,17 @@ __xfs_inode_set_reclaim_tag( | |||
| 640 | radix_tree_tag_set(&pag->pag_ici_root, | 674 | radix_tree_tag_set(&pag->pag_ici_root, |
| 641 | XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), | 675 | XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), |
| 642 | XFS_ICI_RECLAIM_TAG); | 676 | XFS_ICI_RECLAIM_TAG); |
| 677 | |||
| 678 | if (!pag->pag_ici_reclaimable) { | ||
| 679 | /* propagate the reclaim tag up into the perag radix tree */ | ||
| 680 | spin_lock(&ip->i_mount->m_perag_lock); | ||
| 681 | radix_tree_tag_set(&ip->i_mount->m_perag_tree, | ||
| 682 | XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), | ||
| 683 | XFS_ICI_RECLAIM_TAG); | ||
| 684 | spin_unlock(&ip->i_mount->m_perag_lock); | ||
| 685 | trace_xfs_perag_set_reclaim(ip->i_mount, pag->pag_agno, | ||
| 686 | -1, _RET_IP_); | ||
| 687 | } | ||
| 643 | pag->pag_ici_reclaimable++; | 688 | pag->pag_ici_reclaimable++; |
| 644 | } | 689 | } |
| 645 | 690 | ||
| @@ -674,6 +719,16 @@ __xfs_inode_clear_reclaim_tag( | |||
| 674 | radix_tree_tag_clear(&pag->pag_ici_root, | 719 | radix_tree_tag_clear(&pag->pag_ici_root, |
| 675 | XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); | 720 | XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); |
| 676 | pag->pag_ici_reclaimable--; | 721 | pag->pag_ici_reclaimable--; |
| 722 | if (!pag->pag_ici_reclaimable) { | ||
| 723 | /* clear the reclaim tag from the perag radix tree */ | ||
| 724 | spin_lock(&ip->i_mount->m_perag_lock); | ||
| 725 | radix_tree_tag_clear(&ip->i_mount->m_perag_tree, | ||
| 726 | XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), | ||
| 727 | XFS_ICI_RECLAIM_TAG); | ||
| 728 | spin_unlock(&ip->i_mount->m_perag_lock); | ||
| 729 | trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, | ||
| 730 | -1, _RET_IP_); | ||
| 731 | } | ||
| 677 | } | 732 | } |
| 678 | 733 | ||
| 679 | /* | 734 | /* |
| @@ -828,83 +883,52 @@ xfs_reclaim_inodes( | |||
| 828 | 883 | ||
| 829 | /* | 884 | /* |
| 830 | * Shrinker infrastructure. | 885 | * Shrinker infrastructure. |
| 831 | * | ||
| 832 | * This is all far more complex than it needs to be. It adds a global list of | ||
| 833 | * mounts because the shrinkers can only call a global context. We need to make | ||
| 834 | * the shrinkers pass a context to avoid the need for global state. | ||
| 835 | */ | 886 | */ |
| 836 | static LIST_HEAD(xfs_mount_list); | ||
| 837 | static struct rw_semaphore xfs_mount_list_lock; | ||
| 838 | |||
| 839 | static int | 887 | static int |
| 840 | xfs_reclaim_inode_shrink( | 888 | xfs_reclaim_inode_shrink( |
| 889 | struct shrinker *shrink, | ||
| 841 | int nr_to_scan, | 890 | int nr_to_scan, |
| 842 | gfp_t gfp_mask) | 891 | gfp_t gfp_mask) |
| 843 | { | 892 | { |
| 844 | struct xfs_mount *mp; | 893 | struct xfs_mount *mp; |
| 845 | struct xfs_perag *pag; | 894 | struct xfs_perag *pag; |
| 846 | xfs_agnumber_t ag; | 895 | xfs_agnumber_t ag; |
| 847 | int reclaimable = 0; | 896 | int reclaimable; |
| 848 | 897 | ||
| 898 | mp = container_of(shrink, struct xfs_mount, m_inode_shrink); | ||
| 849 | if (nr_to_scan) { | 899 | if (nr_to_scan) { |
| 850 | if (!(gfp_mask & __GFP_FS)) | 900 | if (!(gfp_mask & __GFP_FS)) |
| 851 | return -1; | 901 | return -1; |
| 852 | 902 | ||
| 853 | down_read(&xfs_mount_list_lock); | 903 | xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, |
| 854 | list_for_each_entry(mp, &xfs_mount_list, m_mplist) { | ||
| 855 | xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0, | ||
| 856 | XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); | 904 | XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan); |
| 857 | if (nr_to_scan <= 0) | 905 | /* if we don't exhaust the scan, don't bother coming back */ |
| 858 | break; | 906 | if (nr_to_scan > 0) |
| 859 | } | 907 | return -1; |
| 860 | up_read(&xfs_mount_list_lock); | 908 | } |
| 861 | } | ||
| 862 | 909 | ||
| 863 | down_read(&xfs_mount_list_lock); | 910 | reclaimable = 0; |
| 864 | list_for_each_entry(mp, &xfs_mount_list, m_mplist) { | 911 | ag = 0; |
| 865 | for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { | 912 | while ((pag = xfs_inode_ag_iter_next_pag(mp, &ag, |
| 866 | pag = xfs_perag_get(mp, ag); | 913 | XFS_ICI_RECLAIM_TAG))) { |
| 867 | reclaimable += pag->pag_ici_reclaimable; | 914 | reclaimable += pag->pag_ici_reclaimable; |
| 868 | xfs_perag_put(pag); | 915 | xfs_perag_put(pag); |
| 869 | } | ||
| 870 | } | 916 | } |
| 871 | up_read(&xfs_mount_list_lock); | ||
| 872 | return reclaimable; | 917 | return reclaimable; |
| 873 | } | 918 | } |
| 874 | 919 | ||
| 875 | static struct shrinker xfs_inode_shrinker = { | ||
| 876 | .shrink = xfs_reclaim_inode_shrink, | ||
| 877 | .seeks = DEFAULT_SEEKS, | ||
| 878 | }; | ||
| 879 | |||
| 880 | void __init | ||
| 881 | xfs_inode_shrinker_init(void) | ||
| 882 | { | ||
| 883 | init_rwsem(&xfs_mount_list_lock); | ||
| 884 | register_shrinker(&xfs_inode_shrinker); | ||
| 885 | } | ||
| 886 | |||
| 887 | void | ||
| 888 | xfs_inode_shrinker_destroy(void) | ||
| 889 | { | ||
| 890 | ASSERT(list_empty(&xfs_mount_list)); | ||
| 891 | unregister_shrinker(&xfs_inode_shrinker); | ||
| 892 | } | ||
| 893 | |||
| 894 | void | 920 | void |
| 895 | xfs_inode_shrinker_register( | 921 | xfs_inode_shrinker_register( |
| 896 | struct xfs_mount *mp) | 922 | struct xfs_mount *mp) |
| 897 | { | 923 | { |
| 898 | down_write(&xfs_mount_list_lock); | 924 | mp->m_inode_shrink.shrink = xfs_reclaim_inode_shrink; |
| 899 | list_add_tail(&mp->m_mplist, &xfs_mount_list); | 925 | mp->m_inode_shrink.seeks = DEFAULT_SEEKS; |
| 900 | up_write(&xfs_mount_list_lock); | 926 | register_shrinker(&mp->m_inode_shrink); |
| 901 | } | 927 | } |
| 902 | 928 | ||
| 903 | void | 929 | void |
| 904 | xfs_inode_shrinker_unregister( | 930 | xfs_inode_shrinker_unregister( |
| 905 | struct xfs_mount *mp) | 931 | struct xfs_mount *mp) |
| 906 | { | 932 | { |
| 907 | down_write(&xfs_mount_list_lock); | 933 | unregister_shrinker(&mp->m_inode_shrink); |
| 908 | list_del(&mp->m_mplist); | ||
| 909 | up_write(&xfs_mount_list_lock); | ||
| 910 | } | 934 | } |
diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index cdcbaaca9880..e28139aaa4aa 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h | |||
| @@ -55,8 +55,6 @@ int xfs_inode_ag_iterator(struct xfs_mount *mp, | |||
| 55 | int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), | 55 | int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), |
| 56 | int flags, int tag, int write_lock, int *nr_to_scan); | 56 | int flags, int tag, int write_lock, int *nr_to_scan); |
| 57 | 57 | ||
| 58 | void xfs_inode_shrinker_init(void); | ||
| 59 | void xfs_inode_shrinker_destroy(void); | ||
| 60 | void xfs_inode_shrinker_register(struct xfs_mount *mp); | 58 | void xfs_inode_shrinker_register(struct xfs_mount *mp); |
| 61 | void xfs_inode_shrinker_unregister(struct xfs_mount *mp); | 59 | void xfs_inode_shrinker_unregister(struct xfs_mount *mp); |
| 62 | 60 | ||
diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 73d5aa117384..302820690904 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h | |||
| @@ -124,7 +124,10 @@ DEFINE_EVENT(xfs_perag_class, name, \ | |||
| 124 | unsigned long caller_ip), \ | 124 | unsigned long caller_ip), \ |
| 125 | TP_ARGS(mp, agno, refcount, caller_ip)) | 125 | TP_ARGS(mp, agno, refcount, caller_ip)) |
| 126 | DEFINE_PERAG_REF_EVENT(xfs_perag_get); | 126 | DEFINE_PERAG_REF_EVENT(xfs_perag_get); |
| 127 | DEFINE_PERAG_REF_EVENT(xfs_perag_get_reclaim); | ||
| 127 | DEFINE_PERAG_REF_EVENT(xfs_perag_put); | 128 | DEFINE_PERAG_REF_EVENT(xfs_perag_put); |
| 129 | DEFINE_PERAG_REF_EVENT(xfs_perag_set_reclaim); | ||
| 130 | DEFINE_PERAG_REF_EVENT(xfs_perag_clear_reclaim); | ||
| 128 | 131 | ||
| 129 | TRACE_EVENT(xfs_attr_list_node_descend, | 132 | TRACE_EVENT(xfs_attr_list_node_descend, |
| 130 | TP_PROTO(struct xfs_attr_list_context *ctx, | 133 | TP_PROTO(struct xfs_attr_list_context *ctx, |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 8c117ff2e3ab..67c018392d62 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
| @@ -69,7 +69,7 @@ STATIC void xfs_qm_list_destroy(xfs_dqlist_t *); | |||
| 69 | 69 | ||
| 70 | STATIC int xfs_qm_init_quotainos(xfs_mount_t *); | 70 | STATIC int xfs_qm_init_quotainos(xfs_mount_t *); |
| 71 | STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); | 71 | STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); |
| 72 | STATIC int xfs_qm_shake(int, gfp_t); | 72 | STATIC int xfs_qm_shake(struct shrinker *, int, gfp_t); |
| 73 | 73 | ||
| 74 | static struct shrinker xfs_qm_shaker = { | 74 | static struct shrinker xfs_qm_shaker = { |
| 75 | .shrink = xfs_qm_shake, | 75 | .shrink = xfs_qm_shake, |
| @@ -2117,7 +2117,10 @@ xfs_qm_shake_freelist( | |||
| 2117 | */ | 2117 | */ |
| 2118 | /* ARGSUSED */ | 2118 | /* ARGSUSED */ |
| 2119 | STATIC int | 2119 | STATIC int |
| 2120 | xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask) | 2120 | xfs_qm_shake( |
| 2121 | struct shrinker *shrink, | ||
| 2122 | int nr_to_scan, | ||
| 2123 | gfp_t gfp_mask) | ||
| 2121 | { | 2124 | { |
| 2122 | int ndqused, nfree, n; | 2125 | int ndqused, nfree, n; |
| 2123 | 2126 | ||
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1d2c7eed4eda..5761087ee8ea 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
| @@ -259,7 +259,7 @@ typedef struct xfs_mount { | |||
| 259 | wait_queue_head_t m_wait_single_sync_task; | 259 | wait_queue_head_t m_wait_single_sync_task; |
| 260 | __int64_t m_update_flags; /* sb flags we need to update | 260 | __int64_t m_update_flags; /* sb flags we need to update |
| 261 | on the next remount,rw */ | 261 | on the next remount,rw */ |
| 262 | struct list_head m_mplist; /* inode shrinker mount list */ | 262 | struct shrinker m_inode_shrink; /* inode reclaim shrinker */ |
| 263 | } xfs_mount_t; | 263 | } xfs_mount_t; |
| 264 | 264 | ||
| 265 | /* | 265 | /* |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 8e5a9dfb76bf..e7445df44d6c 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
| @@ -873,6 +873,8 @@ struct fb_info { | |||
| 873 | static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | 873 | static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { |
| 874 | struct apertures_struct *a = kzalloc(sizeof(struct apertures_struct) | 874 | struct apertures_struct *a = kzalloc(sizeof(struct apertures_struct) |
| 875 | + max_num * sizeof(struct aperture), GFP_KERNEL); | 875 | + max_num * sizeof(struct aperture), GFP_KERNEL); |
| 876 | if (!a) | ||
| 877 | return NULL; | ||
| 876 | a->count = max_num; | 878 | a->count = max_num; |
| 877 | return a; | 879 | return a; |
| 878 | } | 880 | } |
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index 013dc529e95f..d147461bc271 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h | |||
| @@ -61,7 +61,8 @@ struct files_struct { | |||
| 61 | (rcu_dereference_check((fdtfd), \ | 61 | (rcu_dereference_check((fdtfd), \ |
| 62 | rcu_read_lock_held() || \ | 62 | rcu_read_lock_held() || \ |
| 63 | lockdep_is_held(&(files)->file_lock) || \ | 63 | lockdep_is_held(&(files)->file_lock) || \ |
| 64 | atomic_read(&(files)->count) == 1)) | 64 | atomic_read(&(files)->count) == 1 || \ |
| 65 | rcu_my_thread_group_empty())) | ||
| 65 | 66 | ||
| 66 | #define files_fdtable(files) \ | 67 | #define files_fdtable(files) \ |
| 67 | (rcu_dereference_check_fdtable((files), (files)->fdt)) | 68 | (rcu_dereference_check_fdtable((files), (files)->fdt)) |
diff --git a/include/linux/mm.h b/include/linux/mm.h index b969efb03787..a2b48041b910 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -999,7 +999,7 @@ static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm) | |||
| 999 | * querying the cache size, so a fastpath for that case is appropriate. | 999 | * querying the cache size, so a fastpath for that case is appropriate. |
| 1000 | */ | 1000 | */ |
| 1001 | struct shrinker { | 1001 | struct shrinker { |
| 1002 | int (*shrink)(int nr_to_scan, gfp_t gfp_mask); | 1002 | int (*shrink)(struct shrinker *, int nr_to_scan, gfp_t gfp_mask); |
| 1003 | int seeks; /* seeks to recreate an obj */ | 1003 | int seeks; /* seeks to recreate an obj */ |
| 1004 | 1004 | ||
| 1005 | /* These are for internal use */ | 1005 | /* These are for internal use */ |
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h index c9a975976995..814f294d4cd0 100644 --- a/include/linux/vgaarb.h +++ b/include/linux/vgaarb.h | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | */ | 29 | */ |
| 30 | 30 | ||
| 31 | #ifndef LINUX_VGA_H | 31 | #ifndef LINUX_VGA_H |
| 32 | #define LINUX_VGA_H | ||
| 32 | 33 | ||
| 33 | #include <asm/vga.h> | 34 | #include <asm/vga.h> |
| 34 | 35 | ||
diff --git a/include/math-emu/op-common.h b/include/math-emu/op-common.h index fd882261225e..9696a5e2c437 100644 --- a/include/math-emu/op-common.h +++ b/include/math-emu/op-common.h | |||
| @@ -799,7 +799,7 @@ do { \ | |||
| 799 | X##_e -= (_FP_W_TYPE_SIZE - rsize); \ | 799 | X##_e -= (_FP_W_TYPE_SIZE - rsize); \ |
| 800 | X##_e = rsize - X##_e - 1; \ | 800 | X##_e = rsize - X##_e - 1; \ |
| 801 | \ | 801 | \ |
| 802 | if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e) \ | 802 | if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs <= X##_e) \ |
| 803 | __FP_FRAC_SRS_1(ur_, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);\ | 803 | __FP_FRAC_SRS_1(ur_, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);\ |
| 804 | _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize); \ | 804 | _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize); \ |
| 805 | if ((_FP_WFRACBITS_##fs - X##_e - 1) > 0) \ | 805 | if ((_FP_WFRACBITS_##fs - X##_e - 1) > 0) \ |
diff --git a/include/net/sock.h b/include/net/sock.h index 731150d52799..0a691ea7654a 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -1224,12 +1224,7 @@ static inline void sk_tx_queue_clear(struct sock *sk) | |||
| 1224 | 1224 | ||
| 1225 | static inline int sk_tx_queue_get(const struct sock *sk) | 1225 | static inline int sk_tx_queue_get(const struct sock *sk) |
| 1226 | { | 1226 | { |
| 1227 | return sk->sk_tx_queue_mapping; | 1227 | return sk ? sk->sk_tx_queue_mapping : -1; |
| 1228 | } | ||
| 1229 | |||
| 1230 | static inline bool sk_tx_queue_recorded(const struct sock *sk) | ||
| 1231 | { | ||
| 1232 | return (sk && sk->sk_tx_queue_mapping >= 0); | ||
| 1233 | } | 1228 | } |
| 1234 | 1229 | ||
| 1235 | static inline void sk_set_socket(struct sock *sk, struct socket *sock) | 1230 | static inline void sk_set_socket(struct sock *sk, struct socket *sock) |
| @@ -1256,6 +1256,33 @@ out: | |||
| 1256 | return un; | 1256 | return un; |
| 1257 | } | 1257 | } |
| 1258 | 1258 | ||
| 1259 | |||
| 1260 | /** | ||
| 1261 | * get_queue_result - Retrieve the result code from sem_queue | ||
| 1262 | * @q: Pointer to queue structure | ||
| 1263 | * | ||
| 1264 | * Retrieve the return code from the pending queue. If IN_WAKEUP is found in | ||
| 1265 | * q->status, then we must loop until the value is replaced with the final | ||
| 1266 | * value: This may happen if a task is woken up by an unrelated event (e.g. | ||
| 1267 | * signal) and in parallel the task is woken up by another task because it got | ||
| 1268 | * the requested semaphores. | ||
| 1269 | * | ||
| 1270 | * The function can be called with or without holding the semaphore spinlock. | ||
| 1271 | */ | ||
| 1272 | static int get_queue_result(struct sem_queue *q) | ||
| 1273 | { | ||
| 1274 | int error; | ||
| 1275 | |||
| 1276 | error = q->status; | ||
| 1277 | while (unlikely(error == IN_WAKEUP)) { | ||
| 1278 | cpu_relax(); | ||
| 1279 | error = q->status; | ||
| 1280 | } | ||
| 1281 | |||
| 1282 | return error; | ||
| 1283 | } | ||
| 1284 | |||
| 1285 | |||
| 1259 | SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, | 1286 | SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, |
| 1260 | unsigned, nsops, const struct timespec __user *, timeout) | 1287 | unsigned, nsops, const struct timespec __user *, timeout) |
| 1261 | { | 1288 | { |
| @@ -1409,15 +1436,18 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, | |||
| 1409 | else | 1436 | else |
| 1410 | schedule(); | 1437 | schedule(); |
| 1411 | 1438 | ||
| 1412 | error = queue.status; | 1439 | error = get_queue_result(&queue); |
| 1413 | while(unlikely(error == IN_WAKEUP)) { | ||
| 1414 | cpu_relax(); | ||
| 1415 | error = queue.status; | ||
| 1416 | } | ||
| 1417 | 1440 | ||
| 1418 | if (error != -EINTR) { | 1441 | if (error != -EINTR) { |
| 1419 | /* fast path: update_queue already obtained all requested | 1442 | /* fast path: update_queue already obtained all requested |
| 1420 | * resources */ | 1443 | * resources. |
| 1444 | * Perform a smp_mb(): User space could assume that semop() | ||
| 1445 | * is a memory barrier: Without the mb(), the cpu could | ||
| 1446 | * speculatively read in user space stale data that was | ||
| 1447 | * overwritten by the previous owner of the semaphore. | ||
| 1448 | */ | ||
| 1449 | smp_mb(); | ||
| 1450 | |||
| 1421 | goto out_free; | 1451 | goto out_free; |
| 1422 | } | 1452 | } |
| 1423 | 1453 | ||
| @@ -1427,10 +1457,12 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, | |||
| 1427 | goto out_free; | 1457 | goto out_free; |
| 1428 | } | 1458 | } |
| 1429 | 1459 | ||
| 1460 | error = get_queue_result(&queue); | ||
| 1461 | |||
| 1430 | /* | 1462 | /* |
| 1431 | * If queue.status != -EINTR we are woken up by another process | 1463 | * If queue.status != -EINTR we are woken up by another process |
| 1432 | */ | 1464 | */ |
| 1433 | error = queue.status; | 1465 | |
| 1434 | if (error != -EINTR) { | 1466 | if (error != -EINTR) { |
| 1435 | goto out_unlock_free; | 1467 | goto out_unlock_free; |
| 1436 | } | 1468 | } |
diff --git a/mm/bootmem.c b/mm/bootmem.c index 58c66cc5056a..142c84a54993 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
| @@ -833,15 +833,24 @@ static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata, | |||
| 833 | void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size, | 833 | void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size, |
| 834 | unsigned long align, unsigned long goal) | 834 | unsigned long align, unsigned long goal) |
| 835 | { | 835 | { |
| 836 | void *ptr; | ||
| 837 | |||
| 836 | if (WARN_ON_ONCE(slab_is_available())) | 838 | if (WARN_ON_ONCE(slab_is_available())) |
| 837 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); | 839 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); |
| 838 | 840 | ||
| 839 | #ifdef CONFIG_NO_BOOTMEM | 841 | #ifdef CONFIG_NO_BOOTMEM |
| 840 | return __alloc_memory_core_early(pgdat->node_id, size, align, | 842 | ptr = __alloc_memory_core_early(pgdat->node_id, size, align, |
| 843 | goal, -1ULL); | ||
| 844 | if (ptr) | ||
| 845 | return ptr; | ||
| 846 | |||
| 847 | ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, | ||
| 841 | goal, -1ULL); | 848 | goal, -1ULL); |
| 842 | #else | 849 | #else |
| 843 | return ___alloc_bootmem_node(pgdat->bdata, size, align, goal, 0); | 850 | ptr = ___alloc_bootmem_node(pgdat->bdata, size, align, goal, 0); |
| 844 | #endif | 851 | #endif |
| 852 | |||
| 853 | return ptr; | ||
| 845 | } | 854 | } |
| 846 | 855 | ||
| 847 | void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, | 856 | void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, |
| @@ -977,14 +986,21 @@ void * __init __alloc_bootmem_low(unsigned long size, unsigned long align, | |||
| 977 | void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size, | 986 | void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size, |
| 978 | unsigned long align, unsigned long goal) | 987 | unsigned long align, unsigned long goal) |
| 979 | { | 988 | { |
| 989 | void *ptr; | ||
| 990 | |||
| 980 | if (WARN_ON_ONCE(slab_is_available())) | 991 | if (WARN_ON_ONCE(slab_is_available())) |
| 981 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); | 992 | return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); |
| 982 | 993 | ||
| 983 | #ifdef CONFIG_NO_BOOTMEM | 994 | #ifdef CONFIG_NO_BOOTMEM |
| 984 | return __alloc_memory_core_early(pgdat->node_id, size, align, | 995 | ptr = __alloc_memory_core_early(pgdat->node_id, size, align, |
| 996 | goal, ARCH_LOW_ADDRESS_LIMIT); | ||
| 997 | if (ptr) | ||
| 998 | return ptr; | ||
| 999 | ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, | ||
| 985 | goal, ARCH_LOW_ADDRESS_LIMIT); | 1000 | goal, ARCH_LOW_ADDRESS_LIMIT); |
| 986 | #else | 1001 | #else |
| 987 | return ___alloc_bootmem_node(pgdat->bdata, size, align, | 1002 | ptr = ___alloc_bootmem_node(pgdat->bdata, size, align, |
| 988 | goal, ARCH_LOW_ADDRESS_LIMIT); | 1003 | goal, ARCH_LOW_ADDRESS_LIMIT); |
| 989 | #endif | 1004 | #endif |
| 1005 | return ptr; | ||
| 990 | } | 1006 | } |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 68319dd20bed..9bd339eb04c6 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -3634,6 +3634,9 @@ void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, | |||
| 3634 | int i; | 3634 | int i; |
| 3635 | void *ptr; | 3635 | void *ptr; |
| 3636 | 3636 | ||
| 3637 | if (limit > get_max_mapped()) | ||
| 3638 | limit = get_max_mapped(); | ||
| 3639 | |||
| 3637 | /* need to go over early_node_map to find out good range for node */ | 3640 | /* need to go over early_node_map to find out good range for node */ |
| 3638 | for_each_active_range_index_in_nid(i, nid) { | 3641 | for_each_active_range_index_in_nid(i, nid) { |
| 3639 | u64 addr; | 3642 | u64 addr; |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 9c7e57cc63a3..b94fe1b3da43 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -213,8 +213,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, | |||
| 213 | list_for_each_entry(shrinker, &shrinker_list, list) { | 213 | list_for_each_entry(shrinker, &shrinker_list, list) { |
| 214 | unsigned long long delta; | 214 | unsigned long long delta; |
| 215 | unsigned long total_scan; | 215 | unsigned long total_scan; |
| 216 | unsigned long max_pass = (*shrinker->shrink)(0, gfp_mask); | 216 | unsigned long max_pass; |
| 217 | 217 | ||
| 218 | max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); | ||
| 218 | delta = (4 * scanned) / shrinker->seeks; | 219 | delta = (4 * scanned) / shrinker->seeks; |
| 219 | delta *= max_pass; | 220 | delta *= max_pass; |
| 220 | do_div(delta, lru_pages + 1); | 221 | do_div(delta, lru_pages + 1); |
| @@ -242,8 +243,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, | |||
| 242 | int shrink_ret; | 243 | int shrink_ret; |
| 243 | int nr_before; | 244 | int nr_before; |
| 244 | 245 | ||
| 245 | nr_before = (*shrinker->shrink)(0, gfp_mask); | 246 | nr_before = (*shrinker->shrink)(shrinker, 0, gfp_mask); |
| 246 | shrink_ret = (*shrinker->shrink)(this_scan, gfp_mask); | 247 | shrink_ret = (*shrinker->shrink)(shrinker, this_scan, |
| 248 | gfp_mask); | ||
| 247 | if (shrink_ret == -1) | 249 | if (shrink_ret == -1) |
| 248 | break; | 250 | break; |
| 249 | if (shrink_ret < nr_before) | 251 | if (shrink_ret < nr_before) |
| @@ -296,7 +298,7 @@ static int may_write_to_queue(struct backing_dev_info *bdi) | |||
| 296 | static void handle_write_error(struct address_space *mapping, | 298 | static void handle_write_error(struct address_space *mapping, |
| 297 | struct page *page, int error) | 299 | struct page *page, int error) |
| 298 | { | 300 | { |
| 299 | lock_page(page); | 301 | lock_page_nosync(page); |
| 300 | if (page_mapping(page) == mapping) | 302 | if (page_mapping(page) == mapping) |
| 301 | mapping_set_error(mapping, error); | 303 | mapping_set_error(mapping, error); |
| 302 | unlock_page(page); | 304 | unlock_page(page); |
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index b10e3cdb08f8..800b6b9fbbae 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -358,6 +358,11 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 | |||
| 358 | acl->sec_level = sec_level; | 358 | acl->sec_level = sec_level; |
| 359 | acl->auth_type = auth_type; | 359 | acl->auth_type = auth_type; |
| 360 | hci_acl_connect(acl); | 360 | hci_acl_connect(acl); |
| 361 | } else { | ||
| 362 | if (acl->sec_level < sec_level) | ||
| 363 | acl->sec_level = sec_level; | ||
| 364 | if (acl->auth_type < auth_type) | ||
| 365 | acl->auth_type = auth_type; | ||
| 361 | } | 366 | } |
| 362 | 367 | ||
| 363 | if (type == ACL_LINK) | 368 | if (type == ACL_LINK) |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 6c57fc71c7e2..786b5de0bac4 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -1049,6 +1049,8 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
| 1049 | if (conn) { | 1049 | if (conn) { |
| 1050 | if (!ev->status) | 1050 | if (!ev->status) |
| 1051 | conn->link_mode |= HCI_LM_AUTH; | 1051 | conn->link_mode |= HCI_LM_AUTH; |
| 1052 | else | ||
| 1053 | conn->sec_level = BT_SECURITY_LOW; | ||
| 1052 | 1054 | ||
| 1053 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); | 1055 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); |
| 1054 | 1056 | ||
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 1b682a5aa061..cf3c4073a8a6 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -401,6 +401,11 @@ static inline void l2cap_send_rr_or_rnr(struct l2cap_pinfo *pi, u16 control) | |||
| 401 | l2cap_send_sframe(pi, control); | 401 | l2cap_send_sframe(pi, control); |
| 402 | } | 402 | } |
| 403 | 403 | ||
| 404 | static inline int __l2cap_no_conn_pending(struct sock *sk) | ||
| 405 | { | ||
| 406 | return !(l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND); | ||
| 407 | } | ||
| 408 | |||
| 404 | static void l2cap_do_start(struct sock *sk) | 409 | static void l2cap_do_start(struct sock *sk) |
| 405 | { | 410 | { |
| 406 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 411 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; |
| @@ -409,12 +414,13 @@ static void l2cap_do_start(struct sock *sk) | |||
| 409 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) | 414 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) |
| 410 | return; | 415 | return; |
| 411 | 416 | ||
| 412 | if (l2cap_check_security(sk)) { | 417 | if (l2cap_check_security(sk) && __l2cap_no_conn_pending(sk)) { |
| 413 | struct l2cap_conn_req req; | 418 | struct l2cap_conn_req req; |
| 414 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 419 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); |
| 415 | req.psm = l2cap_pi(sk)->psm; | 420 | req.psm = l2cap_pi(sk)->psm; |
| 416 | 421 | ||
| 417 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 422 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
| 423 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | ||
| 418 | 424 | ||
| 419 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 425 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, |
| 420 | L2CAP_CONN_REQ, sizeof(req), &req); | 426 | L2CAP_CONN_REQ, sizeof(req), &req); |
| @@ -464,12 +470,14 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
| 464 | } | 470 | } |
| 465 | 471 | ||
| 466 | if (sk->sk_state == BT_CONNECT) { | 472 | if (sk->sk_state == BT_CONNECT) { |
| 467 | if (l2cap_check_security(sk)) { | 473 | if (l2cap_check_security(sk) && |
| 474 | __l2cap_no_conn_pending(sk)) { | ||
| 468 | struct l2cap_conn_req req; | 475 | struct l2cap_conn_req req; |
| 469 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 476 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); |
| 470 | req.psm = l2cap_pi(sk)->psm; | 477 | req.psm = l2cap_pi(sk)->psm; |
| 471 | 478 | ||
| 472 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 479 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
| 480 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | ||
| 473 | 481 | ||
| 474 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 482 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, |
| 475 | L2CAP_CONN_REQ, sizeof(req), &req); | 483 | L2CAP_CONN_REQ, sizeof(req), &req); |
| @@ -2912,7 +2920,6 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
| 2912 | l2cap_pi(sk)->ident = 0; | 2920 | l2cap_pi(sk)->ident = 0; |
| 2913 | l2cap_pi(sk)->dcid = dcid; | 2921 | l2cap_pi(sk)->dcid = dcid; |
| 2914 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2922 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
| 2915 | |||
| 2916 | l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND; | 2923 | l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND; |
| 2917 | 2924 | ||
| 2918 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2925 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
| @@ -4404,6 +4411,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
| 4404 | req.psm = l2cap_pi(sk)->psm; | 4411 | req.psm = l2cap_pi(sk)->psm; |
| 4405 | 4412 | ||
| 4406 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 4413 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
| 4414 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | ||
| 4407 | 4415 | ||
| 4408 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 4416 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, |
| 4409 | L2CAP_CONN_REQ, sizeof(req), &req); | 4417 | L2CAP_CONN_REQ, sizeof(req), &req); |
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index eedf2c94820e..753fc4221f3c 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
| @@ -217,14 +217,6 @@ static bool br_devices_support_netpoll(struct net_bridge *br) | |||
| 217 | return count != 0 && ret; | 217 | return count != 0 && ret; |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | static void br_poll_controller(struct net_device *br_dev) | ||
| 221 | { | ||
| 222 | struct netpoll *np = br_dev->npinfo->netpoll; | ||
| 223 | |||
| 224 | if (np->real_dev != br_dev) | ||
| 225 | netpoll_poll_dev(np->real_dev); | ||
| 226 | } | ||
| 227 | |||
| 228 | void br_netpoll_cleanup(struct net_device *dev) | 220 | void br_netpoll_cleanup(struct net_device *dev) |
| 229 | { | 221 | { |
| 230 | struct net_bridge *br = netdev_priv(dev); | 222 | struct net_bridge *br = netdev_priv(dev); |
| @@ -295,7 +287,6 @@ static const struct net_device_ops br_netdev_ops = { | |||
| 295 | .ndo_do_ioctl = br_dev_ioctl, | 287 | .ndo_do_ioctl = br_dev_ioctl, |
| 296 | #ifdef CONFIG_NET_POLL_CONTROLLER | 288 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 297 | .ndo_netpoll_cleanup = br_netpoll_cleanup, | 289 | .ndo_netpoll_cleanup = br_netpoll_cleanup, |
| 298 | .ndo_poll_controller = br_poll_controller, | ||
| 299 | #endif | 290 | #endif |
| 300 | }; | 291 | }; |
| 301 | 292 | ||
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index a4e72a89e4ff..595da45f9088 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
| @@ -50,14 +50,7 @@ int br_dev_queue_push_xmit(struct sk_buff *skb) | |||
| 50 | kfree_skb(skb); | 50 | kfree_skb(skb); |
| 51 | else { | 51 | else { |
| 52 | skb_push(skb, ETH_HLEN); | 52 | skb_push(skb, ETH_HLEN); |
| 53 | 53 | dev_queue_xmit(skb); | |
| 54 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 55 | if (unlikely(skb->dev->priv_flags & IFF_IN_NETPOLL)) { | ||
| 56 | netpoll_send_skb(skb->dev->npinfo->netpoll, skb); | ||
| 57 | skb->dev->priv_flags &= ~IFF_IN_NETPOLL; | ||
| 58 | } else | ||
| 59 | #endif | ||
| 60 | dev_queue_xmit(skb); | ||
| 61 | } | 54 | } |
| 62 | } | 55 | } |
| 63 | 56 | ||
| @@ -73,23 +66,9 @@ int br_forward_finish(struct sk_buff *skb) | |||
| 73 | 66 | ||
| 74 | static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) | 67 | static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) |
| 75 | { | 68 | { |
| 76 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 77 | struct net_bridge *br = to->br; | ||
| 78 | if (unlikely(br->dev->priv_flags & IFF_IN_NETPOLL)) { | ||
| 79 | struct netpoll *np; | ||
| 80 | to->dev->npinfo = skb->dev->npinfo; | ||
| 81 | np = skb->dev->npinfo->netpoll; | ||
| 82 | np->real_dev = np->dev = to->dev; | ||
| 83 | to->dev->priv_flags |= IFF_IN_NETPOLL; | ||
| 84 | } | ||
| 85 | #endif | ||
| 86 | skb->dev = to->dev; | 69 | skb->dev = to->dev; |
| 87 | NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, | 70 | NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, |
| 88 | br_forward_finish); | 71 | br_forward_finish); |
| 89 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 90 | if (skb->dev->npinfo) | ||
| 91 | skb->dev->npinfo->netpoll->dev = br->dev; | ||
| 92 | #endif | ||
| 93 | } | 72 | } |
| 94 | 73 | ||
| 95 | static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb) | 74 | static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb) |
diff --git a/net/core/dev.c b/net/core/dev.c index 723a34710ad4..0ea10f849be8 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1911,8 +1911,16 @@ static int dev_gso_segment(struct sk_buff *skb) | |||
| 1911 | */ | 1911 | */ |
| 1912 | static inline void skb_orphan_try(struct sk_buff *skb) | 1912 | static inline void skb_orphan_try(struct sk_buff *skb) |
| 1913 | { | 1913 | { |
| 1914 | if (!skb_tx(skb)->flags) | 1914 | struct sock *sk = skb->sk; |
| 1915 | |||
| 1916 | if (sk && !skb_tx(skb)->flags) { | ||
| 1917 | /* skb_tx_hash() wont be able to get sk. | ||
| 1918 | * We copy sk_hash into skb->rxhash | ||
| 1919 | */ | ||
| 1920 | if (!skb->rxhash) | ||
| 1921 | skb->rxhash = sk->sk_hash; | ||
| 1915 | skb_orphan(skb); | 1922 | skb_orphan(skb); |
| 1923 | } | ||
| 1916 | } | 1924 | } |
| 1917 | 1925 | ||
| 1918 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | 1926 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, |
| @@ -1998,8 +2006,7 @@ u16 skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb) | |||
| 1998 | if (skb->sk && skb->sk->sk_hash) | 2006 | if (skb->sk && skb->sk->sk_hash) |
| 1999 | hash = skb->sk->sk_hash; | 2007 | hash = skb->sk->sk_hash; |
| 2000 | else | 2008 | else |
| 2001 | hash = (__force u16) skb->protocol; | 2009 | hash = (__force u16) skb->protocol ^ skb->rxhash; |
| 2002 | |||
| 2003 | hash = jhash_1word(hash, hashrnd); | 2010 | hash = jhash_1word(hash, hashrnd); |
| 2004 | 2011 | ||
| 2005 | return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); | 2012 | return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); |
| @@ -2022,12 +2029,11 @@ static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index) | |||
| 2022 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, | 2029 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, |
| 2023 | struct sk_buff *skb) | 2030 | struct sk_buff *skb) |
| 2024 | { | 2031 | { |
| 2025 | u16 queue_index; | 2032 | int queue_index; |
| 2026 | struct sock *sk = skb->sk; | 2033 | struct sock *sk = skb->sk; |
| 2027 | 2034 | ||
| 2028 | if (sk_tx_queue_recorded(sk)) { | 2035 | queue_index = sk_tx_queue_get(sk); |
| 2029 | queue_index = sk_tx_queue_get(sk); | 2036 | if (queue_index < 0) { |
| 2030 | } else { | ||
| 2031 | const struct net_device_ops *ops = dev->netdev_ops; | 2037 | const struct net_device_ops *ops = dev->netdev_ops; |
| 2032 | 2038 | ||
| 2033 | if (ops->ndo_select_queue) { | 2039 | if (ops->ndo_select_queue) { |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 6ba1c0eece03..a4e0a7482c2b 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -949,7 +949,10 @@ static void neigh_update_hhs(struct neighbour *neigh) | |||
| 949 | { | 949 | { |
| 950 | struct hh_cache *hh; | 950 | struct hh_cache *hh; |
| 951 | void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *) | 951 | void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *) |
| 952 | = neigh->dev->header_ops->cache_update; | 952 | = NULL; |
| 953 | |||
| 954 | if (neigh->dev->header_ops) | ||
| 955 | update = neigh->dev->header_ops->cache_update; | ||
| 953 | 956 | ||
| 954 | if (update) { | 957 | if (update) { |
| 955 | for (hh = neigh->hh; hh; hh = hh->hh_next) { | 958 | for (hh = neigh->hh; hh; hh = hh->hh_next) { |
diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig index c51b55400dc5..11201784d29a 100644 --- a/net/dsa/Kconfig +++ b/net/dsa/Kconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | menuconfig NET_DSA | 1 | menuconfig NET_DSA |
| 2 | bool "Distributed Switch Architecture support" | 2 | bool "Distributed Switch Architecture support" |
| 3 | default n | 3 | default n |
| 4 | depends on EXPERIMENTAL && !S390 | 4 | depends on EXPERIMENTAL && NET_ETHERNET && !S390 |
| 5 | select PHYLIB | 5 | select PHYLIB |
| 6 | ---help--- | 6 | ---help--- |
| 7 | This allows you to use hardware switch chips that use | 7 | This allows you to use hardware switch chips that use |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 757f25eb9b4b..7f6273506eea 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -442,8 +442,10 @@ static netdev_tx_t reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 442 | int err; | 442 | int err; |
| 443 | 443 | ||
| 444 | err = ipmr_fib_lookup(net, &fl, &mrt); | 444 | err = ipmr_fib_lookup(net, &fl, &mrt); |
| 445 | if (err < 0) | 445 | if (err < 0) { |
| 446 | kfree_skb(skb); | ||
| 446 | return err; | 447 | return err; |
| 448 | } | ||
| 447 | 449 | ||
| 448 | read_lock(&mrt_lock); | 450 | read_lock(&mrt_lock); |
| 449 | dev->stats.tx_bytes += skb->len; | 451 | dev->stats.tx_bytes += skb->len; |
| @@ -1728,8 +1730,10 @@ int ip_mr_input(struct sk_buff *skb) | |||
| 1728 | goto dont_forward; | 1730 | goto dont_forward; |
| 1729 | 1731 | ||
| 1730 | err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); | 1732 | err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); |
| 1731 | if (err < 0) | 1733 | if (err < 0) { |
| 1734 | kfree_skb(skb); | ||
| 1732 | return err; | 1735 | return err; |
| 1736 | } | ||
| 1733 | 1737 | ||
| 1734 | if (!local) { | 1738 | if (!local) { |
| 1735 | if (IPCB(skb)->opt.router_alert) { | 1739 | if (IPCB(skb)->opt.router_alert) { |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 6596b4feeddc..65afeaec15b7 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -608,6 +608,7 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos, | |||
| 608 | ssize_t spliced; | 608 | ssize_t spliced; |
| 609 | int ret; | 609 | int ret; |
| 610 | 610 | ||
| 611 | sock_rps_record_flow(sk); | ||
| 611 | /* | 612 | /* |
| 612 | * We can't seek on a socket input | 613 | * We can't seek on a socket input |
| 613 | */ | 614 | */ |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b4ed957f201a..7ed9dc1042d1 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -2208,6 +2208,9 @@ void tcp_xmit_retransmit_queue(struct sock *sk) | |||
| 2208 | int mib_idx; | 2208 | int mib_idx; |
| 2209 | int fwd_rexmitting = 0; | 2209 | int fwd_rexmitting = 0; |
| 2210 | 2210 | ||
| 2211 | if (!tp->packets_out) | ||
| 2212 | return; | ||
| 2213 | |||
| 2211 | if (!tp->lost_out) | 2214 | if (!tp->lost_out) |
| 2212 | tp->retransmit_high = tp->snd_una; | 2215 | tp->retransmit_high = tp->snd_una; |
| 2213 | 2216 | ||
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c index 2794b6002836..d6e9599d0705 100644 --- a/net/ipv6/mip6.c +++ b/net/ipv6/mip6.c | |||
| @@ -347,11 +347,12 @@ static const struct xfrm_type mip6_destopt_type = | |||
| 347 | 347 | ||
| 348 | static int mip6_rthdr_input(struct xfrm_state *x, struct sk_buff *skb) | 348 | static int mip6_rthdr_input(struct xfrm_state *x, struct sk_buff *skb) |
| 349 | { | 349 | { |
| 350 | struct ipv6hdr *iph = ipv6_hdr(skb); | ||
| 350 | struct rt2_hdr *rt2 = (struct rt2_hdr *)skb->data; | 351 | struct rt2_hdr *rt2 = (struct rt2_hdr *)skb->data; |
| 351 | int err = rt2->rt_hdr.nexthdr; | 352 | int err = rt2->rt_hdr.nexthdr; |
| 352 | 353 | ||
| 353 | spin_lock(&x->lock); | 354 | spin_lock(&x->lock); |
| 354 | if (!ipv6_addr_equal(&rt2->addr, (struct in6_addr *)x->coaddr) && | 355 | if (!ipv6_addr_equal(&iph->daddr, (struct in6_addr *)x->coaddr) && |
| 355 | !ipv6_addr_any((struct in6_addr *)x->coaddr)) | 356 | !ipv6_addr_any((struct in6_addr *)x->coaddr)) |
| 356 | err = -ENOENT; | 357 | err = -ENOENT; |
| 357 | spin_unlock(&x->lock); | 358 | spin_unlock(&x->lock); |
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index 94d72e85a475..b2a3ae6cad78 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c | |||
| @@ -698,6 +698,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp) | |||
| 698 | newsk = NULL; | 698 | newsk = NULL; |
| 699 | goto out; | 699 | goto out; |
| 700 | } | 700 | } |
| 701 | kfree_skb(oskb); | ||
| 701 | 702 | ||
| 702 | sock_hold(sk); | 703 | sock_hold(sk); |
| 703 | pep_sk(newsk)->listener = sk; | 704 | pep_sk(newsk)->listener = sk; |
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index 570949417f38..724553e8ed7b 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c | |||
| @@ -205,7 +205,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 205 | { | 205 | { |
| 206 | struct icmphdr *icmph; | 206 | struct icmphdr *icmph; |
| 207 | 207 | ||
| 208 | if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph))) | 208 | if (!pskb_may_pull(skb, ihl + sizeof(*icmph))) |
| 209 | goto drop; | 209 | goto drop; |
| 210 | 210 | ||
| 211 | icmph = (void *)(skb_network_header(skb) + ihl); | 211 | icmph = (void *)(skb_network_header(skb) + ihl); |
| @@ -215,6 +215,9 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 215 | (icmph->type != ICMP_PARAMETERPROB)) | 215 | (icmph->type != ICMP_PARAMETERPROB)) |
| 216 | break; | 216 | break; |
| 217 | 217 | ||
| 218 | if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph))) | ||
| 219 | goto drop; | ||
| 220 | |||
| 218 | iph = (void *)(icmph + 1); | 221 | iph = (void *)(icmph + 1); |
| 219 | if (egress) | 222 | if (egress) |
| 220 | addr = iph->daddr; | 223 | addr = iph->daddr; |
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 73affb8624fa..8dc47f1d0001 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
| @@ -267,7 +267,7 @@ rpcauth_prune_expired(struct list_head *free, int nr_to_scan) | |||
| 267 | * Run memory cache shrinker. | 267 | * Run memory cache shrinker. |
| 268 | */ | 268 | */ |
| 269 | static int | 269 | static int |
| 270 | rpcauth_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) | 270 | rpcauth_cache_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) |
| 271 | { | 271 | { |
| 272 | LIST_HEAD(free); | 272 | LIST_HEAD(free); |
| 273 | int res; | 273 | int res; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index af1c173be4ad..a7ec5a8a2380 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1594,8 +1594,8 @@ xfrm_resolve_and_create_bundle(struct xfrm_policy **pols, int num_pols, | |||
| 1594 | 1594 | ||
| 1595 | /* Try to instantiate a bundle */ | 1595 | /* Try to instantiate a bundle */ |
| 1596 | err = xfrm_tmpl_resolve(pols, num_pols, fl, xfrm, family); | 1596 | err = xfrm_tmpl_resolve(pols, num_pols, fl, xfrm, family); |
| 1597 | if (err < 0) { | 1597 | if (err <= 0) { |
| 1598 | if (err != -EAGAIN) | 1598 | if (err != 0 && err != -EAGAIN) |
| 1599 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTPOLERROR); | 1599 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTPOLERROR); |
| 1600 | return ERR_PTR(err); | 1600 | return ERR_PTR(err); |
| 1601 | } | 1601 | } |
| @@ -1678,6 +1678,13 @@ xfrm_bundle_lookup(struct net *net, struct flowi *fl, u16 family, u8 dir, | |||
| 1678 | goto make_dummy_bundle; | 1678 | goto make_dummy_bundle; |
| 1679 | dst_hold(&xdst->u.dst); | 1679 | dst_hold(&xdst->u.dst); |
| 1680 | return oldflo; | 1680 | return oldflo; |
| 1681 | } else if (new_xdst == NULL) { | ||
| 1682 | num_xfrms = 0; | ||
| 1683 | if (oldflo == NULL) | ||
| 1684 | goto make_dummy_bundle; | ||
| 1685 | xdst->num_xfrms = 0; | ||
| 1686 | dst_hold(&xdst->u.dst); | ||
| 1687 | return oldflo; | ||
| 1681 | } | 1688 | } |
| 1682 | 1689 | ||
| 1683 | /* Kill the previous bundle */ | 1690 | /* Kill the previous bundle */ |
| @@ -1760,6 +1767,10 @@ restart: | |||
| 1760 | xfrm_pols_put(pols, num_pols); | 1767 | xfrm_pols_put(pols, num_pols); |
| 1761 | err = PTR_ERR(xdst); | 1768 | err = PTR_ERR(xdst); |
| 1762 | goto dropdst; | 1769 | goto dropdst; |
| 1770 | } else if (xdst == NULL) { | ||
| 1771 | num_xfrms = 0; | ||
| 1772 | drop_pols = num_pols; | ||
| 1773 | goto no_transform; | ||
| 1763 | } | 1774 | } |
| 1764 | 1775 | ||
| 1765 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); | 1776 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); |
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 31ac5538fe7e..5da30eb6ad00 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
| @@ -83,8 +83,8 @@ config SND_SOC_ALL_CODECS | |||
| 83 | 83 | ||
| 84 | config SND_SOC_WM_HUBS | 84 | config SND_SOC_WM_HUBS |
| 85 | tristate | 85 | tristate |
| 86 | default y if SND_SOC_WM8993=y | 86 | default y if SND_SOC_WM8993=y || SND_SOC_WM8994=y |
| 87 | default m if SND_SOC_WM8993=m | 87 | default m if SND_SOC_WM8993=m || SND_SOC_WM8994=m |
| 88 | 88 | ||
| 89 | config SND_SOC_AC97_CODEC | 89 | config SND_SOC_AC97_CODEC |
| 90 | tristate | 90 | tristate |
diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c index 1072621e93fd..9d1df2628136 100644 --- a/sound/soc/codecs/wm8727.c +++ b/sound/soc/codecs/wm8727.c | |||
| @@ -127,6 +127,8 @@ static __devinit int wm8727_platform_probe(struct platform_device *pdev) | |||
| 127 | goto err_codec; | 127 | goto err_codec; |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | return 0; | ||
| 131 | |||
| 130 | err_codec: | 132 | err_codec: |
| 131 | snd_soc_unregister_codec(codec); | 133 | snd_soc_unregister_codec(codec); |
| 132 | err: | 134 | err: |
diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index 7e4a627b4c7e..4e212ed62ea6 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c | |||
| @@ -94,7 +94,6 @@ SOC_DAPM_SINGLE("Bypass Switch", WM8776_OUTMUX, 2, 1, 0), | |||
| 94 | 94 | ||
| 95 | static const struct snd_soc_dapm_widget wm8776_dapm_widgets[] = { | 95 | static const struct snd_soc_dapm_widget wm8776_dapm_widgets[] = { |
| 96 | SND_SOC_DAPM_INPUT("AUX"), | 96 | SND_SOC_DAPM_INPUT("AUX"), |
| 97 | SND_SOC_DAPM_INPUT("AUX"), | ||
| 98 | 97 | ||
| 99 | SND_SOC_DAPM_INPUT("AIN1"), | 98 | SND_SOC_DAPM_INPUT("AIN1"), |
| 100 | SND_SOC_DAPM_INPUT("AIN2"), | 99 | SND_SOC_DAPM_INPUT("AIN2"), |
diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c index 0417dae32e6f..19ad590ca0b3 100644 --- a/sound/soc/codecs/wm8988.c +++ b/sound/soc/codecs/wm8988.c | |||
| @@ -885,7 +885,6 @@ static int wm8988_register(struct wm8988_priv *wm8988, | |||
| 885 | ret = snd_soc_register_dai(&wm8988_dai); | 885 | ret = snd_soc_register_dai(&wm8988_dai); |
| 886 | if (ret != 0) { | 886 | if (ret != 0) { |
| 887 | dev_err(codec->dev, "Failed to register DAI: %d\n", ret); | 887 | dev_err(codec->dev, "Failed to register DAI: %d\n", ret); |
| 888 | snd_soc_unregister_codec(codec); | ||
| 889 | goto err_codec; | 888 | goto err_codec; |
| 890 | } | 889 | } |
| 891 | 890 | ||
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 3396a0db06ba..ec4acac49ebd 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c | |||
| @@ -683,20 +683,15 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, | |||
| 683 | 683 | ||
| 684 | /* clock inversion (CKG2) */ | 684 | /* clock inversion (CKG2) */ |
| 685 | data = 0; | 685 | data = 0; |
| 686 | switch (SH_FSI_INVERSION_MASK & flags) { | 686 | if (SH_FSI_LRM_INV & flags) |
| 687 | case SH_FSI_LRM_INV: | 687 | data |= 1 << 12; |
| 688 | data = 1 << 12; | 688 | if (SH_FSI_BRM_INV & flags) |
| 689 | break; | 689 | data |= 1 << 8; |
| 690 | case SH_FSI_BRM_INV: | 690 | if (SH_FSI_LRS_INV & flags) |
| 691 | data = 1 << 8; | 691 | data |= 1 << 4; |
| 692 | break; | 692 | if (SH_FSI_BRS_INV & flags) |
| 693 | case SH_FSI_LRS_INV: | 693 | data |= 1 << 0; |
| 694 | data = 1 << 4; | 694 | |
| 695 | break; | ||
| 696 | case SH_FSI_BRS_INV: | ||
| 697 | data = 1 << 0; | ||
| 698 | break; | ||
| 699 | } | ||
| 700 | fsi_reg_write(fsi, CKG2, data); | 695 | fsi_reg_write(fsi, CKG2, data); |
| 701 | 696 | ||
| 702 | /* do fmt, di fmt */ | 697 | /* do fmt, di fmt */ |
| @@ -726,15 +721,15 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, | |||
| 726 | break; | 721 | break; |
| 727 | case SH_FSI_FMT_TDM: | 722 | case SH_FSI_FMT_TDM: |
| 728 | msg = "TDM"; | 723 | msg = "TDM"; |
| 729 | data = CR_FMT(CR_TDM) | (fsi->chan - 1); | ||
| 730 | fsi->chan = is_play ? | 724 | fsi->chan = is_play ? |
| 731 | SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); | 725 | SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); |
| 726 | data = CR_FMT(CR_TDM) | (fsi->chan - 1); | ||
| 732 | break; | 727 | break; |
| 733 | case SH_FSI_FMT_TDM_DELAY: | 728 | case SH_FSI_FMT_TDM_DELAY: |
| 734 | msg = "TDM Delay"; | 729 | msg = "TDM Delay"; |
| 735 | data = CR_FMT(CR_TDM_D) | (fsi->chan - 1); | ||
| 736 | fsi->chan = is_play ? | 730 | fsi->chan = is_play ? |
| 737 | SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); | 731 | SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); |
| 732 | data = CR_FMT(CR_TDM_D) | (fsi->chan - 1); | ||
| 738 | break; | 733 | break; |
| 739 | default: | 734 | default: |
| 740 | dev_err(dai->dev, "unknown format.\n"); | 735 | dev_err(dai->dev, "unknown format.\n"); |
diff --git a/tools/perf/arch/sparc/Makefile b/tools/perf/arch/sparc/Makefile new file mode 100644 index 000000000000..15130b50dfe3 --- /dev/null +++ b/tools/perf/arch/sparc/Makefile | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | ifndef NO_DWARF | ||
| 2 | PERF_HAVE_DWARF_REGS := 1 | ||
| 3 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o | ||
| 4 | endif | ||
diff --git a/tools/perf/arch/sparc/util/dwarf-regs.c b/tools/perf/arch/sparc/util/dwarf-regs.c new file mode 100644 index 000000000000..0ab88483720c --- /dev/null +++ b/tools/perf/arch/sparc/util/dwarf-regs.c | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | /* | ||
| 2 | * Mapping of DWARF debug register numbers into register names. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 David S. Miller <davem@davemloft.net> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <libio.h> | ||
| 13 | #include <dwarf-regs.h> | ||
| 14 | |||
| 15 | #define SPARC_MAX_REGS 96 | ||
| 16 | |||
| 17 | const char *sparc_regs_table[SPARC_MAX_REGS] = { | ||
| 18 | "%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7", | ||
| 19 | "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7", | ||
| 20 | "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7", | ||
| 21 | "%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%fp", "%i7", | ||
| 22 | "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", | ||
| 23 | "%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15", | ||
| 24 | "%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23", | ||
| 25 | "%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31", | ||
| 26 | "%f32", "%f33", "%f34", "%f35", "%f36", "%f37", "%f38", "%f39", | ||
| 27 | "%f40", "%f41", "%f42", "%f43", "%f44", "%f45", "%f46", "%f47", | ||
| 28 | "%f48", "%f49", "%f50", "%f51", "%f52", "%f53", "%f54", "%f55", | ||
| 29 | "%f56", "%f57", "%f58", "%f59", "%f60", "%f61", "%f62", "%f63", | ||
| 30 | }; | ||
| 31 | |||
| 32 | /** | ||
| 33 | * get_arch_regstr() - lookup register name from it's DWARF register number | ||
| 34 | * @n: the DWARF register number | ||
| 35 | * | ||
| 36 | * get_arch_regstr() returns the name of the register in struct | ||
| 37 | * regdwarfnum_table from it's DWARF register number. If the register is not | ||
| 38 | * found in the table, this returns NULL; | ||
| 39 | */ | ||
| 40 | const char *get_arch_regstr(unsigned int n) | ||
| 41 | { | ||
| 42 | return (n <= SPARC_MAX_REGS) ? sparc_regs_table[n] : NULL; | ||
| 43 | } | ||
