parent
7e171e4649
commit
57daf41441
4
PKGBUILD
4
PKGBUILD
|
@ -9,7 +9,7 @@ pkgname=$pkgbase
|
||||||
pkgdesc="The Linux Kernel and modules from Linus' git tree"
|
pkgdesc="The Linux Kernel and modules from Linus' git tree"
|
||||||
depends=('coreutils' 'linux-firmware' 'module-init-tools' 'mkinitcpio')
|
depends=('coreutils' 'linux-firmware' 'module-init-tools' 'mkinitcpio')
|
||||||
|
|
||||||
pkgver=4.11.rc5
|
pkgver=4.11.rc7
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
url="http://www.kernel.org/"
|
url="http://www.kernel.org/"
|
||||||
arch=(i686 x86_64)
|
arch=(i686 x86_64)
|
||||||
|
@ -24,7 +24,7 @@ sha256sums=('SKIP')
|
||||||
# set _gitrev to a git revision (man gitrevisions) like a tag, a commit sha1
|
# set _gitrev to a git revision (man gitrevisions) like a tag, a commit sha1
|
||||||
# hash or a branch name to build from this tree instead of master
|
# hash or a branch name to build from this tree instead of master
|
||||||
|
|
||||||
_gitrev="v4.10.8"
|
_gitrev="v4.10.12"
|
||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
# KERNEL CONFIG FILES
|
# KERNEL CONFIG FILES
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
#
|
#
|
||||||
# Automatically generated file; DO NOT EDIT.
|
# Automatically generated file; DO NOT EDIT.
|
||||||
# Linux/x86 4.10.8 Kernel Configuration
|
# Linux/x86 4.10.12 Kernel Configuration
|
||||||
#
|
#
|
||||||
CONFIG_64BIT=y
|
CONFIG_64BIT=y
|
||||||
CONFIG_X86_64=y
|
CONFIG_X86_64=y
|
||||||
|
@ -91,7 +91,6 @@ CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||||
CONFIG_GENERIC_MSI_IRQ=y
|
CONFIG_GENERIC_MSI_IRQ=y
|
||||||
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
||||||
CONFIG_IRQ_FORCED_THREADING=y
|
CONFIG_IRQ_FORCED_THREADING=y
|
||||||
# CONFIG_FORCE_IRQ_THREADING is not set
|
|
||||||
CONFIG_SPARSE_IRQ=y
|
CONFIG_SPARSE_IRQ=y
|
||||||
CONFIG_CLOCKSOURCE_WATCHDOG=y
|
CONFIG_CLOCKSOURCE_WATCHDOG=y
|
||||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||||
|
@ -249,7 +248,6 @@ CONFIG_JUMP_LABEL=y
|
||||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||||
CONFIG_USER_RETURN_NOTIFIER=y
|
|
||||||
CONFIG_HAVE_IOREMAP_PROT=y
|
CONFIG_HAVE_IOREMAP_PROT=y
|
||||||
CONFIG_HAVE_KPROBES=y
|
CONFIG_HAVE_KPROBES=y
|
||||||
CONFIG_HAVE_KRETPROBES=y
|
CONFIG_HAVE_KRETPROBES=y
|
||||||
|
@ -315,9 +313,9 @@ CONFIG_BASE_SMALL=0
|
||||||
CONFIG_MODULES_TREE_LOOKUP=y
|
CONFIG_MODULES_TREE_LOOKUP=y
|
||||||
CONFIG_BLOCK=y
|
CONFIG_BLOCK=y
|
||||||
CONFIG_BLK_DEV_BSG=y
|
CONFIG_BLK_DEV_BSG=y
|
||||||
CONFIG_BLK_DEV_BSGLIB=y
|
# CONFIG_BLK_DEV_BSGLIB is not set
|
||||||
CONFIG_BLK_DEV_INTEGRITY=y
|
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||||
CONFIG_BLK_DEV_ZONED=y
|
# CONFIG_BLK_DEV_ZONED is not set
|
||||||
CONFIG_BLK_DEV_THROTTLING=y
|
CONFIG_BLK_DEV_THROTTLING=y
|
||||||
# CONFIG_BLK_CMDLINE_PARSER is not set
|
# CONFIG_BLK_CMDLINE_PARSER is not set
|
||||||
CONFIG_BLK_WBT=y
|
CONFIG_BLK_WBT=y
|
||||||
|
@ -360,7 +358,6 @@ CONFIG_BFQ_GROUP_IOSCHED=y
|
||||||
CONFIG_DEFAULT_BFQ=y
|
CONFIG_DEFAULT_BFQ=y
|
||||||
# CONFIG_DEFAULT_NOOP is not set
|
# CONFIG_DEFAULT_NOOP is not set
|
||||||
CONFIG_DEFAULT_IOSCHED="bfq"
|
CONFIG_DEFAULT_IOSCHED="bfq"
|
||||||
CONFIG_PREEMPT_NOTIFIERS=y
|
|
||||||
CONFIG_PADATA=y
|
CONFIG_PADATA=y
|
||||||
CONFIG_ASN1=y
|
CONFIG_ASN1=y
|
||||||
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
||||||
|
@ -506,8 +503,6 @@ CONFIG_BOUNCE=y
|
||||||
CONFIG_VIRT_TO_BUS=y
|
CONFIG_VIRT_TO_BUS=y
|
||||||
CONFIG_MMU_NOTIFIER=y
|
CONFIG_MMU_NOTIFIER=y
|
||||||
CONFIG_KSM=y
|
CONFIG_KSM=y
|
||||||
CONFIG_UKSM=y
|
|
||||||
# CONFIG_KSM_LEGACY is not set
|
|
||||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
|
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
|
||||||
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
|
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
|
||||||
CONFIG_MEMORY_FAILURE=y
|
CONFIG_MEMORY_FAILURE=y
|
||||||
|
@ -518,8 +513,10 @@ CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
|
||||||
CONFIG_TRANSPARENT_HUGE_PAGECACHE=y
|
CONFIG_TRANSPARENT_HUGE_PAGECACHE=y
|
||||||
CONFIG_CLEANCACHE=y
|
CONFIG_CLEANCACHE=y
|
||||||
CONFIG_FRONTSWAP=y
|
CONFIG_FRONTSWAP=y
|
||||||
# CONFIG_CMA is not set
|
CONFIG_CMA=y
|
||||||
# CONFIG_MEM_SOFT_DIRTY is not set
|
# CONFIG_CMA_DEBUG is not set
|
||||||
|
CONFIG_CMA_AREAS=7
|
||||||
|
CONFIG_MEM_SOFT_DIRTY=y
|
||||||
CONFIG_ZSWAP=y
|
CONFIG_ZSWAP=y
|
||||||
CONFIG_ZPOOL=y
|
CONFIG_ZPOOL=y
|
||||||
CONFIG_ZBUD=y
|
CONFIG_ZBUD=y
|
||||||
|
@ -529,7 +526,7 @@ CONFIG_PGTABLE_MAPPING=y
|
||||||
# CONFIG_ZSMALLOC_STAT is not set
|
# CONFIG_ZSMALLOC_STAT is not set
|
||||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||||
CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y
|
CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y
|
||||||
# CONFIG_IDLE_PAGE_TRACKING is not set
|
CONFIG_IDLE_PAGE_TRACKING=y
|
||||||
CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
|
CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
|
||||||
CONFIG_ARCH_HAS_PKEYS=y
|
CONFIG_ARCH_HAS_PKEYS=y
|
||||||
CONFIG_X86_PMEM_LEGACY_DEVICE=y
|
CONFIG_X86_PMEM_LEGACY_DEVICE=y
|
||||||
|
@ -580,16 +577,8 @@ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||||
#
|
#
|
||||||
# Power management and ACPI options
|
# Power management and ACPI options
|
||||||
#
|
#
|
||||||
CONFIG_SUSPEND=y
|
# CONFIG_SUSPEND is not set
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
|
||||||
# CONFIG_SUSPEND_SKIP_SYNC is not set
|
|
||||||
# CONFIG_HIBERNATION is not set
|
# CONFIG_HIBERNATION is not set
|
||||||
CONFIG_PM_SLEEP=y
|
|
||||||
CONFIG_PM_SLEEP_SMP=y
|
|
||||||
CONFIG_PM_AUTOSLEEP=y
|
|
||||||
CONFIG_PM_WAKELOCKS=y
|
|
||||||
CONFIG_PM_WAKELOCKS_LIMIT=0
|
|
||||||
CONFIG_PM_WAKELOCKS_GC=y
|
|
||||||
CONFIG_PM=y
|
CONFIG_PM=y
|
||||||
# CONFIG_PM_DEBUG is not set
|
# CONFIG_PM_DEBUG is not set
|
||||||
CONFIG_PM_CLK=y
|
CONFIG_PM_CLK=y
|
||||||
|
@ -599,7 +588,6 @@ CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
|
||||||
CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
|
CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
|
||||||
CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
|
CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
|
||||||
# CONFIG_ACPI_DEBUGGER is not set
|
# CONFIG_ACPI_DEBUGGER is not set
|
||||||
CONFIG_ACPI_SLEEP=y
|
|
||||||
# CONFIG_ACPI_PROCFS_POWER is not set
|
# CONFIG_ACPI_PROCFS_POWER is not set
|
||||||
CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
|
CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
|
||||||
# CONFIG_ACPI_EC_DEBUGFS is not set
|
# CONFIG_ACPI_EC_DEBUGFS is not set
|
||||||
|
@ -801,8 +789,8 @@ CONFIG_NET_FOU=y
|
||||||
# CONFIG_INET_DIAG is not set
|
# CONFIG_INET_DIAG is not set
|
||||||
CONFIG_TCP_CONG_ADVANCED=y
|
CONFIG_TCP_CONG_ADVANCED=y
|
||||||
# CONFIG_TCP_CONG_BIC is not set
|
# CONFIG_TCP_CONG_BIC is not set
|
||||||
CONFIG_TCP_CONG_CUBIC=y
|
# CONFIG_TCP_CONG_CUBIC is not set
|
||||||
# CONFIG_TCP_CONG_WESTWOOD is not set
|
CONFIG_TCP_CONG_WESTWOOD=y
|
||||||
# CONFIG_TCP_CONG_HTCP is not set
|
# CONFIG_TCP_CONG_HTCP is not set
|
||||||
# CONFIG_TCP_CONG_HSTCP is not set
|
# CONFIG_TCP_CONG_HSTCP is not set
|
||||||
# CONFIG_TCP_CONG_HYBLA is not set
|
# CONFIG_TCP_CONG_HYBLA is not set
|
||||||
|
@ -816,9 +804,10 @@ CONFIG_TCP_CONG_LP=y
|
||||||
# CONFIG_TCP_CONG_DCTCP is not set
|
# CONFIG_TCP_CONG_DCTCP is not set
|
||||||
# CONFIG_TCP_CONG_CDG is not set
|
# CONFIG_TCP_CONG_CDG is not set
|
||||||
# CONFIG_TCP_CONG_BBR is not set
|
# CONFIG_TCP_CONG_BBR is not set
|
||||||
CONFIG_DEFAULT_CUBIC=y
|
# CONFIG_DEFAULT_CUBIC is not set
|
||||||
|
CONFIG_DEFAULT_WESTWOOD=y
|
||||||
# CONFIG_DEFAULT_RENO is not set
|
# CONFIG_DEFAULT_RENO is not set
|
||||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
CONFIG_DEFAULT_TCP_CONG="westwood"
|
||||||
# CONFIG_TCP_MD5SIG is not set
|
# CONFIG_TCP_MD5SIG is not set
|
||||||
CONFIG_IPV6=y
|
CONFIG_IPV6=y
|
||||||
CONFIG_IPV6_ROUTER_PREF=y
|
CONFIG_IPV6_ROUTER_PREF=y
|
||||||
|
@ -848,7 +837,6 @@ CONFIG_IPV6_PIMSM_V2=y
|
||||||
CONFIG_IPV6_SEG6_LWTUNNEL=y
|
CONFIG_IPV6_SEG6_LWTUNNEL=y
|
||||||
# CONFIG_IPV6_SEG6_INLINE is not set
|
# CONFIG_IPV6_SEG6_INLINE is not set
|
||||||
# CONFIG_IPV6_SEG6_HMAC is not set
|
# CONFIG_IPV6_SEG6_HMAC is not set
|
||||||
# CONFIG_NETLABEL is not set
|
|
||||||
# CONFIG_NETWORK_SECMARK is not set
|
# CONFIG_NETWORK_SECMARK is not set
|
||||||
# CONFIG_NET_PTP_CLASSIFY is not set
|
# CONFIG_NET_PTP_CLASSIFY is not set
|
||||||
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
|
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
|
||||||
|
@ -976,7 +964,6 @@ CONFIG_IP_NF_MANGLE=y
|
||||||
# CONFIG_IP_NF_TARGET_ECN is not set
|
# CONFIG_IP_NF_TARGET_ECN is not set
|
||||||
CONFIG_IP_NF_TARGET_TTL=y
|
CONFIG_IP_NF_TARGET_TTL=y
|
||||||
# CONFIG_IP_NF_RAW is not set
|
# CONFIG_IP_NF_RAW is not set
|
||||||
# CONFIG_IP_NF_SECURITY is not set
|
|
||||||
CONFIG_IP_NF_ARPTABLES=y
|
CONFIG_IP_NF_ARPTABLES=y
|
||||||
CONFIG_IP_NF_ARPFILTER=y
|
CONFIG_IP_NF_ARPFILTER=y
|
||||||
CONFIG_IP_NF_ARP_MANGLE=y
|
CONFIG_IP_NF_ARP_MANGLE=y
|
||||||
|
@ -1004,7 +991,6 @@ CONFIG_IP6_NF_FILTER=y
|
||||||
CONFIG_IP6_NF_TARGET_REJECT=y
|
CONFIG_IP6_NF_TARGET_REJECT=y
|
||||||
CONFIG_IP6_NF_MANGLE=y
|
CONFIG_IP6_NF_MANGLE=y
|
||||||
# CONFIG_IP6_NF_RAW is not set
|
# CONFIG_IP6_NF_RAW is not set
|
||||||
# CONFIG_IP6_NF_SECURITY is not set
|
|
||||||
CONFIG_BRIDGE_NF_EBTABLES=y
|
CONFIG_BRIDGE_NF_EBTABLES=y
|
||||||
CONFIG_BRIDGE_EBT_BROUTE=y
|
CONFIG_BRIDGE_EBT_BROUTE=y
|
||||||
CONFIG_BRIDGE_EBT_T_FILTER=y
|
CONFIG_BRIDGE_EBT_T_FILTER=y
|
||||||
|
@ -1199,6 +1185,7 @@ CONFIG_REGMAP=y
|
||||||
CONFIG_REGMAP_I2C=y
|
CONFIG_REGMAP_I2C=y
|
||||||
CONFIG_DMA_SHARED_BUFFER=y
|
CONFIG_DMA_SHARED_BUFFER=y
|
||||||
# CONFIG_DMA_FENCE_TRACE is not set
|
# CONFIG_DMA_FENCE_TRACE is not set
|
||||||
|
# CONFIG_DMA_CMA is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus devices
|
# Bus devices
|
||||||
|
@ -1270,7 +1257,7 @@ CONFIG_BLK_DEV_NBD=y
|
||||||
#
|
#
|
||||||
# EEPROM support
|
# EEPROM support
|
||||||
#
|
#
|
||||||
# CONFIG_EEPROM_AT24 is not set
|
CONFIG_EEPROM_AT24=y
|
||||||
# CONFIG_EEPROM_LEGACY is not set
|
# CONFIG_EEPROM_LEGACY is not set
|
||||||
# CONFIG_EEPROM_MAX6875 is not set
|
# CONFIG_EEPROM_MAX6875 is not set
|
||||||
# CONFIG_EEPROM_93CX6 is not set
|
# CONFIG_EEPROM_93CX6 is not set
|
||||||
|
@ -1384,40 +1371,7 @@ CONFIG_SATA_AHCI=y
|
||||||
# CONFIG_SATA_ACARD_AHCI is not set
|
# CONFIG_SATA_ACARD_AHCI is not set
|
||||||
# CONFIG_SATA_SIL24 is not set
|
# CONFIG_SATA_SIL24 is not set
|
||||||
# CONFIG_ATA_SFF is not set
|
# CONFIG_ATA_SFF is not set
|
||||||
CONFIG_MD=y
|
# CONFIG_MD is not set
|
||||||
CONFIG_BLK_DEV_MD=y
|
|
||||||
CONFIG_MD_AUTODETECT=y
|
|
||||||
CONFIG_MD_LINEAR=y
|
|
||||||
CONFIG_MD_RAID0=y
|
|
||||||
CONFIG_MD_RAID1=y
|
|
||||||
CONFIG_MD_RAID10=y
|
|
||||||
CONFIG_MD_RAID456=y
|
|
||||||
# CONFIG_MD_MULTIPATH is not set
|
|
||||||
# CONFIG_MD_FAULTY is not set
|
|
||||||
CONFIG_BCACHE=y
|
|
||||||
# CONFIG_BCACHE_DEBUG is not set
|
|
||||||
# CONFIG_BCACHE_CLOSURES_DEBUG is not set
|
|
||||||
CONFIG_BLK_DEV_DM_BUILTIN=y
|
|
||||||
CONFIG_BLK_DEV_DM=y
|
|
||||||
CONFIG_DM_MQ_DEFAULT=y
|
|
||||||
# CONFIG_DM_DEBUG is not set
|
|
||||||
CONFIG_DM_BUFIO=y
|
|
||||||
# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set
|
|
||||||
CONFIG_DM_CRYPT=y
|
|
||||||
CONFIG_DM_SNAPSHOT=y
|
|
||||||
# CONFIG_DM_THIN_PROVISIONING is not set
|
|
||||||
# CONFIG_DM_CACHE is not set
|
|
||||||
# CONFIG_DM_ERA is not set
|
|
||||||
# CONFIG_DM_MIRROR is not set
|
|
||||||
CONFIG_DM_RAID=y
|
|
||||||
# CONFIG_DM_ZERO is not set
|
|
||||||
# CONFIG_DM_MULTIPATH is not set
|
|
||||||
# CONFIG_DM_DELAY is not set
|
|
||||||
CONFIG_DM_UEVENT=y
|
|
||||||
# CONFIG_DM_FLAKEY is not set
|
|
||||||
# CONFIG_DM_VERITY is not set
|
|
||||||
# CONFIG_DM_SWITCH is not set
|
|
||||||
# CONFIG_DM_LOG_WRITES is not set
|
|
||||||
# CONFIG_TARGET_CORE is not set
|
# CONFIG_TARGET_CORE is not set
|
||||||
# CONFIG_FUSION is not set
|
# CONFIG_FUSION is not set
|
||||||
|
|
||||||
|
@ -1691,7 +1645,6 @@ CONFIG_TTY=y
|
||||||
CONFIG_VT=y
|
CONFIG_VT=y
|
||||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||||
CONFIG_VT_CONSOLE=y
|
CONFIG_VT_CONSOLE=y
|
||||||
CONFIG_VT_CONSOLE_SLEEP=y
|
|
||||||
CONFIG_HW_CONSOLE=y
|
CONFIG_HW_CONSOLE=y
|
||||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
|
@ -2090,8 +2043,7 @@ CONFIG_WATCHDOG_SYSFS=y
|
||||||
# CONFIG_WAFER_WDT is not set
|
# CONFIG_WAFER_WDT is not set
|
||||||
# CONFIG_I6300ESB_WDT is not set
|
# CONFIG_I6300ESB_WDT is not set
|
||||||
# CONFIG_IE6XX_WDT is not set
|
# CONFIG_IE6XX_WDT is not set
|
||||||
CONFIG_ITCO_WDT=y
|
# CONFIG_ITCO_WDT is not set
|
||||||
CONFIG_ITCO_VENDOR_SUPPORT=y
|
|
||||||
# CONFIG_IT8712F_WDT is not set
|
# CONFIG_IT8712F_WDT is not set
|
||||||
# CONFIG_IT87_WDT is not set
|
# CONFIG_IT87_WDT is not set
|
||||||
# CONFIG_HP_WATCHDOG is not set
|
# CONFIG_HP_WATCHDOG is not set
|
||||||
|
@ -2768,7 +2720,6 @@ CONFIG_DCA=y
|
||||||
# CONFIG_AUXDISPLAY is not set
|
# CONFIG_AUXDISPLAY is not set
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
# CONFIG_VFIO is not set
|
# CONFIG_VFIO is not set
|
||||||
CONFIG_IRQ_BYPASS_MANAGER=y
|
|
||||||
# CONFIG_VIRT_DRIVERS is not set
|
# CONFIG_VIRT_DRIVERS is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -2947,7 +2898,7 @@ CONFIG_ND_CLAIM=y
|
||||||
CONFIG_ND_BTT=y
|
CONFIG_ND_BTT=y
|
||||||
CONFIG_BTT=y
|
CONFIG_BTT=y
|
||||||
# CONFIG_DEV_DAX is not set
|
# CONFIG_DEV_DAX is not set
|
||||||
# CONFIG_NVMEM is not set
|
CONFIG_NVMEM=y
|
||||||
# CONFIG_STM is not set
|
# CONFIG_STM is not set
|
||||||
# CONFIG_INTEL_TH is not set
|
# CONFIG_INTEL_TH is not set
|
||||||
|
|
||||||
|
@ -3037,7 +2988,6 @@ CONFIG_FSNOTIFY=y
|
||||||
CONFIG_DNOTIFY=y
|
CONFIG_DNOTIFY=y
|
||||||
CONFIG_INOTIFY_USER=y
|
CONFIG_INOTIFY_USER=y
|
||||||
CONFIG_FANOTIFY=y
|
CONFIG_FANOTIFY=y
|
||||||
# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set
|
|
||||||
# CONFIG_QUOTA is not set
|
# CONFIG_QUOTA is not set
|
||||||
# CONFIG_QUOTACTL is not set
|
# CONFIG_QUOTACTL is not set
|
||||||
CONFIG_AUTOFS4_FS=y
|
CONFIG_AUTOFS4_FS=y
|
||||||
|
@ -3338,7 +3288,6 @@ CONFIG_TRACING_SUPPORT=y
|
||||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||||
# CONFIG_RBTREE_TEST is not set
|
# CONFIG_RBTREE_TEST is not set
|
||||||
# CONFIG_ATOMIC64_SELFTEST is not set
|
# CONFIG_ATOMIC64_SELFTEST is not set
|
||||||
# CONFIG_ASYNC_RAID6_TEST is not set
|
|
||||||
# CONFIG_TEST_HEXDUMP is not set
|
# CONFIG_TEST_HEXDUMP is not set
|
||||||
# CONFIG_TEST_STRING_HELPERS is not set
|
# CONFIG_TEST_STRING_HELPERS is not set
|
||||||
# CONFIG_TEST_KSTRTOX is not set
|
# CONFIG_TEST_KSTRTOX is not set
|
||||||
|
@ -3396,37 +3345,16 @@ CONFIG_BIG_KEYS=y
|
||||||
CONFIG_ENCRYPTED_KEYS=y
|
CONFIG_ENCRYPTED_KEYS=y
|
||||||
CONFIG_KEY_DH_OPERATIONS=y
|
CONFIG_KEY_DH_OPERATIONS=y
|
||||||
CONFIG_SECURITY_DMESG_RESTRICT=y
|
CONFIG_SECURITY_DMESG_RESTRICT=y
|
||||||
CONFIG_SECURITY=y
|
# CONFIG_SECURITY is not set
|
||||||
CONFIG_SECURITYFS=y
|
# CONFIG_SECURITYFS is not set
|
||||||
# CONFIG_SECURITY_NETWORK is not set
|
# CONFIG_INTEL_TXT is not set
|
||||||
# CONFIG_SECURITY_PATH is not set
|
|
||||||
CONFIG_INTEL_TXT=y
|
|
||||||
CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
|
CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
|
||||||
CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y
|
CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y
|
||||||
CONFIG_HARDENED_USERCOPY=y
|
CONFIG_HARDENED_USERCOPY=y
|
||||||
CONFIG_HARDENED_USERCOPY_PAGESPAN=y
|
CONFIG_HARDENED_USERCOPY_PAGESPAN=y
|
||||||
# CONFIG_SECURITY_SMACK is not set
|
|
||||||
# CONFIG_SECURITY_TOMOYO is not set
|
|
||||||
# CONFIG_SECURITY_APPARMOR is not set
|
|
||||||
# CONFIG_SECURITY_LOADPIN is not set
|
|
||||||
CONFIG_SECURITY_YAMA=y
|
|
||||||
CONFIG_INTEGRITY=y
|
|
||||||
CONFIG_INTEGRITY_SIGNATURE=y
|
|
||||||
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
|
|
||||||
CONFIG_INTEGRITY_TRUSTED_KEYRING=y
|
|
||||||
# CONFIG_IMA is not set
|
|
||||||
# CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is not set
|
|
||||||
CONFIG_EVM=y
|
|
||||||
CONFIG_EVM_ATTR_FSUUID=y
|
|
||||||
# CONFIG_EVM_LOAD_X509 is not set
|
|
||||||
CONFIG_DEFAULT_SECURITY_DAC=y
|
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||||
CONFIG_DEFAULT_SECURITY=""
|
CONFIG_DEFAULT_SECURITY=""
|
||||||
CONFIG_XOR_BLOCKS=y
|
CONFIG_XOR_BLOCKS=y
|
||||||
CONFIG_ASYNC_CORE=y
|
|
||||||
CONFIG_ASYNC_MEMCPY=y
|
|
||||||
CONFIG_ASYNC_XOR=y
|
|
||||||
CONFIG_ASYNC_PQ=y
|
|
||||||
CONFIG_ASYNC_RAID6_RECOV=y
|
|
||||||
CONFIG_CRYPTO=y
|
CONFIG_CRYPTO=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -3618,25 +3546,7 @@ CONFIG_SYSTEM_TRUSTED_KEYS=""
|
||||||
# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
|
# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
|
||||||
CONFIG_SECONDARY_TRUSTED_KEYRING=y
|
CONFIG_SECONDARY_TRUSTED_KEYRING=y
|
||||||
CONFIG_HAVE_KVM=y
|
CONFIG_HAVE_KVM=y
|
||||||
CONFIG_HAVE_KVM_IRQCHIP=y
|
# CONFIG_VIRTUALIZATION is not set
|
||||||
CONFIG_HAVE_KVM_IRQFD=y
|
|
||||||
CONFIG_HAVE_KVM_IRQ_ROUTING=y
|
|
||||||
CONFIG_HAVE_KVM_EVENTFD=y
|
|
||||||
CONFIG_KVM_MMIO=y
|
|
||||||
CONFIG_KVM_ASYNC_PF=y
|
|
||||||
CONFIG_HAVE_KVM_MSI=y
|
|
||||||
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
|
|
||||||
CONFIG_KVM_VFIO=y
|
|
||||||
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
|
|
||||||
CONFIG_HAVE_KVM_IRQ_BYPASS=y
|
|
||||||
CONFIG_VIRTUALIZATION=y
|
|
||||||
CONFIG_KVM=y
|
|
||||||
CONFIG_KVM_INTEL=y
|
|
||||||
# CONFIG_KVM_AMD is not set
|
|
||||||
# CONFIG_KVM_DEVICE_ASSIGNMENT is not set
|
|
||||||
CONFIG_VHOST_NET=y
|
|
||||||
CONFIG_VHOST=y
|
|
||||||
# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
|
|
||||||
# CONFIG_BINARY_PRINTF is not set
|
# CONFIG_BINARY_PRINTF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -3715,7 +3625,6 @@ CONFIG_CORDIC=y
|
||||||
CONFIG_DDR=y
|
CONFIG_DDR=y
|
||||||
# CONFIG_IRQ_POLL is not set
|
# CONFIG_IRQ_POLL is not set
|
||||||
CONFIG_MPILIB=y
|
CONFIG_MPILIB=y
|
||||||
CONFIG_SIGNATURE=y
|
|
||||||
CONFIG_OID_REGISTRY=y
|
CONFIG_OID_REGISTRY=y
|
||||||
CONFIG_UCS2_STRING=y
|
CONFIG_UCS2_STRING=y
|
||||||
CONFIG_FONT_SUPPORT=y
|
CONFIG_FONT_SUPPORT=y
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
||||||
pkgname=linux-spica
|
pkgname=linux-spica
|
||||||
kernver=4.10.8spica-dirty
|
kernver=4.10.12spica-dirty
|
||||||
#bootdevice="BOOT_IMAGE=/boot/vmlinuz-$pkgname root=UUID=d670564f-2cb3-4981-9d51-6ed9c1327d47"
|
#bootdevice="BOOT_IMAGE=/boot/vmlinuz-$pkgname root=UUID=d670564f-2cb3-4981-9d51-6ed9c1327d47"
|
||||||
#option="rw quiet clocksource=hpet initrd=EFI/spi-ca/initrd intel_iommu=on pci-stub.ids=1002:683f,1002:aab0 vfio_iommu_type1.allow_unsafe_interrupts=1,kvm.ignore_msrs=1"
|
#option="rw quiet clocksource=hpet initrd=EFI/spi-ca/initrd intel_iommu=on pci-stub.ids=1002:683f,1002:aab0 vfio_iommu_type1.allow_unsafe_interrupts=1,kvm.ignore_msrs=1"
|
||||||
#option="rw quiet clocksource=hpet initrd=EFI/spi-ca/initrd quiet intremap=no_x2apic_optout zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lz4"
|
#option="rw quiet clocksource=hpet initrd=EFI/spi-ca/initrd quiet intremap=no_x2apic_optout zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lz4"
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,103 @@
|
||||||
|
From 22ee35ec82fa543b65c1b6d516a086a21f723846 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Paolo Valente <paolo.valente@unimore.it>
|
||||||
|
Date: Tue, 7 Apr 2015 13:39:12 +0200
|
||||||
|
Subject: [PATCH 1/4] block: cgroups, kconfig, build bits for BFQ-v7r11-4.7.0
|
||||||
|
|
||||||
|
Update Kconfig.iosched and do the related Makefile changes to include
|
||||||
|
kernel configuration options for BFQ. Also increase the number of
|
||||||
|
policies supported by the blkio controller so that BFQ can add its
|
||||||
|
own.
|
||||||
|
|
||||||
|
Signed-off-by: Paolo Valente <paolo.valente@unimore.it>
|
||||||
|
Signed-off-by: Arianna Avanzini <avanzini@google.com>
|
||||||
|
---
|
||||||
|
block/Kconfig.iosched | 32 ++++++++++++++++++++++++++++++++
|
||||||
|
block/Makefile | 1 +
|
||||||
|
include/linux/blkdev.h | 2 +-
|
||||||
|
3 files changed, 34 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/block/Kconfig.iosched b/block/Kconfig.iosched
|
||||||
|
index 421bef9..0ee5f0f 100644
|
||||||
|
--- a/block/Kconfig.iosched
|
||||||
|
+++ b/block/Kconfig.iosched
|
||||||
|
@@ -39,6 +39,27 @@ config CFQ_GROUP_IOSCHED
|
||||||
|
---help---
|
||||||
|
Enable group IO scheduling in CFQ.
|
||||||
|
|
||||||
|
+config IOSCHED_BFQ
|
||||||
|
+ tristate "BFQ I/O scheduler"
|
||||||
|
+ default n
|
||||||
|
+ ---help---
|
||||||
|
+ The BFQ I/O scheduler tries to distribute bandwidth among
|
||||||
|
+ all processes according to their weights.
|
||||||
|
+ It aims at distributing the bandwidth as desired, independently of
|
||||||
|
+ the disk parameters and with any workload. It also tries to
|
||||||
|
+ guarantee low latency to interactive and soft real-time
|
||||||
|
+ applications. If compiled built-in (saying Y here), BFQ can
|
||||||
|
+ be configured to support hierarchical scheduling.
|
||||||
|
+
|
||||||
|
+config CGROUP_BFQIO
|
||||||
|
+ bool "BFQ hierarchical scheduling support"
|
||||||
|
+ depends on CGROUPS && IOSCHED_BFQ=y
|
||||||
|
+ default n
|
||||||
|
+ ---help---
|
||||||
|
+ Enable hierarchical scheduling in BFQ, using the cgroups
|
||||||
|
+ filesystem interface. The name of the subsystem will be
|
||||||
|
+ bfqio.
|
||||||
|
+
|
||||||
|
choice
|
||||||
|
prompt "Default I/O scheduler"
|
||||||
|
default DEFAULT_CFQ
|
||||||
|
@@ -52,6 +73,16 @@ choice
|
||||||
|
config DEFAULT_CFQ
|
||||||
|
bool "CFQ" if IOSCHED_CFQ=y
|
||||||
|
|
||||||
|
+ config DEFAULT_BFQ
|
||||||
|
+ bool "BFQ" if IOSCHED_BFQ=y
|
||||||
|
+ help
|
||||||
|
+ Selects BFQ as the default I/O scheduler which will be
|
||||||
|
+ used by default for all block devices.
|
||||||
|
+ The BFQ I/O scheduler aims at distributing the bandwidth
|
||||||
|
+ as desired, independently of the disk parameters and with
|
||||||
|
+ any workload. It also tries to guarantee low latency to
|
||||||
|
+ interactive and soft real-time applications.
|
||||||
|
+
|
||||||
|
config DEFAULT_NOOP
|
||||||
|
bool "No-op"
|
||||||
|
|
||||||
|
@@ -61,6 +92,7 @@ config DEFAULT_IOSCHED
|
||||||
|
string
|
||||||
|
default "deadline" if DEFAULT_DEADLINE
|
||||||
|
default "cfq" if DEFAULT_CFQ
|
||||||
|
+ default "bfq" if DEFAULT_BFQ
|
||||||
|
default "noop" if DEFAULT_NOOP
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
diff --git a/block/Makefile b/block/Makefile
|
||||||
|
index 9eda232..4a36683 100644
|
||||||
|
--- a/block/Makefile
|
||||||
|
+++ b/block/Makefile
|
||||||
|
@@ -18,6 +18,7 @@ obj-$(CONFIG_BLK_DEV_THROTTLING) += blk-throttle.o
|
||||||
|
obj-$(CONFIG_IOSCHED_NOOP) += noop-iosched.o
|
||||||
|
obj-$(CONFIG_IOSCHED_DEADLINE) += deadline-iosched.o
|
||||||
|
obj-$(CONFIG_IOSCHED_CFQ) += cfq-iosched.o
|
||||||
|
+obj-$(CONFIG_IOSCHED_BFQ) += bfq-iosched.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_BLOCK_COMPAT) += compat_ioctl.o
|
||||||
|
obj-$(CONFIG_BLK_CMDLINE_PARSER) += cmdline-parser.o
|
||||||
|
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
|
||||||
|
index 3d9cf32..8d862a0 100644
|
||||||
|
--- a/include/linux/blkdev.h
|
||||||
|
+++ b/include/linux/blkdev.h
|
||||||
|
@@ -45,7 +45,7 @@ struct pr_ops;
|
||||||
|
* Maximum number of blkcg policies allowed to be registered concurrently.
|
||||||
|
* Defined here to simplify include dependency.
|
||||||
|
*/
|
||||||
|
-#define BLKCG_MAX_POLS 2
|
||||||
|
+#define BLKCG_MAX_POLS 3
|
||||||
|
|
||||||
|
struct request;
|
||||||
|
typedef void (rq_end_io_fn)(struct request *, int);
|
||||||
|
--
|
||||||
|
1.9.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,708 @@
|
||||||
|
BLD changes for Linux kernel version 4.7
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/init/Kconfig b/init/Kconfig
|
||||||
|
index c02d897..edf8697 100644
|
||||||
|
--- a/init/Kconfig
|
||||||
|
+++ b/init/Kconfig
|
||||||
|
@@ -36,6 +36,15 @@ config BROKEN_ON_SMP
|
||||||
|
depends on BROKEN || !SMP
|
||||||
|
default y
|
||||||
|
|
||||||
|
+config BLD
|
||||||
|
+ bool "An alternate CPU load distribution technique for task scheduler"
|
||||||
|
+ depends on SMP
|
||||||
|
+ default y
|
||||||
|
+ help
|
||||||
|
+ This is an alternate CPU load distribution technique based for task
|
||||||
|
+ scheduler based on The Barbershop Load Distribution algorithm. Not
|
||||||
|
+ suitable for NUMA, should work well on SMP.
|
||||||
|
+
|
||||||
|
config INIT_ENV_ARG_LIMIT
|
||||||
|
int
|
||||||
|
default 32 if !UML
|
||||||
|
diff --git a/kernel/sched/bld.h b/kernel/sched/bld.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..f1f9fba
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/kernel/sched/bld.h
|
||||||
|
@@ -0,0 +1,215 @@
|
||||||
|
+#ifdef CONFIG_BLD
|
||||||
|
+
|
||||||
|
+static DEFINE_RWLOCK(rt_list_lock);
|
||||||
|
+static LIST_HEAD(rt_rq_head);
|
||||||
|
+static LIST_HEAD(cfs_rq_head);
|
||||||
|
+static DEFINE_RWLOCK(cfs_list_lock);
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
|
+static inline struct rq *rq_of_cfs(struct cfs_rq *cfs_rq)
|
||||||
|
+{
|
||||||
|
+ return cfs_rq->rq;
|
||||||
|
+}
|
||||||
|
+#else
|
||||||
|
+static inline struct rq *rq_of_cfs(struct cfs_rq *cfs_rq)
|
||||||
|
+{
|
||||||
|
+ return container_of(cfs_rq, struct rq, cfs);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_RT_GROUP_SCHED
|
||||||
|
+static inline struct rq *rq_of_rt(struct rt_rq *rt_rq)
|
||||||
|
+{
|
||||||
|
+ return rt_rq->rq;
|
||||||
|
+}
|
||||||
|
+#else
|
||||||
|
+static inline struct rq *rq_of_rt(struct rt_rq *rt_rq)
|
||||||
|
+{
|
||||||
|
+ return container_of(rt_rq, struct rq, rt);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+static int select_cpu_for_wakeup(int task_type, struct cpumask *mask)
|
||||||
|
+{
|
||||||
|
+ int cpu = smp_processor_id(), i;
|
||||||
|
+ unsigned long load, varload;
|
||||||
|
+ struct rq *rq;
|
||||||
|
+
|
||||||
|
+ if (task_type) {
|
||||||
|
+ varload = ULONG_MAX;
|
||||||
|
+ for_each_cpu(i, mask) {
|
||||||
|
+ rq = cpu_rq(i);
|
||||||
|
+ load = rq->cfs.load.weight;
|
||||||
|
+ if (load < varload) {
|
||||||
|
+ varload = load;
|
||||||
|
+ cpu = i;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ /* Here's an attempt to get a CPU within the mask where
|
||||||
|
+ * we can preempt easily. To achieve this we tried to
|
||||||
|
+ * maintain a lowbit, which indicate the lowest bit set on
|
||||||
|
+ * array bitmap. Since all CPUs contains high priority
|
||||||
|
+ * kernel threads therefore we eliminate 0, so it might not
|
||||||
|
+ * be right every time, but it's just an indicator.
|
||||||
|
+ */
|
||||||
|
+ varload = 1;
|
||||||
|
+
|
||||||
|
+ for_each_cpu(i, mask) {
|
||||||
|
+ rq = cpu_rq(i);
|
||||||
|
+ load = rq->rt.lowbit;
|
||||||
|
+ if (load >= varload) {
|
||||||
|
+ varload = load;
|
||||||
|
+ cpu = i;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return cpu;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bld_pick_cpu_cfs(struct task_struct *p, int sd_flags, int wake_flags)
|
||||||
|
+{
|
||||||
|
+ struct cfs_rq *cfs;
|
||||||
|
+ unsigned long flags;
|
||||||
|
+ unsigned int cpu = smp_processor_id();
|
||||||
|
+
|
||||||
|
+ read_lock_irqsave(&cfs_list_lock, flags);
|
||||||
|
+ list_for_each_entry(cfs, &cfs_rq_head, bld_cfs_list) {
|
||||||
|
+ cpu = cpu_of(rq_of_cfs(cfs));
|
||||||
|
+ if (cpu_online(cpu))
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ read_unlock_irqrestore(&cfs_list_lock, flags);
|
||||||
|
+ return cpu;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bld_pick_cpu_rt(struct task_struct *p, int sd_flags, int wake_flags)
|
||||||
|
+{
|
||||||
|
+ struct rt_rq *rt;
|
||||||
|
+ unsigned long flags;
|
||||||
|
+ unsigned int cpu = smp_processor_id();
|
||||||
|
+
|
||||||
|
+ read_lock_irqsave(&rt_list_lock, flags);
|
||||||
|
+ list_for_each_entry(rt, &rt_rq_head, bld_rt_list) {
|
||||||
|
+ cpu = cpu_of(rq_of_rt(rt));
|
||||||
|
+ if (cpu_online(cpu))
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ read_unlock_irqrestore(&rt_list_lock, flags);
|
||||||
|
+ return cpu;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bld_pick_cpu_domain(struct task_struct *p, int sd_flags, int wake_flags)
|
||||||
|
+{
|
||||||
|
+ unsigned int cpu = smp_processor_id(), want_affine = 0;
|
||||||
|
+ struct cpumask *tmpmask;
|
||||||
|
+
|
||||||
|
+ if (p->nr_cpus_allowed == 1)
|
||||||
|
+ return task_cpu(p);
|
||||||
|
+
|
||||||
|
+ if (sd_flags & SD_BALANCE_WAKE) {
|
||||||
|
+ if (cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) {
|
||||||
|
+ want_affine = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (want_affine)
|
||||||
|
+ tmpmask = tsk_cpus_allowed(p);
|
||||||
|
+ else
|
||||||
|
+ tmpmask = sched_domain_span(cpu_rq(task_cpu(p))->sd);
|
||||||
|
+
|
||||||
|
+ if (rt_task(p))
|
||||||
|
+ cpu = select_cpu_for_wakeup(0, tmpmask);
|
||||||
|
+ else
|
||||||
|
+ cpu = select_cpu_for_wakeup(1, tmpmask);
|
||||||
|
+
|
||||||
|
+ return cpu;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void track_load_rt(struct rq *rq, struct task_struct *p)
|
||||||
|
+{
|
||||||
|
+ unsigned long flag;
|
||||||
|
+ int firstbit;
|
||||||
|
+ struct rt_rq *first;
|
||||||
|
+ struct rt_prio_array *array = &rq->rt.active;
|
||||||
|
+
|
||||||
|
+ first = list_entry(rt_rq_head.next, struct rt_rq, bld_rt_list);
|
||||||
|
+ firstbit = sched_find_first_bit(array->bitmap);
|
||||||
|
+
|
||||||
|
+ /* Maintaining rt.lowbit */
|
||||||
|
+ if (firstbit > 0 && firstbit <= rq->rt.lowbit)
|
||||||
|
+ rq->rt.lowbit = firstbit;
|
||||||
|
+
|
||||||
|
+ if (rq->rt.lowbit < first->lowbit) {
|
||||||
|
+ write_lock_irqsave(&rt_list_lock, flag);
|
||||||
|
+ list_del(&rq->rt.bld_rt_list);
|
||||||
|
+ list_add_tail(&rq->rt.bld_rt_list, &rt_rq_head);
|
||||||
|
+ write_unlock_irqrestore(&rt_list_lock, flag);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bld_get_cpu(struct task_struct *p, int sd_flags, int wake_flags)
|
||||||
|
+{
|
||||||
|
+ unsigned int cpu;
|
||||||
|
+
|
||||||
|
+ if (sd_flags == SD_BALANCE_WAKE || (sd_flags == SD_BALANCE_EXEC && (get_nr_threads(p) > 1)))
|
||||||
|
+ cpu = bld_pick_cpu_domain(p, sd_flags, wake_flags);
|
||||||
|
+ else {
|
||||||
|
+ if (rt_task(p))
|
||||||
|
+ cpu = bld_pick_cpu_rt(p, sd_flags, wake_flags);
|
||||||
|
+ else
|
||||||
|
+ cpu = bld_pick_cpu_cfs(p, sd_flags, wake_flags);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return cpu;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void bld_track_load_activate(struct rq *rq, struct task_struct *p)
|
||||||
|
+{
|
||||||
|
+ unsigned long flag;
|
||||||
|
+ if (rt_task(p)) {
|
||||||
|
+ track_load_rt(rq, p);
|
||||||
|
+ } else {
|
||||||
|
+ if (rq->cfs.pos != 2) {
|
||||||
|
+ struct cfs_rq *last;
|
||||||
|
+ last = list_entry(cfs_rq_head.prev, struct cfs_rq, bld_cfs_list);
|
||||||
|
+ if (rq->cfs.load.weight >= last->load.weight) {
|
||||||
|
+ write_lock_irqsave(&cfs_list_lock, flag);
|
||||||
|
+ list_del(&rq->cfs.bld_cfs_list);
|
||||||
|
+ list_add_tail(&rq->cfs.bld_cfs_list, &cfs_rq_head);
|
||||||
|
+ rq->cfs.pos = 2; last->pos = 1;
|
||||||
|
+ write_unlock_irqrestore(&cfs_list_lock, flag);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void bld_track_load_deactivate(struct rq *rq, struct task_struct *p)
|
||||||
|
+{
|
||||||
|
+ unsigned long flag;
|
||||||
|
+ if (rt_task(p)) {
|
||||||
|
+ track_load_rt(rq, p);
|
||||||
|
+ } else {
|
||||||
|
+ if (rq->cfs.pos != 0) {
|
||||||
|
+ struct cfs_rq *first;
|
||||||
|
+ first = list_entry(cfs_rq_head.next, struct cfs_rq, bld_cfs_list);
|
||||||
|
+ if (rq->cfs.load.weight <= first->load.weight) {
|
||||||
|
+ write_lock_irqsave(&cfs_list_lock, flag);
|
||||||
|
+ list_del(&rq->cfs.bld_cfs_list);
|
||||||
|
+ list_add(&rq->cfs.bld_cfs_list, &cfs_rq_head);
|
||||||
|
+ rq->cfs.pos = 0; first->pos = 1;
|
||||||
|
+ write_unlock_irqrestore(&cfs_list_lock, flag);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+#else
|
||||||
|
+static inline void bld_track_load_activate(struct rq *rq, struct task_struct *p)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void bld_track_load_deactivate(struct rq *rq, struct task_struct *p)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||||||
|
index 97ee9ac..b2ddabc 100644
|
||||||
|
--- a/kernel/sched/core.c
|
||||||
|
+++ b/kernel/sched/core.c
|
||||||
|
@@ -24,6 +24,8 @@
|
||||||
|
* 2007-07-01 Group scheduling enhancements by Srivatsa Vaddagiri
|
||||||
|
* 2007-11-29 RT balancing improvements by Steven Rostedt, Gregory Haskins,
|
||||||
|
* Thomas Gleixner, Mike Kravetz
|
||||||
|
+ * 2012-Feb The Barbershop Load Distribution (BLD) algorithm - an alternate
|
||||||
|
+ * CPU load distribution technique for kernel scheduler by Rakib Mullick.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kasan.h>
|
||||||
|
@@ -86,6 +88,7 @@
|
||||||
|
#include "sched.h"
|
||||||
|
#include "../workqueue_internal.h"
|
||||||
|
#include "../smpboot.h"
|
||||||
|
+#include "bld.h"
|
||||||
|
|
||||||
|
#define CREATE_TRACE_POINTS
|
||||||
|
#include <trace/events/sched.h>
|
||||||
|
@@ -750,6 +753,8 @@ static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags)
|
||||||
|
if (!(flags & ENQUEUE_RESTORE))
|
||||||
|
sched_info_queued(rq, p);
|
||||||
|
p->sched_class->enqueue_task(rq, p, flags);
|
||||||
|
+ if (!dl_task(p))
|
||||||
|
+ bld_track_load_activate(rq, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags)
|
||||||
|
@@ -758,6 +763,8 @@ static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags)
|
||||||
|
if (!(flags & DEQUEUE_SAVE))
|
||||||
|
sched_info_dequeued(rq, p);
|
||||||
|
p->sched_class->dequeue_task(rq, p, flags);
|
||||||
|
+ if (!dl_task(p))
|
||||||
|
+ bld_track_load_deactivate(rq, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void activate_task(struct rq *rq, struct task_struct *p, int flags)
|
||||||
|
@@ -1587,11 +1594,17 @@ int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags)
|
||||||
|
{
|
||||||
|
lockdep_assert_held(&p->pi_lock);
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
if (tsk_nr_cpus_allowed(p) > 1)
|
||||||
|
cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags);
|
||||||
|
else
|
||||||
|
cpu = cpumask_any(tsk_cpus_allowed(p));
|
||||||
|
-
|
||||||
|
+#else
|
||||||
|
+ if (dl_task(p))
|
||||||
|
+ cpu = dl_sched_class.select_task_rq(p, cpu, sd_flags, wake_flags);
|
||||||
|
+ else
|
||||||
|
+ cpu = bld_get_cpu(p, sd_flags, wake_flags);
|
||||||
|
+#endif
|
||||||
|
/*
|
||||||
|
* In order not to call set_task_cpu() on a blocking task we need
|
||||||
|
* to rely on ttwu() to place the task on a valid ->cpus_allowed
|
||||||
|
@@ -1794,7 +1807,11 @@ void scheduler_ipi(void)
|
||||||
|
*/
|
||||||
|
preempt_fold_need_resched();
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
if (llist_empty(&this_rq()->wake_list) && !got_nohz_idle_kick())
|
||||||
|
+#else
|
||||||
|
+ if (llist_empty(&this_rq()->wake_list))
|
||||||
|
+#endif
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1816,13 +1833,16 @@ void scheduler_ipi(void)
|
||||||
|
/*
|
||||||
|
* Check if someone kicked us for doing the nohz idle load balance.
|
||||||
|
*/
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
if (unlikely(got_nohz_idle_kick())) {
|
||||||
|
this_rq()->idle_balance = 1;
|
||||||
|
raise_softirq_irqoff(SCHED_SOFTIRQ);
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
irq_exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
static void ttwu_queue_remote(struct task_struct *p, int cpu, int wake_flags)
|
||||||
|
{
|
||||||
|
struct rq *rq = cpu_rq(cpu);
|
||||||
|
@@ -1836,6 +1856,7 @@ static void ttwu_queue_remote(struct task_struct *p, int cpu, int wake_flags)
|
||||||
|
trace_sched_wake_idle_without_ipi(cpu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
|
||||||
|
void wake_up_if_idle(int cpu)
|
||||||
|
{
|
||||||
|
@@ -1872,7 +1893,7 @@ static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags)
|
||||||
|
struct rq *rq = cpu_rq(cpu);
|
||||||
|
struct pin_cookie cookie;
|
||||||
|
|
||||||
|
-#if defined(CONFIG_SMP)
|
||||||
|
+#if defined(CONFIG_SMP) && !defined(CONFIG_BLD)
|
||||||
|
if (sched_feat(TTWU_QUEUE) && !cpus_share_cache(smp_processor_id(), cpu)) {
|
||||||
|
sched_clock_cpu(cpu); /* sync clocks x-cpu */
|
||||||
|
ttwu_queue_remote(p, cpu, wake_flags);
|
||||||
|
@@ -2394,7 +2415,7 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p)
|
||||||
|
* Silence PROVE_RCU.
|
||||||
|
*/
|
||||||
|
raw_spin_lock_irqsave(&p->pi_lock, flags);
|
||||||
|
- set_task_cpu(p, cpu);
|
||||||
|
+ __set_task_cpu(p, cpu);
|
||||||
|
raw_spin_unlock_irqrestore(&p->pi_lock, flags);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_INFO
|
||||||
|
@@ -2941,7 +2962,14 @@ void sched_exec(void)
|
||||||
|
int dest_cpu;
|
||||||
|
|
||||||
|
raw_spin_lock_irqsave(&p->pi_lock, flags);
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
dest_cpu = p->sched_class->select_task_rq(p, task_cpu(p), SD_BALANCE_EXEC, 0);
|
||||||
|
+#else
|
||||||
|
+ if (dl_task(p))
|
||||||
|
+ dest_cpu = task_cpu(p);
|
||||||
|
+ else
|
||||||
|
+ dest_cpu = bld_get_cpu(p, SD_BALANCE_EXEC, 0);
|
||||||
|
+#endif
|
||||||
|
if (dest_cpu == smp_processor_id())
|
||||||
|
goto unlock;
|
||||||
|
|
||||||
|
@@ -3030,8 +3058,10 @@ void scheduler_tick(void)
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
rq->idle_balance = idle_cpu(cpu);
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
trigger_load_balance(rq);
|
||||||
|
#endif
|
||||||
|
+#endif
|
||||||
|
rq_last_tick_reset(rq);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -7262,7 +7292,9 @@ int sched_cpu_dying(unsigned int cpu)
|
||||||
|
raw_spin_unlock_irqrestore(&rq->lock, flags);
|
||||||
|
calc_load_migrate(rq);
|
||||||
|
update_max_interval();
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
nohz_balance_exit_idle(cpu);
|
||||||
|
+#endif
|
||||||
|
hrtick_clear(rq);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -7468,6 +7500,15 @@ void __init sched_init(void)
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
init_rq_hrtick(rq);
|
||||||
|
atomic_set(&rq->nr_iowait, 0);
|
||||||
|
+#ifdef CONFIG_BLD
|
||||||
|
+ INIT_LIST_HEAD(&rq->cfs.bld_cfs_list);
|
||||||
|
+ list_add_tail(&rq->cfs.bld_cfs_list, &cfs_rq_head);
|
||||||
|
+ rq->cfs.pos = 0;
|
||||||
|
+
|
||||||
|
+ INIT_LIST_HEAD(&rq->rt.bld_rt_list);
|
||||||
|
+ list_add_tail(&rq->rt.bld_rt_list, &rt_rq_head);
|
||||||
|
+ rq->rt.lowbit = INT_MAX;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
set_load_weight(&init_task);
|
||||||
|
@@ -7510,6 +7551,9 @@ void __init sched_init(void)
|
||||||
|
init_schedstats();
|
||||||
|
|
||||||
|
scheduler_running = 1;
|
||||||
|
+#ifdef CONFIG_BLD
|
||||||
|
+ printk(KERN_INFO "BLD: An Alternate CPU load distributor activated.\n");
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
|
||||||
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
||||||
|
index c8c5d2d..5b694b3 100644
|
||||||
|
--- a/kernel/sched/fair.c
|
||||||
|
+++ b/kernel/sched/fair.c
|
||||||
|
@@ -4880,6 +4880,7 @@ static unsigned long cpu_avg_load_per_task(int cpu)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
|
/*
|
||||||
|
* effective_load() calculates the load change as seen from the root_task_group
|
||||||
|
@@ -5411,6 +5412,7 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_f
|
||||||
|
|
||||||
|
return new_cpu;
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called immediately before a task is migrated to a new cpu; task_cpu(p) and
|
||||||
|
@@ -5741,6 +5743,7 @@ idle:
|
||||||
|
* further scheduler activity on it and we're being very careful to
|
||||||
|
* re-start the picking loop.
|
||||||
|
*/
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
lockdep_unpin_lock(&rq->lock, cookie);
|
||||||
|
new_tasks = idle_balance(rq);
|
||||||
|
lockdep_repin_lock(&rq->lock, cookie);
|
||||||
|
@@ -5754,7 +5757,7 @@ idle:
|
||||||
|
|
||||||
|
if (new_tasks > 0)
|
||||||
|
goto again;
|
||||||
|
-
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -6415,8 +6418,9 @@ static unsigned long task_h_load(struct task_struct *p)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-/********** Helpers for find_busiest_group ************************/
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
|
||||||
|
+/********** Helpers for find_busiest_group ************************/
|
||||||
|
enum group_type {
|
||||||
|
group_other = 0,
|
||||||
|
group_imbalanced,
|
||||||
|
@@ -6507,6 +6511,7 @@ static inline int get_sd_load_idx(struct sched_domain *sd,
|
||||||
|
|
||||||
|
return load_idx;
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
|
||||||
|
static unsigned long scale_rt_capacity(int cpu)
|
||||||
|
{
|
||||||
|
@@ -6615,6 +6620,7 @@ void update_group_capacity(struct sched_domain *sd, int cpu)
|
||||||
|
sdg->sgc->capacity = capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
/*
|
||||||
|
* Check whether the capacity of the rq has been noticeably reduced by side
|
||||||
|
* activity. The imbalance_pct is used for the threshold.
|
||||||
|
@@ -7848,6 +7854,7 @@ static inline int on_null_domain(struct rq *rq)
|
||||||
|
{
|
||||||
|
return unlikely(!rcu_dereference_sched(rq->sd));
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
|
/*
|
||||||
|
@@ -7856,12 +7863,39 @@ static inline int on_null_domain(struct rq *rq)
|
||||||
|
* needed, they will kick the idle load balancer, which then does idle
|
||||||
|
* load balancing for all the idle CPUs.
|
||||||
|
*/
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
static struct {
|
||||||
|
cpumask_var_t idle_cpus_mask;
|
||||||
|
atomic_t nr_cpus;
|
||||||
|
unsigned long next_balance; /* in jiffy units */
|
||||||
|
} nohz ____cacheline_aligned;
|
||||||
|
|
||||||
|
+void nohz_balance_exit_idle(unsigned int cpu)
|
||||||
|
+{
|
||||||
|
+ if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) {
|
||||||
|
+ /*
|
||||||
|
+ * Completely isolated CPUs don't ever set, so we must test.
|
||||||
|
+ */
|
||||||
|
+ if (likely(cpumask_test_cpu(cpu, nohz.idle_cpus_mask))) {
|
||||||
|
+ cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
|
||||||
|
+ atomic_dec(&nohz.nr_cpus);
|
||||||
|
+ }
|
||||||
|
+ clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sched_ilb_notifier(struct notifier_block *nfb,
|
||||||
|
+ unsigned long action, void *hcpu)
|
||||||
|
+{
|
||||||
|
+ switch (action & ~CPU_TASKS_FROZEN) {
|
||||||
|
+ case CPU_DYING:
|
||||||
|
+ nohz_balance_exit_idle(smp_processor_id());
|
||||||
|
+ return NOTIFY_OK;
|
||||||
|
+ default:
|
||||||
|
+ return NOTIFY_DONE;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static inline int find_new_ilb(void)
|
||||||
|
{
|
||||||
|
int ilb = cpumask_first(nohz.idle_cpus_mask);
|
||||||
|
@@ -7900,20 +7934,6 @@ static void nohz_balancer_kick(void)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void nohz_balance_exit_idle(unsigned int cpu)
|
||||||
|
-{
|
||||||
|
- if (unlikely(test_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu)))) {
|
||||||
|
- /*
|
||||||
|
- * Completely isolated CPUs don't ever set, so we must test.
|
||||||
|
- */
|
||||||
|
- if (likely(cpumask_test_cpu(cpu, nohz.idle_cpus_mask))) {
|
||||||
|
- cpumask_clear_cpu(cpu, nohz.idle_cpus_mask);
|
||||||
|
- atomic_dec(&nohz.nr_cpus);
|
||||||
|
- }
|
||||||
|
- clear_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static inline void set_cpu_sd_state_busy(void)
|
||||||
|
{
|
||||||
|
struct sched_domain *sd;
|
||||||
|
@@ -7930,6 +7950,8 @@ static inline void set_cpu_sd_state_busy(void)
|
||||||
|
unlock:
|
||||||
|
rcu_read_unlock();
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
+#endif /* NO_HZ_COMMON */
|
||||||
|
|
||||||
|
void set_cpu_sd_state_idle(void)
|
||||||
|
{
|
||||||
|
@@ -7954,6 +7976,7 @@ unlock:
|
||||||
|
*/
|
||||||
|
void nohz_balance_enter_idle(int cpu)
|
||||||
|
{
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
/*
|
||||||
|
* If this cpu is going down, then nothing needs to be done.
|
||||||
|
*/
|
||||||
|
@@ -7972,10 +7995,8 @@ void nohz_balance_enter_idle(int cpu)
|
||||||
|
cpumask_set_cpu(cpu, nohz.idle_cpus_mask);
|
||||||
|
atomic_inc(&nohz.nr_cpus);
|
||||||
|
set_bit(NOHZ_TICK_STOPPED, nohz_flags(cpu));
|
||||||
|
-}
|
||||||
|
#endif
|
||||||
|
-
|
||||||
|
-static DEFINE_SPINLOCK(balancing);
|
||||||
|
+}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scale the max load_balance interval with the number of CPUs in the system.
|
||||||
|
@@ -7986,6 +8007,9 @@ void update_max_interval(void)
|
||||||
|
max_load_balance_interval = HZ*num_online_cpus()/10;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
+static DEFINE_SPINLOCK(balancing);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* It checks each scheduling domain to see if it is due to be balanced,
|
||||||
|
* and initiates a balancing operation if so.
|
||||||
|
@@ -8273,6 +8297,7 @@ void trigger_load_balance(struct rq *rq)
|
||||||
|
nohz_balancer_kick();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
|
||||||
|
static void rq_online_fair(struct rq *rq)
|
||||||
|
{
|
||||||
|
@@ -8288,7 +8313,6 @@ static void rq_offline_fair(struct rq *rq)
|
||||||
|
/* Ensure any throttled groups are reachable by pick_next_task */
|
||||||
|
unthrottle_offline_cfs_rqs(rq);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -8716,7 +8740,9 @@ const struct sched_class fair_sched_class = {
|
||||||
|
.put_prev_task = put_prev_task_fair,
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
.select_task_rq = select_task_rq_fair,
|
||||||
|
+#endif
|
||||||
|
.migrate_task_rq = migrate_task_rq_fair,
|
||||||
|
|
||||||
|
.rq_online = rq_online_fair,
|
||||||
|
@@ -8777,6 +8803,7 @@ void show_numa_stats(struct task_struct *p, struct seq_file *m)
|
||||||
|
|
||||||
|
__init void init_sched_fair_class(void)
|
||||||
|
{
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
open_softirq(SCHED_SOFTIRQ, run_rebalance_domains);
|
||||||
|
|
||||||
|
@@ -8785,5 +8812,5 @@ __init void init_sched_fair_class(void)
|
||||||
|
zalloc_cpumask_var(&nohz.idle_cpus_mask, GFP_NOWAIT);
|
||||||
|
#endif
|
||||||
|
#endif /* SMP */
|
||||||
|
-
|
||||||
|
+#endif /* BLD */
|
||||||
|
}
|
||||||
|
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
|
||||||
|
index d5690b7..6f3589e 100644
|
||||||
|
--- a/kernel/sched/rt.c
|
||||||
|
+++ b/kernel/sched/rt.c
|
||||||
|
@@ -1375,6 +1375,7 @@ static void yield_task_rt(struct rq *rq)
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
static int find_lowest_rq(struct task_struct *task);
|
||||||
|
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
static int
|
||||||
|
select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags)
|
||||||
|
{
|
||||||
|
@@ -1430,6 +1431,7 @@ select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags)
|
||||||
|
out:
|
||||||
|
return cpu;
|
||||||
|
}
|
||||||
|
+#endif /* CONFIG_BLD */
|
||||||
|
|
||||||
|
static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p)
|
||||||
|
{
|
||||||
|
@@ -2335,7 +2337,9 @@ const struct sched_class rt_sched_class = {
|
||||||
|
.put_prev_task = put_prev_task_rt,
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
+#ifndef CONFIG_BLD
|
||||||
|
.select_task_rq = select_task_rq_rt,
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
.set_cpus_allowed = set_cpus_allowed_common,
|
||||||
|
.rq_online = rq_online_rt,
|
||||||
|
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
|
||||||
|
index 898c0d2..720d524 100644
|
||||||
|
--- a/kernel/sched/sched.h
|
||||||
|
+++ b/kernel/sched/sched.h
|
||||||
|
@@ -415,9 +415,8 @@ struct cfs_rq {
|
||||||
|
#endif /* CONFIG_FAIR_GROUP_SCHED */
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
|
-#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
|
struct rq *rq; /* cpu runqueue to which this cfs_rq is attached */
|
||||||
|
-
|
||||||
|
+#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
|
/*
|
||||||
|
* leaf cfs_rqs are those that hold tasks (lowest schedulable entity in
|
||||||
|
* a hierarchy). Non-leaf lrqs hold other higher schedulable entities
|
||||||
|
@@ -441,6 +440,11 @@ struct cfs_rq {
|
||||||
|
struct list_head throttled_list;
|
||||||
|
#endif /* CONFIG_CFS_BANDWIDTH */
|
||||||
|
#endif /* CONFIG_FAIR_GROUP_SCHED */
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_BLD
|
||||||
|
+ struct list_head bld_cfs_list;
|
||||||
|
+ char pos;
|
||||||
|
+#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int rt_bandwidth_enabled(void)
|
||||||
|
@@ -486,12 +490,16 @@ struct rt_rq {
|
||||||
|
/* Nests inside the rq lock: */
|
||||||
|
raw_spinlock_t rt_runtime_lock;
|
||||||
|
|
||||||
|
+ struct rq *rq;
|
||||||
|
#ifdef CONFIG_RT_GROUP_SCHED
|
||||||
|
unsigned long rt_nr_boosted;
|
||||||
|
|
||||||
|
- struct rq *rq;
|
||||||
|
struct task_group *tg;
|
||||||
|
#endif
|
||||||
|
+#ifdef CONFIG_BLD
|
||||||
|
+ struct list_head bld_rt_list;
|
||||||
|
+ int lowbit;
|
||||||
|
+#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Deadline class' related fields in a runqueue */
|
|
@ -0,0 +1,77 @@
|
||||||
|
From 33ceb32e7abc13e6a5f27916f49fa7188a13978f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Corinna Vinschen <vinschen@redhat.com>
|
||||||
|
Date: Fri, 3 Jun 2016 09:40:11 -0400
|
||||||
|
Subject: [PATCH] igb: Allow to remove administratively set MAC on VFs
|
||||||
|
|
||||||
|
Before libvirt modifies the MAC address and vlan tag for an SRIOV VF
|
||||||
|
for use by a virtual machine (either using vfio device assignment or
|
||||||
|
macvtap passthru mode), it saves the current MAC address and vlan tag
|
||||||
|
so that it can reset them to their original value when the guest is
|
||||||
|
done. (libvirt can't leave the VF MAC set to the value used by the
|
||||||
|
now-defunct guest (since it may be started again later using a
|
||||||
|
different VF), but it certainly shouldn't just pick any random value,
|
||||||
|
either. So it saves the state of everything prior to using the VF, and
|
||||||
|
resets it to that.)
|
||||||
|
|
||||||
|
The igb driver initializes the MAC addresses of all VFs to
|
||||||
|
00:00:00:00:00:00, and reports that when asked (via an RTM_GETLINK
|
||||||
|
netlink message, also visible in the list of VFs in the output of "ip
|
||||||
|
link show"). But when libvirt attempts to restore the MAC address back
|
||||||
|
to 00:00:00:00:00:00 (using an RTM_SETLINK netlink message) the kernel
|
||||||
|
responds with "Invalid argument".
|
||||||
|
|
||||||
|
However, to allow libvirt to revert to the original state, we need a
|
||||||
|
way to remove the administrative set MAC on a VF, to allow normal host
|
||||||
|
operation again, and to reset/overwrite the VF MAC via VF netdev.
|
||||||
|
|
||||||
|
This patch implements the aforementioned scenario by allowing to set
|
||||||
|
the VF MAC to 00:00:00:00:00:00 via RTM_SETLINK on the PF.
|
||||||
|
igb_ndo_set_vf_mac resets the IGB_VF_FLAG_PF_SET_MAC flag to 0,
|
||||||
|
so it's possible to reset the VF MAC back to the original value via
|
||||||
|
the VF netdev.
|
||||||
|
|
||||||
|
Signed-off-by: Corinna Vinschen <vinschen@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/intel/igb/igb_main.c | 25 ++++++++++++++++++++-----
|
||||||
|
1 file changed, 20 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
|
||||||
|
index 8e96c35..7be9279 100644
|
||||||
|
--- a/drivers/net/ethernet/intel/igb/igb_main.c
|
||||||
|
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
|
||||||
|
@@ -7890,12 +7890,27 @@ static int igb_set_vf_mac(struct igb_adapter *adapter,
|
||||||
|
static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
|
||||||
|
{
|
||||||
|
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||||
|
- if (!is_valid_ether_addr(mac) || (vf >= adapter->vfs_allocated_count))
|
||||||
|
+
|
||||||
|
+ if (vf >= adapter->vfs_allocated_count)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ /* Setting the VF MAC to 0 reverts the IGB_VF_FLAG_PF_SET_MAC
|
||||||
|
+ flag and allows to overwrite the MAC via VF netdev. This
|
||||||
|
+ is necessary to allow libvirt a way to restore the original
|
||||||
|
+ MAC after unbinding vfio-pci and reloading igbvf after shutting
|
||||||
|
+ down a VM. */
|
||||||
|
+ if (is_zero_ether_addr(mac)) {
|
||||||
|
+ adapter->vf_data[vf].flags &= ~IGB_VF_FLAG_PF_SET_MAC;
|
||||||
|
+ dev_info(&adapter->pdev->dev,
|
||||||
|
+ "remove administratively set MAC on VF %d\n",
|
||||||
|
+ vf);
|
||||||
|
+ } else if (is_valid_ether_addr (mac)) {
|
||||||
|
+ adapter->vf_data[vf].flags |= IGB_VF_FLAG_PF_SET_MAC;
|
||||||
|
+ dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n",
|
||||||
|
+ mac, vf);
|
||||||
|
+ dev_info(&adapter->pdev->dev,
|
||||||
|
+ "Reload the VF driver to make this change effective.");
|
||||||
|
+ } else
|
||||||
|
return -EINVAL;
|
||||||
|
- adapter->vf_data[vf].flags |= IGB_VF_FLAG_PF_SET_MAC;
|
||||||
|
- dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n", mac, vf);
|
||||||
|
- dev_info(&adapter->pdev->dev,
|
||||||
|
- "Reload the VF driver to make this change effective.");
|
||||||
|
if (test_bit(__IGB_DOWN, &adapter->state)) {
|
||||||
|
dev_warn(&adapter->pdev->dev,
|
||||||
|
"The VF MAC address has been set, but the PF device is not up.\n");
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,525 @@
|
||||||
|
WARNING
|
||||||
|
This patch works with gcc versions 4.9+ and with kernel version 3.15+ and should
|
||||||
|
NOT be applied when compiling on older versions of gcc due to key name changes
|
||||||
|
of the march flags introduced with the version 4.9 release of gcc.[1]
|
||||||
|
|
||||||
|
Use the older version of this patch hosted on the same github for older
|
||||||
|
versions of gcc.
|
||||||
|
|
||||||
|
FEATURES
|
||||||
|
This patch adds additional CPU options to the Linux kernel accessible under:
|
||||||
|
Processor type and features --->
|
||||||
|
Processor family --->
|
||||||
|
|
||||||
|
The expanded microarchitectures include:
|
||||||
|
* AMD Improved K8-family
|
||||||
|
* AMD K10-family
|
||||||
|
* AMD Family 10h (Barcelona)
|
||||||
|
* AMD Family 14h (Bobcat)
|
||||||
|
* AMD Family 16h (Jaguar)
|
||||||
|
* AMD Family 15h (Bulldozer)
|
||||||
|
* AMD Family 15h (Piledriver)
|
||||||
|
* AMD Family 15h (Steamroller)
|
||||||
|
* AMD Family 15h (Excavator)
|
||||||
|
* AMD Family 17h (Zen)
|
||||||
|
* Intel Silvermont low-power processors
|
||||||
|
* Intel 1st Gen Core i3/i5/i7 (Nehalem)
|
||||||
|
* Intel 1.5 Gen Core i3/i5/i7 (Westmere)
|
||||||
|
* Intel 2nd Gen Core i3/i5/i7 (Sandybridge)
|
||||||
|
* Intel 3rd Gen Core i3/i5/i7 (Ivybridge)
|
||||||
|
* Intel 4th Gen Core i3/i5/i7 (Haswell)
|
||||||
|
* Intel 5th Gen Core i3/i5/i7 (Broadwell)
|
||||||
|
* Intel 6th Gen Core i3/i5.i7 (Skylake)
|
||||||
|
|
||||||
|
It also offers to compile passing the 'native' option which, "selects the CPU
|
||||||
|
to generate code for at compilation time by determining the processor type of
|
||||||
|
the compiling machine. Using -march=native enables all instruction subsets
|
||||||
|
supported by the local machine and will produce code optimized for the local
|
||||||
|
machine under the constraints of the selected instruction set."[3]
|
||||||
|
|
||||||
|
MINOR NOTES
|
||||||
|
This patch also changes 'atom' to 'bonnell' in accordance with the gcc v4.9
|
||||||
|
changes. Note that upstream is using the deprecated 'match=atom' flags when I
|
||||||
|
believe it should use the newer 'march=bonnell' flag for atom processors.[2]
|
||||||
|
|
||||||
|
It is not recommended to compile on Atom-CPUs with the 'native' option.[4] The
|
||||||
|
recommendation is to the 'atom' option instead.
|
||||||
|
|
||||||
|
BENEFITS
|
||||||
|
Small but real speed increases are measurable using a make endpoint comparing
|
||||||
|
a generic kernel to one built with one of the respective microarchs.
|
||||||
|
|
||||||
|
See the following experimental evidence supporting this statement:
|
||||||
|
https://github.com/graysky2/kernel_gcc_patch
|
||||||
|
|
||||||
|
REQUIREMENTS
|
||||||
|
linux version >=3.15
|
||||||
|
gcc version >=4.9
|
||||||
|
|
||||||
|
ACKNOWLEDGMENTS
|
||||||
|
This patch builds on the seminal work by Jeroen.[5]
|
||||||
|
|
||||||
|
REFERENCES
|
||||||
|
1. https://gcc.gnu.org/gcc-4.9/changes.html
|
||||||
|
2. https://bugzilla.kernel.org/show_bug.cgi?id=77461
|
||||||
|
3. https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
|
||||||
|
4. https://github.com/graysky2/kernel_gcc_patch/issues/15
|
||||||
|
5. http://www.linuxforge.net/docs/linux/linux-gcc.php
|
||||||
|
|
||||||
|
--- a/arch/x86/include/asm/module.h 2016-12-11 14:17:54.000000000 -0500
|
||||||
|
+++ b/arch/x86/include/asm/module.h 2016-12-20 15:17:16.567422788 -0500
|
||||||
|
@@ -15,6 +15,24 @@
|
||||||
|
#define MODULE_PROC_FAMILY "586MMX "
|
||||||
|
#elif defined CONFIG_MCORE2
|
||||||
|
#define MODULE_PROC_FAMILY "CORE2 "
|
||||||
|
+#elif defined CONFIG_MNATIVE
|
||||||
|
+#define MODULE_PROC_FAMILY "NATIVE "
|
||||||
|
+#elif defined CONFIG_MNEHALEM
|
||||||
|
+#define MODULE_PROC_FAMILY "NEHALEM "
|
||||||
|
+#elif defined CONFIG_MWESTMERE
|
||||||
|
+#define MODULE_PROC_FAMILY "WESTMERE "
|
||||||
|
+#elif defined CONFIG_MSILVERMONT
|
||||||
|
+#define MODULE_PROC_FAMILY "SILVERMONT "
|
||||||
|
+#elif defined CONFIG_MSANDYBRIDGE
|
||||||
|
+#define MODULE_PROC_FAMILY "SANDYBRIDGE "
|
||||||
|
+#elif defined CONFIG_MIVYBRIDGE
|
||||||
|
+#define MODULE_PROC_FAMILY "IVYBRIDGE "
|
||||||
|
+#elif defined CONFIG_MHASWELL
|
||||||
|
+#define MODULE_PROC_FAMILY "HASWELL "
|
||||||
|
+#elif defined CONFIG_MBROADWELL
|
||||||
|
+#define MODULE_PROC_FAMILY "BROADWELL "
|
||||||
|
+#elif defined CONFIG_MSKYLAKE
|
||||||
|
+#define MODULE_PROC_FAMILY "SKYLAKE "
|
||||||
|
#elif defined CONFIG_MATOM
|
||||||
|
#define MODULE_PROC_FAMILY "ATOM "
|
||||||
|
#elif defined CONFIG_M686
|
||||||
|
@@ -33,6 +51,26 @@
|
||||||
|
#define MODULE_PROC_FAMILY "K7 "
|
||||||
|
#elif defined CONFIG_MK8
|
||||||
|
#define MODULE_PROC_FAMILY "K8 "
|
||||||
|
+#elif defined CONFIG_MK8SSE3
|
||||||
|
+#define MODULE_PROC_FAMILY "K8SSE3 "
|
||||||
|
+#elif defined CONFIG_MK10
|
||||||
|
+#define MODULE_PROC_FAMILY "K10 "
|
||||||
|
+#elif defined CONFIG_MBARCELONA
|
||||||
|
+#define MODULE_PROC_FAMILY "BARCELONA "
|
||||||
|
+#elif defined CONFIG_MBOBCAT
|
||||||
|
+#define MODULE_PROC_FAMILY "BOBCAT "
|
||||||
|
+#elif defined CONFIG_MBULLDOZER
|
||||||
|
+#define MODULE_PROC_FAMILY "BULLDOZER "
|
||||||
|
+#elif defined CONFIG_MPILEDRIVER
|
||||||
|
+#define MODULE_PROC_FAMILY "STEAMROLLER "
|
||||||
|
+#elif defined CONFIG_MSTEAMROLLER
|
||||||
|
+#define MODULE_PROC_FAMILY "PILEDRIVER "
|
||||||
|
+#elif defined CONFIG_MJAGUAR
|
||||||
|
+#define MODULE_PROC_FAMILY "JAGUAR "
|
||||||
|
+#elif defined CONFIG_MEXCAVATOR
|
||||||
|
+#define MODULE_PROC_FAMILY "EXCAVATOR "
|
||||||
|
+#elif defined CONFIG_MZEN
|
||||||
|
+#define MODULE_PROC_FAMILY "ZEN "
|
||||||
|
#elif defined CONFIG_MELAN
|
||||||
|
#define MODULE_PROC_FAMILY "ELAN "
|
||||||
|
#elif defined CONFIG_MCRUSOE
|
||||||
|
--- a/arch/x86/Kconfig.cpu 2016-12-11 14:17:54.000000000 -0500
|
||||||
|
+++ b/arch/x86/Kconfig.cpu 2016-12-20 15:31:19.929002279 -0500
|
||||||
|
@@ -147,9 +147,8 @@ config MPENTIUM4
|
||||||
|
-Paxville
|
||||||
|
-Dempsey
|
||||||
|
|
||||||
|
-
|
||||||
|
config MK6
|
||||||
|
- bool "K6/K6-II/K6-III"
|
||||||
|
+ bool "AMD K6/K6-II/K6-III"
|
||||||
|
depends on X86_32
|
||||||
|
---help---
|
||||||
|
Select this for an AMD K6-family processor. Enables use of
|
||||||
|
@@ -157,7 +156,7 @@ config MK6
|
||||||
|
flags to GCC.
|
||||||
|
|
||||||
|
config MK7
|
||||||
|
- bool "Athlon/Duron/K7"
|
||||||
|
+ bool "AMD Athlon/Duron/K7"
|
||||||
|
depends on X86_32
|
||||||
|
---help---
|
||||||
|
Select this for an AMD Athlon K7-family processor. Enables use of
|
||||||
|
@@ -165,12 +164,83 @@ config MK7
|
||||||
|
flags to GCC.
|
||||||
|
|
||||||
|
config MK8
|
||||||
|
- bool "Opteron/Athlon64/Hammer/K8"
|
||||||
|
+ bool "AMD Opteron/Athlon64/Hammer/K8"
|
||||||
|
---help---
|
||||||
|
Select this for an AMD Opteron or Athlon64 Hammer-family processor.
|
||||||
|
Enables use of some extended instructions, and passes appropriate
|
||||||
|
optimization flags to GCC.
|
||||||
|
|
||||||
|
+config MK8SSE3
|
||||||
|
+ bool "AMD Opteron/Athlon64/Hammer/K8 with SSE3"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for improved AMD Opteron or Athlon64 Hammer-family processors.
|
||||||
|
+ Enables use of some extended instructions, and passes appropriate
|
||||||
|
+ optimization flags to GCC.
|
||||||
|
+
|
||||||
|
+config MK10
|
||||||
|
+ bool "AMD 61xx/7x50/PhenomX3/X4/II/K10"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for an AMD 61xx Eight-Core Magny-Cours, Athlon X2 7x50,
|
||||||
|
+ Phenom X3/X4/II, Athlon II X2/X3/X4, or Turion II-family processor.
|
||||||
|
+ Enables use of some extended instructions, and passes appropriate
|
||||||
|
+ optimization flags to GCC.
|
||||||
|
+
|
||||||
|
+config MBARCELONA
|
||||||
|
+ bool "AMD Barcelona"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 10h Barcelona processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=barcelona
|
||||||
|
+
|
||||||
|
+config MBOBCAT
|
||||||
|
+ bool "AMD Bobcat"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 14h Bobcat processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=btver1
|
||||||
|
+
|
||||||
|
+config MJAGUAR
|
||||||
|
+ bool "AMD Jaguar"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 16h Jaguar processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=btver2
|
||||||
|
+
|
||||||
|
+config MBULLDOZER
|
||||||
|
+ bool "AMD Bulldozer"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 15h Bulldozer processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=bdver1
|
||||||
|
+
|
||||||
|
+config MPILEDRIVER
|
||||||
|
+ bool "AMD Piledriver"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 15h Piledriver processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=bdver2
|
||||||
|
+
|
||||||
|
+config MSTEAMROLLER
|
||||||
|
+ bool "AMD Steamroller"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 15h Steamroller processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=bdver3
|
||||||
|
+
|
||||||
|
+config MEXCAVATOR
|
||||||
|
+ bool "AMD Excavator"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 15h Excavator processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=bdver4
|
||||||
|
+
|
||||||
|
+config MZEN
|
||||||
|
+ bool "AMD Zen"
|
||||||
|
+ ---help---
|
||||||
|
+ Select this for AMD Family 17h Zen processors.
|
||||||
|
+
|
||||||
|
+ Enables -march=znver1
|
||||||
|
+
|
||||||
|
config MCRUSOE
|
||||||
|
bool "Crusoe"
|
||||||
|
depends on X86_32
|
||||||
|
@@ -252,6 +322,7 @@ config MVIAC7
|
||||||
|
|
||||||
|
config MPSC
|
||||||
|
bool "Intel P4 / older Netburst based Xeon"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
depends on X86_64
|
||||||
|
---help---
|
||||||
|
Optimize for Intel Pentium 4, Pentium D and older Nocona/Dempsey
|
||||||
|
@@ -261,8 +332,19 @@ config MPSC
|
||||||
|
using the cpu family field
|
||||||
|
in /proc/cpuinfo. Family 15 is an older Xeon, Family 6 a newer one.
|
||||||
|
|
||||||
|
+config MATOM
|
||||||
|
+ bool "Intel Atom"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for the Intel Atom platform. Intel Atom CPUs have an
|
||||||
|
+ in-order pipelining architecture and thus can benefit from
|
||||||
|
+ accordingly optimized code. Use a recent GCC with specific Atom
|
||||||
|
+ support in order to fully benefit from selecting this option.
|
||||||
|
+
|
||||||
|
config MCORE2
|
||||||
|
- bool "Core 2/newer Xeon"
|
||||||
|
+ bool "Intel Core 2"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
---help---
|
||||||
|
|
||||||
|
Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and
|
||||||
|
@@ -270,14 +352,79 @@ config MCORE2
|
||||||
|
family in /proc/cpuinfo. Newer ones have 6 and older ones 15
|
||||||
|
(not a typo)
|
||||||
|
|
||||||
|
-config MATOM
|
||||||
|
- bool "Intel Atom"
|
||||||
|
+ Enables -march=core2
|
||||||
|
+
|
||||||
|
+config MNEHALEM
|
||||||
|
+ bool "Intel Nehalem"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
---help---
|
||||||
|
|
||||||
|
- Select this for the Intel Atom platform. Intel Atom CPUs have an
|
||||||
|
- in-order pipelining architecture and thus can benefit from
|
||||||
|
- accordingly optimized code. Use a recent GCC with specific Atom
|
||||||
|
- support in order to fully benefit from selecting this option.
|
||||||
|
+ Select this for 1st Gen Core processors in the Nehalem family.
|
||||||
|
+
|
||||||
|
+ Enables -march=nehalem
|
||||||
|
+
|
||||||
|
+config MWESTMERE
|
||||||
|
+ bool "Intel Westmere"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for the Intel Westmere formerly Nehalem-C family.
|
||||||
|
+
|
||||||
|
+ Enables -march=westmere
|
||||||
|
+
|
||||||
|
+config MSILVERMONT
|
||||||
|
+ bool "Intel Silvermont"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for the Intel Silvermont platform.
|
||||||
|
+
|
||||||
|
+ Enables -march=silvermont
|
||||||
|
+
|
||||||
|
+config MSANDYBRIDGE
|
||||||
|
+ bool "Intel Sandy Bridge"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for 2nd Gen Core processors in the Sandy Bridge family.
|
||||||
|
+
|
||||||
|
+ Enables -march=sandybridge
|
||||||
|
+
|
||||||
|
+config MIVYBRIDGE
|
||||||
|
+ bool "Intel Ivy Bridge"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for 3rd Gen Core processors in the Ivy Bridge family.
|
||||||
|
+
|
||||||
|
+ Enables -march=ivybridge
|
||||||
|
+
|
||||||
|
+config MHASWELL
|
||||||
|
+ bool "Intel Haswell"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for 4th Gen Core processors in the Haswell family.
|
||||||
|
+
|
||||||
|
+ Enables -march=haswell
|
||||||
|
+
|
||||||
|
+config MBROADWELL
|
||||||
|
+ bool "Intel Broadwell"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for 5th Gen Core processors in the Broadwell family.
|
||||||
|
+
|
||||||
|
+ Enables -march=broadwell
|
||||||
|
+
|
||||||
|
+config MSKYLAKE
|
||||||
|
+ bool "Intel Skylake"
|
||||||
|
+ select X86_P6_NOP
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ Select this for 6th Gen Core processors in the Skylake family.
|
||||||
|
+
|
||||||
|
+ Enables -march=skylake
|
||||||
|
|
||||||
|
config GENERIC_CPU
|
||||||
|
bool "Generic-x86-64"
|
||||||
|
@@ -286,6 +433,19 @@ config GENERIC_CPU
|
||||||
|
Generic x86-64 CPU.
|
||||||
|
Run equally well on all x86-64 CPUs.
|
||||||
|
|
||||||
|
+config MNATIVE
|
||||||
|
+ bool "Native optimizations autodetected by GCC"
|
||||||
|
+ ---help---
|
||||||
|
+
|
||||||
|
+ GCC 4.2 and above support -march=native, which automatically detects
|
||||||
|
+ the optimum settings to use based on your processor. -march=native
|
||||||
|
+ also detects and applies additional settings beyond -march specific
|
||||||
|
+ to your CPU, (eg. -msse4). Unless you have a specific reason not to
|
||||||
|
+ (e.g. distcc cross-compiling), you should probably be using
|
||||||
|
+ -march=native rather than anything listed below.
|
||||||
|
+
|
||||||
|
+ Enables -march=native
|
||||||
|
+
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config X86_GENERIC
|
||||||
|
@@ -310,7 +470,7 @@ config X86_INTERNODE_CACHE_SHIFT
|
||||||
|
config X86_L1_CACHE_SHIFT
|
||||||
|
int
|
||||||
|
default "7" if MPENTIUM4 || MPSC
|
||||||
|
- default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU
|
||||||
|
+ default "6" if MK7 || MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MJAGUAR || MPENTIUMM || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MNATIVE || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU
|
||||||
|
default "4" if MELAN || M486 || MGEODEGX1
|
||||||
|
default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX
|
||||||
|
|
||||||
|
@@ -341,45 +501,47 @@ config X86_ALIGNMENT_16
|
||||||
|
|
||||||
|
config X86_INTEL_USERCOPY
|
||||||
|
def_bool y
|
||||||
|
- depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2
|
||||||
|
+ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK8SSE3 || MK7 || MEFFICEON || MCORE2 || MK10 || MBARCELONA || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MNATIVE
|
||||||
|
|
||||||
|
config X86_USE_PPRO_CHECKSUM
|
||||||
|
def_bool y
|
||||||
|
- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM
|
||||||
|
+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MK10 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MATOM || MNATIVE
|
||||||
|
|
||||||
|
config X86_USE_3DNOW
|
||||||
|
def_bool y
|
||||||
|
depends on (MCYRIXIII || MK7 || MGEODE_LX) && !UML
|
||||||
|
|
||||||
|
-#
|
||||||
|
-# P6_NOPs are a relatively minor optimization that require a family >=
|
||||||
|
-# 6 processor, except that it is broken on certain VIA chips.
|
||||||
|
-# Furthermore, AMD chips prefer a totally different sequence of NOPs
|
||||||
|
-# (which work on all CPUs). In addition, it looks like Virtual PC
|
||||||
|
-# does not understand them.
|
||||||
|
-#
|
||||||
|
-# As a result, disallow these if we're not compiling for X86_64 (these
|
||||||
|
-# NOPs do work on all x86-64 capable chips); the list of processors in
|
||||||
|
-# the right-hand clause are the cores that benefit from this optimization.
|
||||||
|
-#
|
||||||
|
config X86_P6_NOP
|
||||||
|
- def_bool y
|
||||||
|
+ default n
|
||||||
|
+ bool "Support for P6_NOPs on Intel chips"
|
||||||
|
depends on X86_64
|
||||||
|
- depends on (MCORE2 || MPENTIUM4 || MPSC)
|
||||||
|
+ depends on (MCORE2 || MPENTIUM4 || MPSC || MATOM || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MNATIVE)
|
||||||
|
+ ---help---
|
||||||
|
+ P6_NOPs are a relatively minor optimization that require a family >=
|
||||||
|
+ 6 processor, except that it is broken on certain VIA chips.
|
||||||
|
+ Furthermore, AMD chips prefer a totally different sequence of NOPs
|
||||||
|
+ (which work on all CPUs). In addition, it looks like Virtual PC
|
||||||
|
+ does not understand them.
|
||||||
|
+
|
||||||
|
+ As a result, disallow these if we're not compiling for X86_64 (these
|
||||||
|
+ NOPs do work on all x86-64 capable chips); the list of processors in
|
||||||
|
+ the right-hand clause are the cores that benefit from this optimization.
|
||||||
|
+
|
||||||
|
+ Say Y if you have Intel CPU newer than Pentium Pro, N otherwise.
|
||||||
|
|
||||||
|
config X86_TSC
|
||||||
|
def_bool y
|
||||||
|
- depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || MATOM) || X86_64
|
||||||
|
+ depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MNATIVE || MATOM) || X86_64
|
||||||
|
|
||||||
|
config X86_CMPXCHG64
|
||||||
|
def_bool y
|
||||||
|
- depends on X86_PAE || X86_64 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MATOM
|
||||||
|
+ depends on X86_PAE || X86_64 || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MATOM || MNATIVE
|
||||||
|
|
||||||
|
# this should be set for all -march=.. options where the compiler
|
||||||
|
# generates cmov.
|
||||||
|
config X86_CMOV
|
||||||
|
def_bool y
|
||||||
|
- depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX)
|
||||||
|
+ depends on (MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MJAGUAR || MK7 || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MNATIVE || MATOM || MGEODE_LX)
|
||||||
|
|
||||||
|
config X86_MINIMUM_CPU_FAMILY
|
||||||
|
int
|
||||||
|
--- a/arch/x86/Makefile 2016-12-11 14:17:54.000000000 -0500
|
||||||
|
+++ b/arch/x86/Makefile 2016-12-20 15:26:01.142666491 -0500
|
||||||
|
@@ -104,13 +104,40 @@ else
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
|
||||||
|
|
||||||
|
# FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
|
||||||
|
+ cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native)
|
||||||
|
cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
|
||||||
|
+ cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-mtune=k8)
|
||||||
|
+ cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10)
|
||||||
|
+ cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona)
|
||||||
|
+ cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1)
|
||||||
|
+ cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2)
|
||||||
|
+ cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1)
|
||||||
|
+ cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2)
|
||||||
|
+ cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3)
|
||||||
|
+ cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4)
|
||||||
|
+ cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1)
|
||||||
|
cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
|
||||||
|
|
||||||
|
cflags-$(CONFIG_MCORE2) += \
|
||||||
|
- $(call cc-option,-march=core2,$(call cc-option,-mtune=generic))
|
||||||
|
- cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \
|
||||||
|
- $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic))
|
||||||
|
+ $(call cc-option,-march=core2,$(call cc-option,-mtune=core2))
|
||||||
|
+ cflags-$(CONFIG_MNEHALEM) += \
|
||||||
|
+ $(call cc-option,-march=nehalem,$(call cc-option,-mtune=nehalem))
|
||||||
|
+ cflags-$(CONFIG_MWESTMERE) += \
|
||||||
|
+ $(call cc-option,-march=westmere,$(call cc-option,-mtune=westmere))
|
||||||
|
+ cflags-$(CONFIG_MSILVERMONT) += \
|
||||||
|
+ $(call cc-option,-march=silvermont,$(call cc-option,-mtune=silvermont))
|
||||||
|
+ cflags-$(CONFIG_MSANDYBRIDGE) += \
|
||||||
|
+ $(call cc-option,-march=sandybridge,$(call cc-option,-mtune=sandybridge))
|
||||||
|
+ cflags-$(CONFIG_MIVYBRIDGE) += \
|
||||||
|
+ $(call cc-option,-march=ivybridge,$(call cc-option,-mtune=ivybridge))
|
||||||
|
+ cflags-$(CONFIG_MHASWELL) += \
|
||||||
|
+ $(call cc-option,-march=haswell,$(call cc-option,-mtune=haswell))
|
||||||
|
+ cflags-$(CONFIG_MBROADWELL) += \
|
||||||
|
+ $(call cc-option,-march=broadwell,$(call cc-option,-mtune=broadwell))
|
||||||
|
+ cflags-$(CONFIG_MSKYLAKE) += \
|
||||||
|
+ $(call cc-option,-march=skylake,$(call cc-option,-mtune=skylake))
|
||||||
|
+ cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell) \
|
||||||
|
+ $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic))
|
||||||
|
cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic)
|
||||||
|
KBUILD_CFLAGS += $(cflags-y)
|
||||||
|
|
||||||
|
--- a/arch/x86/Makefile_32.cpu 2016-12-11 14:17:54.000000000 -0500
|
||||||
|
+++ b/arch/x86/Makefile_32.cpu 2016-12-20 15:27:05.357148298 -0500
|
||||||
|
@@ -23,7 +23,18 @@ cflags-$(CONFIG_MK6) += -march=k6
|
||||||
|
# Please note, that patches that add -march=athlon-xp and friends are pointless.
|
||||||
|
# They make zero difference whatsosever to performance at this time.
|
||||||
|
cflags-$(CONFIG_MK7) += -march=athlon
|
||||||
|
+cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native)
|
||||||
|
cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4,-march=athlon)
|
||||||
|
+cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1,-march=athlon)
|
||||||
|
cflags-$(CONFIG_MCRUSOE) += -march=i686 $(align)-functions=0 $(align)-jumps=0 $(align)-loops=0
|
||||||
|
cflags-$(CONFIG_MEFFICEON) += -march=i686 $(call tune,pentium3) $(align)-functions=0 $(align)-jumps=0 $(align)-loops=0
|
||||||
|
cflags-$(CONFIG_MWINCHIPC6) += $(call cc-option,-march=winchip-c6,-march=i586)
|
||||||
|
@@ -32,8 +43,16 @@ cflags-$(CONFIG_MCYRIXIII) += $(call cc-
|
||||||
|
cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686)
|
||||||
|
cflags-$(CONFIG_MVIAC7) += -march=i686
|
||||||
|
cflags-$(CONFIG_MCORE2) += -march=i686 $(call tune,core2)
|
||||||
|
-cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom,$(call cc-option,-march=core2,-march=i686)) \
|
||||||
|
- $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic))
|
||||||
|
+cflags-$(CONFIG_MNEHALEM) += -march=i686 $(call tune,nehalem)
|
||||||
|
+cflags-$(CONFIG_MWESTMERE) += -march=i686 $(call tune,westmere)
|
||||||
|
+cflags-$(CONFIG_MSILVERMONT) += -march=i686 $(call tune,silvermont)
|
||||||
|
+cflags-$(CONFIG_MSANDYBRIDGE) += -march=i686 $(call tune,sandybridge)
|
||||||
|
+cflags-$(CONFIG_MIVYBRIDGE) += -march=i686 $(call tune,ivybridge)
|
||||||
|
+cflags-$(CONFIG_MHASWELL) += -march=i686 $(call tune,haswell)
|
||||||
|
+cflags-$(CONFIG_MBROADWELL) += -march=i686 $(call tune,broadwell)
|
||||||
|
+cflags-$(CONFIG_MSKYLAKE) += -march=i686 $(call tune,skylake)
|
||||||
|
+cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell,$(call cc-option,-march=core2,-march=i686)) \
|
||||||
|
+ $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic))
|
||||||
|
|
||||||
|
# AMD Elan support
|
||||||
|
cflags-$(CONFIG_MELAN) += -march=i486
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c
|
||||||
|
index a61447f..1264a36 100644
|
||||||
|
--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
|
||||||
|
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
|
||||||
|
@@ -246,6 +246,7 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw)
|
||||||
|
E1000_STATUS_FUNC_SHIFT;
|
||||||
|
|
||||||
|
/* Set phy->phy_addr and phy->id. */
|
||||||
|
+ igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, 0);
|
||||||
|
ret_val = igb_get_phy_id_82575(hw);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
|
@ -0,0 +1,20 @@
|
||||||
|
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
|
||||||
|
index a080f4496fe2..142341f8331b 100644
|
||||||
|
--- a/drivers/pci/msi.c
|
||||||
|
+++ b/drivers/pci/msi.c
|
||||||
|
@@ -645,6 +645,15 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * The mask can be ignored and PCI 2.3 does not specify mask bits for
|
||||||
|
+ * each MSI interrupt. So in case of hierarchical irqdomains we need
|
||||||
|
+ * to make sure that if masking is not available that the msi message
|
||||||
|
+ * is written prior to setting the MSI enable bit in the device.
|
||||||
|
+ */
|
||||||
|
+ if (pci_msi_ignore_mask || !entry->msi_attrib.maskbit)
|
||||||
|
+ irq_domain_activate_irq(irq_get_irq_data(entry->irq));
|
||||||
|
+
|
||||||
|
/* Set MSI enabled bits */
|
||||||
|
pci_intx_for_msi(dev, 0);
|
||||||
|
pci_msi_set_enable(dev, 1);
|
|
@ -0,0 +1,23 @@
|
||||||
|
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c
|
||||||
|
index a61447f..ee44398 100644
|
||||||
|
--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
|
||||||
|
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
|
||||||
|
@@ -245,6 +245,17 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw)
|
||||||
|
hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >>
|
||||||
|
E1000_STATUS_FUNC_SHIFT;
|
||||||
|
|
||||||
|
+ /* Make sure the PHY is in a good state. Several people have reported
|
||||||
|
+ * firmware leaving the PHY's page select register set to something
|
||||||
|
+ * other than the default of zero, which causes the PHY ID read to
|
||||||
|
+ * access something other than the intended register.
|
||||||
|
+ */
|
||||||
|
+ ret_val = hw->phy.ops.reset(hw);
|
||||||
|
+ if (ret_val) {
|
||||||
|
+ hw_dbg("Error resetting the PHY.\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Set phy->phy_addr and phy->id. */
|
||||||
|
ret_val = igb_get_phy_id_82575(hw);
|
||||||
|
if (ret_val)
|
||||||
|
|
|
@ -13,10 +13,10 @@ index 6a5e2a1..09eaa9a1 100644
|
||||||
numa_memory_policy.txt
|
numa_memory_policy.txt
|
||||||
diff --git a/Documentation/vm/uksm.txt b/Documentation/vm/uksm.txt
|
diff --git a/Documentation/vm/uksm.txt b/Documentation/vm/uksm.txt
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..b7a110f
|
index 0000000..8fce86f
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/Documentation/vm/uksm.txt
|
+++ b/Documentation/vm/uksm.txt
|
||||||
@@ -0,0 +1,61 @@
|
@@ -0,0 +1,60 @@
|
||||||
+The Ultra Kernel Samepage Merging feature
|
+The Ultra Kernel Samepage Merging feature
|
||||||
+----------------------------------------------
|
+----------------------------------------------
|
||||||
+/*
|
+/*
|
||||||
|
@ -77,47 +77,64 @@ index 0000000..b7a110f
|
||||||
+2014-07-02 UKSM 0.1.2.3 Fix a " __this_cpu_read() in preemptible bug".
|
+2014-07-02 UKSM 0.1.2.3 Fix a " __this_cpu_read() in preemptible bug".
|
||||||
+2015-04-22 UKSM 0.1.2.4 Fix a race condition that can sometimes trigger anonying warnings.
|
+2015-04-22 UKSM 0.1.2.4 Fix a race condition that can sometimes trigger anonying warnings.
|
||||||
+2016-09-10 UKSM 0.1.2.5 Fix a bug in dedup ratio calculation.
|
+2016-09-10 UKSM 0.1.2.5 Fix a bug in dedup ratio calculation.
|
||||||
+2017-02-26 UKSM 0.1.2.6 Fix a bug in hugetlbpage handling and a race bug with page migration.
|
|
||||||
diff --git a/fs/exec.c b/fs/exec.c
|
diff --git a/fs/exec.c b/fs/exec.c
|
||||||
index e579466..3da3dd68 100644
|
index 887c1c9..2bee16e 100644
|
||||||
--- a/fs/exec.c
|
--- a/fs/exec.c
|
||||||
+++ b/fs/exec.c
|
+++ b/fs/exec.c
|
||||||
|
@@ -19,7 +19,7 @@
|
||||||
|
* current->executable is only used by the procfs. This allows a dispatch
|
||||||
|
* table to check for several different types of binary formats. We keep
|
||||||
|
* trying until we recognize the file or we run out of supported binary
|
||||||
|
- * formats.
|
||||||
|
+ * formats.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/slab.h>
|
||||||
@@ -57,6 +57,7 @@
|
@@ -57,6 +57,7 @@
|
||||||
#include <linux/oom.h>
|
#include <linux/oom.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
+#include <linux/ksm.h>
|
+#include <linux/ksm.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
@@ -1336,6 +1337,7 @@ void setup_new_exec(struct linux_binprm * bprm)
|
@@ -1273,6 +1274,7 @@ void setup_new_exec(struct linux_binprm * bprm)
|
||||||
/* An exec changes our domain. We are no longer part of the thread
|
/* An exec changes our domain. We are no longer part of the thread
|
||||||
group */
|
group */
|
||||||
current->self_exec_id++;
|
current->self_exec_id++;
|
||||||
+
|
+
|
||||||
flush_signal_handlers(current, 0);
|
flush_signal_handlers(current, 0);
|
||||||
|
do_close_on_exec(current->files);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(setup_new_exec);
|
|
||||||
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
|
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
|
||||||
index 8a42849..47480dd 100644
|
index 8372046..82aa2f4 100644
|
||||||
--- a/fs/proc/meminfo.c
|
--- a/fs/proc/meminfo.c
|
||||||
+++ b/fs/proc/meminfo.c
|
+++ b/fs/proc/meminfo.c
|
||||||
@@ -117,6 +117,10 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
|
@@ -89,6 +89,9 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
|
||||||
global_page_state(NR_KERNEL_STACK_KB));
|
"SUnreclaim: %8lu kB\n"
|
||||||
show_val_kb(m, "PageTables: ",
|
"KernelStack: %8lu kB\n"
|
||||||
global_page_state(NR_PAGETABLE));
|
"PageTables: %8lu kB\n"
|
||||||
+#ifdef CONFIG_UKSM
|
+#ifdef CONFIG_UKSM
|
||||||
+ show_val_kb(m, "KsmZeroPages: ",
|
+ "KsmZeroPages: %8lu kB\n"
|
||||||
+ global_page_state(NR_UKSM_ZERO_PAGES));
|
|
||||||
+#endif
|
+#endif
|
||||||
#ifdef CONFIG_QUICKLIST
|
#ifdef CONFIG_QUICKLIST
|
||||||
show_val_kb(m, "Quicklists: ", quicklist_total_size());
|
"Quicklists: %8lu kB\n"
|
||||||
|
#endif
|
||||||
|
@@ -147,6 +150,9 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
|
||||||
|
K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
|
||||||
|
global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024,
|
||||||
|
K(global_page_state(NR_PAGETABLE)),
|
||||||
|
+#ifdef CONFIG_UKSM
|
||||||
|
+ K(global_page_state(NR_UKSM_ZERO_PAGES)),
|
||||||
|
+#endif
|
||||||
|
#ifdef CONFIG_QUICKLIST
|
||||||
|
K(quicklist_total_size()),
|
||||||
#endif
|
#endif
|
||||||
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
|
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
|
||||||
index 18af2bc..c536344 100644
|
index d4458b6..172ceb9 100644
|
||||||
--- a/include/asm-generic/pgtable.h
|
--- a/include/asm-generic/pgtable.h
|
||||||
+++ b/include/asm-generic/pgtable.h
|
+++ b/include/asm-generic/pgtable.h
|
||||||
@@ -600,12 +600,25 @@ extern void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn,
|
@@ -601,12 +601,25 @@ extern void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn,
|
||||||
extern void untrack_pfn_moved(struct vm_area_struct *vma);
|
extern void untrack_pfn_moved(struct vm_area_struct *vma);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -144,7 +161,7 @@ index 18af2bc..c536344 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
#define my_zero_pfn(addr) page_to_pfn(ZERO_PAGE(addr))
|
#define my_zero_pfn(addr) page_to_pfn(ZERO_PAGE(addr))
|
||||||
@@ -614,7 +627,7 @@ static inline int is_zero_pfn(unsigned long pfn)
|
@@ -615,7 +628,7 @@ static inline int is_zero_pfn(unsigned long pfn)
|
||||||
static inline int is_zero_pfn(unsigned long pfn)
|
static inline int is_zero_pfn(unsigned long pfn)
|
||||||
{
|
{
|
||||||
extern unsigned long zero_pfn;
|
extern unsigned long zero_pfn;
|
||||||
|
@ -154,7 +171,7 @@ index 18af2bc..c536344 100644
|
||||||
|
|
||||||
static inline unsigned long my_zero_pfn(unsigned long addr)
|
static inline unsigned long my_zero_pfn(unsigned long addr)
|
||||||
diff --git a/include/linux/ksm.h b/include/linux/ksm.h
|
diff --git a/include/linux/ksm.h b/include/linux/ksm.h
|
||||||
index 481c8c4..5329b23 100644
|
index 7ae216a..06861d8 100644
|
||||||
--- a/include/linux/ksm.h
|
--- a/include/linux/ksm.h
|
||||||
+++ b/include/linux/ksm.h
|
+++ b/include/linux/ksm.h
|
||||||
@@ -19,21 +19,6 @@ struct mem_cgroup;
|
@@ -19,21 +19,6 @@ struct mem_cgroup;
|
||||||
|
@ -179,7 +196,7 @@ index 481c8c4..5329b23 100644
|
||||||
|
|
||||||
static inline struct stable_node *page_stable_node(struct page *page)
|
static inline struct stable_node *page_stable_node(struct page *page)
|
||||||
{
|
{
|
||||||
@@ -63,6 +48,33 @@ struct page *ksm_might_need_to_copy(struct page *page,
|
@@ -64,6 +49,33 @@ struct page *ksm_might_need_to_copy(struct page *page,
|
||||||
int rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc);
|
int rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc);
|
||||||
void ksm_migrate_page(struct page *newpage, struct page *oldpage);
|
void ksm_migrate_page(struct page *newpage, struct page *oldpage);
|
||||||
|
|
||||||
|
@ -213,7 +230,7 @@ index 481c8c4..5329b23 100644
|
||||||
#else /* !CONFIG_KSM */
|
#else /* !CONFIG_KSM */
|
||||||
|
|
||||||
static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm)
|
static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||||
@@ -105,4 +117,6 @@ static inline void ksm_migrate_page(struct page *newpage, struct page *oldpage)
|
@@ -106,4 +118,6 @@ static inline void ksm_migrate_page(struct page *newpage, struct page *oldpage)
|
||||||
#endif /* CONFIG_MMU */
|
#endif /* CONFIG_MMU */
|
||||||
#endif /* !CONFIG_KSM */
|
#endif /* !CONFIG_KSM */
|
||||||
|
|
||||||
|
@ -221,10 +238,10 @@ index 481c8c4..5329b23 100644
|
||||||
+
|
+
|
||||||
#endif /* __LINUX_KSM_H */
|
#endif /* __LINUX_KSM_H */
|
||||||
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
|
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
|
||||||
index 808751d..f2c9f6c 100644
|
index ca3e517..ae62e7d1 100644
|
||||||
--- a/include/linux/mm_types.h
|
--- a/include/linux/mm_types.h
|
||||||
+++ b/include/linux/mm_types.h
|
+++ b/include/linux/mm_types.h
|
||||||
@@ -358,6 +358,9 @@ struct vm_area_struct {
|
@@ -357,6 +357,9 @@ struct vm_area_struct {
|
||||||
struct mempolicy *vm_policy; /* NUMA policy for the VMA */
|
struct mempolicy *vm_policy; /* NUMA policy for the VMA */
|
||||||
#endif
|
#endif
|
||||||
struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
|
struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
|
||||||
|
@ -235,20 +252,20 @@ index 808751d..f2c9f6c 100644
|
||||||
|
|
||||||
struct core_thread {
|
struct core_thread {
|
||||||
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
|
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
|
||||||
index f4aac87..bff211e 100644
|
index 02069c2..f7cce50 100644
|
||||||
--- a/include/linux/mmzone.h
|
--- a/include/linux/mmzone.h
|
||||||
+++ b/include/linux/mmzone.h
|
+++ b/include/linux/mmzone.h
|
||||||
@@ -138,6 +138,9 @@ enum zone_stat_item {
|
@@ -153,6 +153,9 @@ enum zone_stat_item {
|
||||||
NUMA_OTHER, /* allocation from other node */
|
WORKINGSET_NODERECLAIM,
|
||||||
#endif
|
NR_ANON_TRANSPARENT_HUGEPAGES,
|
||||||
NR_FREE_CMA_PAGES,
|
NR_FREE_CMA_PAGES,
|
||||||
+#ifdef CONFIG_UKSM
|
+#ifdef CONFIG_UKSM
|
||||||
+ NR_UKSM_ZERO_PAGES,
|
+ NR_UKSM_ZERO_PAGES,
|
||||||
+#endif
|
+#endif
|
||||||
NR_VM_ZONE_STAT_ITEMS };
|
NR_VM_ZONE_STAT_ITEMS };
|
||||||
|
|
||||||
enum node_stat_item {
|
/*
|
||||||
@@ -843,7 +846,7 @@ static inline int is_highmem_idx(enum zone_type idx)
|
@@ -817,7 +820,7 @@ static inline int is_highmem_idx(enum zone_type idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -496,10 +513,10 @@ index 0000000..825f05e
|
||||||
+#endif /* !CONFIG_UKSM */
|
+#endif /* !CONFIG_UKSM */
|
||||||
+#endif /* __LINUX_UKSM_H */
|
+#endif /* __LINUX_UKSM_H */
|
||||||
diff --git a/kernel/fork.c b/kernel/fork.c
|
diff --git a/kernel/fork.c b/kernel/fork.c
|
||||||
index 11c5c8a..78cd12d 100644
|
index aea4f4d..f93e114 100644
|
||||||
--- a/kernel/fork.c
|
--- a/kernel/fork.c
|
||||||
+++ b/kernel/fork.c
|
+++ b/kernel/fork.c
|
||||||
@@ -606,7 +606,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
|
@@ -459,7 +459,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||||
goto fail_nomem;
|
goto fail_nomem;
|
||||||
charge = len;
|
charge = len;
|
||||||
}
|
}
|
||||||
|
@ -508,7 +525,7 @@ index 11c5c8a..78cd12d 100644
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
goto fail_nomem;
|
goto fail_nomem;
|
||||||
*tmp = *mpnt;
|
*tmp = *mpnt;
|
||||||
@@ -659,7 +659,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
|
@@ -512,7 +512,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||||
__vma_link_rb(mm, tmp, rb_link, rb_parent);
|
__vma_link_rb(mm, tmp, rb_link, rb_parent);
|
||||||
rb_link = &tmp->vm_rb.rb_right;
|
rb_link = &tmp->vm_rb.rb_right;
|
||||||
rb_parent = &tmp->vm_rb;
|
rb_parent = &tmp->vm_rb;
|
||||||
|
@ -518,17 +535,17 @@ index 11c5c8a..78cd12d 100644
|
||||||
retval = copy_page_range(mm, oldmm, mpnt);
|
retval = copy_page_range(mm, oldmm, mpnt);
|
||||||
|
|
||||||
diff --git a/lib/Makefile b/lib/Makefile
|
diff --git a/lib/Makefile b/lib/Makefile
|
||||||
index bc4073a..dbdb5ee 100644
|
index ff6a7a6..ac0bb55 100644
|
||||||
--- a/lib/Makefile
|
--- a/lib/Makefile
|
||||||
+++ b/lib/Makefile
|
+++ b/lib/Makefile
|
||||||
@@ -17,7 +17,7 @@ KCOV_INSTRUMENT_debugobjects.o := n
|
@@ -20,7 +20,7 @@ KCOV_INSTRUMENT_dynamic_debug.o := n
|
||||||
KCOV_INSTRUMENT_dynamic_debug.o := n
|
KCOV_INSTRUMENT_hweight.o := n
|
||||||
|
|
||||||
lib-y := ctype.o string.o vsprintf.o cmdline.o \
|
lib-y := ctype.o string.o vsprintf.o cmdline.o \
|
||||||
- rbtree.o radix-tree.o dump_stack.o timerqueue.o\
|
- rbtree.o radix-tree.o dump_stack.o timerqueue.o\
|
||||||
+ rbtree.o radix-tree.o sradix-tree.o dump_stack.o timerqueue.o\
|
+ rbtree.o radix-tree.o sradix-tree.o dump_stack.o timerqueue.o\
|
||||||
idr.o int_sqrt.o extable.o \
|
idr.o int_sqrt.o extable.o \
|
||||||
sha1.o chacha20.o md5.o irq_regs.o argv_split.o \
|
sha1.o md5.o irq_regs.o argv_split.o \
|
||||||
flex_proportions.o ratelimit.o show_mem.o \
|
flex_proportions.o ratelimit.o show_mem.o \
|
||||||
diff --git a/lib/sradix-tree.c b/lib/sradix-tree.c
|
diff --git a/lib/sradix-tree.c b/lib/sradix-tree.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
|
@ -1013,10 +1030,10 @@ index 0000000..8d06329
|
||||||
+ return 0;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
diff --git a/mm/Kconfig b/mm/Kconfig
|
diff --git a/mm/Kconfig b/mm/Kconfig
|
||||||
index 9b8fccb..d8a2f50 100644
|
index 3e2daef..165b60e 100644
|
||||||
--- a/mm/Kconfig
|
--- a/mm/Kconfig
|
||||||
+++ b/mm/Kconfig
|
+++ b/mm/Kconfig
|
||||||
@@ -340,6 +340,32 @@ config KSM
|
@@ -332,6 +332,32 @@ config KSM
|
||||||
See Documentation/vm/ksm.txt for more information: KSM is inactive
|
See Documentation/vm/ksm.txt for more information: KSM is inactive
|
||||||
until a program has madvised that an area is MADV_MERGEABLE, and
|
until a program has madvised that an area is MADV_MERGEABLE, and
|
||||||
root has set /sys/kernel/mm/ksm/run to 1 (if CONFIG_SYSFS is set).
|
root has set /sys/kernel/mm/ksm/run to 1 (if CONFIG_SYSFS is set).
|
||||||
|
@ -1050,7 +1067,7 @@ index 9b8fccb..d8a2f50 100644
|
||||||
config DEFAULT_MMAP_MIN_ADDR
|
config DEFAULT_MMAP_MIN_ADDR
|
||||||
int "Low address space to protect from user allocation"
|
int "Low address space to protect from user allocation"
|
||||||
diff --git a/mm/Makefile b/mm/Makefile
|
diff --git a/mm/Makefile b/mm/Makefile
|
||||||
index 295bd7a..a47ed9b 100644
|
index 78c6f7d..7e7cd8a 100644
|
||||||
--- a/mm/Makefile
|
--- a/mm/Makefile
|
||||||
+++ b/mm/Makefile
|
+++ b/mm/Makefile
|
||||||
@@ -63,7 +63,8 @@ obj-$(CONFIG_SPARSEMEM) += sparse.o
|
@@ -63,7 +63,8 @@ obj-$(CONFIG_SPARSEMEM) += sparse.o
|
||||||
|
@ -1064,10 +1081,10 @@ index 295bd7a..a47ed9b 100644
|
||||||
obj-$(CONFIG_SLAB) += slab.o
|
obj-$(CONFIG_SLAB) += slab.o
|
||||||
obj-$(CONFIG_SLUB) += slub.o
|
obj-$(CONFIG_SLUB) += slub.o
|
||||||
diff --git a/mm/memory.c b/mm/memory.c
|
diff --git a/mm/memory.c b/mm/memory.c
|
||||||
index 6bf2b47..ee62eea 100644
|
index 9e04681..02200d3 100644
|
||||||
--- a/mm/memory.c
|
--- a/mm/memory.c
|
||||||
+++ b/mm/memory.c
|
+++ b/mm/memory.c
|
||||||
@@ -124,6 +124,25 @@ unsigned long highest_memmap_pfn __read_mostly;
|
@@ -124,6 +124,28 @@ unsigned long highest_memmap_pfn __read_mostly;
|
||||||
|
|
||||||
EXPORT_SYMBOL(zero_pfn);
|
EXPORT_SYMBOL(zero_pfn);
|
||||||
|
|
||||||
|
@ -1078,11 +1095,14 @@ index 6bf2b47..ee62eea 100644
|
||||||
+
|
+
|
||||||
+static int __init setup_uksm_zero_page(void)
|
+static int __init setup_uksm_zero_page(void)
|
||||||
+{
|
+{
|
||||||
+ empty_uksm_zero_page = alloc_pages(__GFP_ZERO & ~__GFP_MOVABLE, 0);
|
+ unsigned long addr;
|
||||||
+ if (!empty_uksm_zero_page)
|
+ addr = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 0);
|
||||||
|
+ if (!addr)
|
||||||
+ panic("Oh boy, that early out of memory?");
|
+ panic("Oh boy, that early out of memory?");
|
||||||
+
|
+
|
||||||
|
+ empty_uksm_zero_page = virt_to_page((void *) addr);
|
||||||
+ SetPageReserved(empty_uksm_zero_page);
|
+ SetPageReserved(empty_uksm_zero_page);
|
||||||
|
+
|
||||||
+ uksm_zero_pfn = page_to_pfn(empty_uksm_zero_page);
|
+ uksm_zero_pfn = page_to_pfn(empty_uksm_zero_page);
|
||||||
+
|
+
|
||||||
+ return 0;
|
+ return 0;
|
||||||
|
@ -1093,7 +1113,7 @@ index 6bf2b47..ee62eea 100644
|
||||||
/*
|
/*
|
||||||
* CONFIG_MMU architectures set up ZERO_PAGE in their paging_init()
|
* CONFIG_MMU architectures set up ZERO_PAGE in their paging_init()
|
||||||
*/
|
*/
|
||||||
@@ -135,6 +154,7 @@ static int __init init_zero_pfn(void)
|
@@ -135,6 +157,7 @@ static int __init init_zero_pfn(void)
|
||||||
core_initcall(init_zero_pfn);
|
core_initcall(init_zero_pfn);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1101,7 +1121,7 @@ index 6bf2b47..ee62eea 100644
|
||||||
#if defined(SPLIT_RSS_COUNTING)
|
#if defined(SPLIT_RSS_COUNTING)
|
||||||
|
|
||||||
void sync_mm_rss(struct mm_struct *mm)
|
void sync_mm_rss(struct mm_struct *mm)
|
||||||
@@ -916,6 +936,11 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
@@ -905,6 +928,11 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
||||||
get_page(page);
|
get_page(page);
|
||||||
page_dup_rmap(page, false);
|
page_dup_rmap(page, false);
|
||||||
rss[mm_counter(page)]++;
|
rss[mm_counter(page)]++;
|
||||||
|
@ -1113,7 +1133,7 @@ index 6bf2b47..ee62eea 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
out_set_pte:
|
out_set_pte:
|
||||||
@@ -1150,8 +1175,10 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
|
@@ -1138,8 +1166,10 @@ again:
|
||||||
ptent = ptep_get_and_clear_full(mm, addr, pte,
|
ptent = ptep_get_and_clear_full(mm, addr, pte,
|
||||||
tlb->fullmm);
|
tlb->fullmm);
|
||||||
tlb_remove_tlb_entry(tlb, pte, addr);
|
tlb_remove_tlb_entry(tlb, pte, addr);
|
||||||
|
@ -1125,7 +1145,7 @@ index 6bf2b47..ee62eea 100644
|
||||||
|
|
||||||
if (!PageAnon(page)) {
|
if (!PageAnon(page)) {
|
||||||
if (pte_dirty(ptent)) {
|
if (pte_dirty(ptent)) {
|
||||||
@@ -2010,8 +2037,10 @@ static inline void cow_user_page(struct page *dst, struct page *src, unsigned lo
|
@@ -1995,8 +2025,10 @@ static inline void cow_user_page(struct page *dst, struct page *src, unsigned lo
|
||||||
clear_page(kaddr);
|
clear_page(kaddr);
|
||||||
kunmap_atomic(kaddr);
|
kunmap_atomic(kaddr);
|
||||||
flush_dcache_page(dst);
|
flush_dcache_page(dst);
|
||||||
|
@ -1137,37 +1157,37 @@ index 6bf2b47..ee62eea 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma)
|
static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma)
|
||||||
@@ -2160,6 +2189,7 @@ static int wp_page_copy(struct vm_fault *vmf)
|
@@ -2141,6 +2173,7 @@ static int wp_page_copy(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||||
vmf->address);
|
new_page = alloc_zeroed_user_highpage_movable(vma, address);
|
||||||
if (!new_page)
|
if (!new_page)
|
||||||
goto oom;
|
goto oom;
|
||||||
+ uksm_cow_pte(vma, vmf->orig_pte);
|
+ uksm_cow_pte(vma, orig_pte);
|
||||||
} else {
|
} else {
|
||||||
new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma,
|
new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address);
|
||||||
vmf->address);
|
if (!new_page)
|
||||||
@@ -2186,7 +2216,9 @@ static int wp_page_copy(struct vm_fault *vmf)
|
@@ -2166,7 +2199,9 @@ static int wp_page_copy(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||||
mm_counter_file(old_page));
|
mm_counter_file(old_page));
|
||||||
inc_mm_counter_fast(mm, MM_ANONPAGES);
|
inc_mm_counter_fast(mm, MM_ANONPAGES);
|
||||||
}
|
}
|
||||||
+ uksm_bugon_zeropage(vmf->orig_pte);
|
+ uksm_bugon_zeropage(orig_pte);
|
||||||
} else {
|
} else {
|
||||||
+ uksm_unmap_zero_page(vmf->orig_pte);
|
+ uksm_unmap_zero_page(orig_pte);
|
||||||
inc_mm_counter_fast(mm, MM_ANONPAGES);
|
inc_mm_counter_fast(mm, MM_ANONPAGES);
|
||||||
}
|
}
|
||||||
flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte));
|
flush_cache_page(vma, address, pte_pfn(orig_pte));
|
||||||
diff --git a/mm/mmap.c b/mm/mmap.c
|
diff --git a/mm/mmap.c b/mm/mmap.c
|
||||||
index dc4291d..a96fac9 100644
|
index de2c176..ce60715 100644
|
||||||
--- a/mm/mmap.c
|
--- a/mm/mmap.c
|
||||||
+++ b/mm/mmap.c
|
+++ b/mm/mmap.c
|
||||||
@@ -44,6 +44,7 @@
|
@@ -43,6 +43,7 @@
|
||||||
#include <linux/userfaultfd_k.h>
|
#include <linux/userfaultfd_k.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/pkeys.h>
|
#include <linux/pkeys.h>
|
||||||
+#include <linux/ksm.h>
|
+#include <linux/ksm.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
@@ -172,6 +173,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
|
@@ -164,6 +165,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
|
||||||
if (vma->vm_file)
|
if (vma->vm_file)
|
||||||
fput(vma->vm_file);
|
fput(vma->vm_file);
|
||||||
mpol_put(vma_policy(vma));
|
mpol_put(vma_policy(vma));
|
||||||
|
@ -1175,7 +1195,7 @@ index dc4291d..a96fac9 100644
|
||||||
kmem_cache_free(vm_area_cachep, vma);
|
kmem_cache_free(vm_area_cachep, vma);
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
@@ -675,9 +677,16 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
@@ -629,9 +631,16 @@ int vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
||||||
long adjust_next = 0;
|
long adjust_next = 0;
|
||||||
int remove_next = 0;
|
int remove_next = 0;
|
||||||
|
|
||||||
|
@ -1186,13 +1206,13 @@ index dc4291d..a96fac9 100644
|
||||||
+ uksm_remove_vma(vma);
|
+ uksm_remove_vma(vma);
|
||||||
+
|
+
|
||||||
if (next && !insert) {
|
if (next && !insert) {
|
||||||
struct vm_area_struct *exporter = NULL, *importer = NULL;
|
struct vm_area_struct *exporter = NULL;
|
||||||
|
|
||||||
+ uksm_remove_vma(next);
|
+ uksm_remove_vma(next);
|
||||||
if (end >= next->vm_end) {
|
if (end >= next->vm_end) {
|
||||||
/*
|
/*
|
||||||
* vma expands, overlapping all the next, and
|
* vma expands, overlapping all the next, and
|
||||||
@@ -810,6 +819,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
@@ -725,6 +734,7 @@ again: remove_next = 1 + (end > next->vm_end);
|
||||||
end_changed = true;
|
end_changed = true;
|
||||||
}
|
}
|
||||||
vma->vm_pgoff = pgoff;
|
vma->vm_pgoff = pgoff;
|
||||||
|
@ -1200,18 +1220,21 @@ index dc4291d..a96fac9 100644
|
||||||
if (adjust_next) {
|
if (adjust_next) {
|
||||||
next->vm_start += adjust_next << PAGE_SHIFT;
|
next->vm_start += adjust_next << PAGE_SHIFT;
|
||||||
next->vm_pgoff += adjust_next;
|
next->vm_pgoff += adjust_next;
|
||||||
@@ -915,6 +925,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
@@ -795,16 +805,22 @@ again: remove_next = 1 + (end > next->vm_end);
|
||||||
if (remove_next == 2) {
|
* up the code too much to do both in one go.
|
||||||
remove_next = 1;
|
*/
|
||||||
end = next->vm_end;
|
next = vma->vm_next;
|
||||||
|
- if (remove_next == 2)
|
||||||
|
+ if (remove_next == 2) {
|
||||||
+ uksm_remove_vma(next);
|
+ uksm_remove_vma(next);
|
||||||
goto again;
|
goto again;
|
||||||
}
|
- else if (next)
|
||||||
else if (next)
|
+ } else if (next) {
|
||||||
@@ -941,10 +952,14 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
vma_gap_update(next);
|
||||||
*/
|
- else
|
||||||
VM_WARN_ON(mm->highest_vm_end != end);
|
+ } else {
|
||||||
}
|
mm->highest_vm_end = end;
|
||||||
|
+ }
|
||||||
+ } else {
|
+ } else {
|
||||||
+ if (next && !insert)
|
+ if (next && !insert)
|
||||||
+ uksm_vma_add_new(next);
|
+ uksm_vma_add_new(next);
|
||||||
|
@ -1223,7 +1246,7 @@ index dc4291d..a96fac9 100644
|
||||||
validate_mm(mm);
|
validate_mm(mm);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1360,6 +1375,9 @@ unsigned long do_mmap(struct file *file, unsigned long addr,
|
@@ -1196,6 +1212,9 @@ unsigned long do_mmap(struct file *file, unsigned long addr,
|
||||||
vm_flags |= calc_vm_prot_bits(prot, pkey) | calc_vm_flag_bits(flags) |
|
vm_flags |= calc_vm_prot_bits(prot, pkey) | calc_vm_flag_bits(flags) |
|
||||||
mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
|
mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;
|
||||||
|
|
||||||
|
@ -1233,7 +1256,7 @@ index dc4291d..a96fac9 100644
|
||||||
if (flags & MAP_LOCKED)
|
if (flags & MAP_LOCKED)
|
||||||
if (!can_do_mlock())
|
if (!can_do_mlock())
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
@@ -1698,6 +1716,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
|
@@ -1534,6 +1553,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
|
||||||
allow_write_access(file);
|
allow_write_access(file);
|
||||||
}
|
}
|
||||||
file = vma->vm_file;
|
file = vma->vm_file;
|
||||||
|
@ -1241,7 +1264,7 @@ index dc4291d..a96fac9 100644
|
||||||
out:
|
out:
|
||||||
perf_event_mmap(vma);
|
perf_event_mmap(vma);
|
||||||
|
|
||||||
@@ -1739,6 +1758,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
|
@@ -1575,6 +1595,7 @@ allow_write_and_free_vma:
|
||||||
if (vm_flags & VM_DENYWRITE)
|
if (vm_flags & VM_DENYWRITE)
|
||||||
allow_write_access(file);
|
allow_write_access(file);
|
||||||
free_vma:
|
free_vma:
|
||||||
|
@ -1249,7 +1272,7 @@ index dc4291d..a96fac9 100644
|
||||||
kmem_cache_free(vm_area_cachep, vma);
|
kmem_cache_free(vm_area_cachep, vma);
|
||||||
unacct_error:
|
unacct_error:
|
||||||
if (charged)
|
if (charged)
|
||||||
@@ -2544,6 +2564,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
@@ -2369,6 +2390,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||||
else
|
else
|
||||||
err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new);
|
err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new);
|
||||||
|
|
||||||
|
@ -1258,7 +1281,7 @@ index dc4291d..a96fac9 100644
|
||||||
/* Success. */
|
/* Success. */
|
||||||
if (!err)
|
if (!err)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2822,6 +2844,7 @@ static int do_brk(unsigned long addr, unsigned long request)
|
@@ -2639,6 +2662,7 @@ static int do_brk(unsigned long addr, unsigned long len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
|
flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
|
||||||
|
@ -1266,7 +1289,7 @@ index dc4291d..a96fac9 100644
|
||||||
|
|
||||||
error = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED);
|
error = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED);
|
||||||
if (offset_in_page(error))
|
if (offset_in_page(error))
|
||||||
@@ -2879,6 +2902,7 @@ static int do_brk(unsigned long addr, unsigned long request)
|
@@ -2696,6 +2720,7 @@ static int do_brk(unsigned long addr, unsigned long len)
|
||||||
vma->vm_flags = flags;
|
vma->vm_flags = flags;
|
||||||
vma->vm_page_prot = vm_get_page_prot(flags);
|
vma->vm_page_prot = vm_get_page_prot(flags);
|
||||||
vma_link(mm, vma, prev, rb_link, rb_parent);
|
vma_link(mm, vma, prev, rb_link, rb_parent);
|
||||||
|
@ -1274,7 +1297,7 @@ index dc4291d..a96fac9 100644
|
||||||
out:
|
out:
|
||||||
perf_event_mmap(vma);
|
perf_event_mmap(vma);
|
||||||
mm->total_vm += len >> PAGE_SHIFT;
|
mm->total_vm += len >> PAGE_SHIFT;
|
||||||
@@ -2917,6 +2941,12 @@ void exit_mmap(struct mm_struct *mm)
|
@@ -2734,6 +2759,12 @@ void exit_mmap(struct mm_struct *mm)
|
||||||
/* mm's last user has gone, and its about to be pulled down */
|
/* mm's last user has gone, and its about to be pulled down */
|
||||||
mmu_notifier_release(mm);
|
mmu_notifier_release(mm);
|
||||||
|
|
||||||
|
@ -1287,7 +1310,7 @@ index dc4291d..a96fac9 100644
|
||||||
if (mm->locked_vm) {
|
if (mm->locked_vm) {
|
||||||
vma = mm->mmap;
|
vma = mm->mmap;
|
||||||
while (vma) {
|
while (vma) {
|
||||||
@@ -2952,6 +2982,11 @@ void exit_mmap(struct mm_struct *mm)
|
@@ -2769,6 +2800,11 @@ void exit_mmap(struct mm_struct *mm)
|
||||||
vma = remove_vma(vma);
|
vma = remove_vma(vma);
|
||||||
}
|
}
|
||||||
vm_unacct_memory(nr_accounted);
|
vm_unacct_memory(nr_accounted);
|
||||||
|
@ -1299,7 +1322,7 @@ index dc4291d..a96fac9 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert vm structure into process list sorted by address
|
/* Insert vm structure into process list sorted by address
|
||||||
@@ -3061,6 +3096,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
|
@@ -2878,6 +2914,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
|
||||||
new_vma->vm_ops->open(new_vma);
|
new_vma->vm_ops->open(new_vma);
|
||||||
vma_link(mm, new_vma, prev, rb_link, rb_parent);
|
vma_link(mm, new_vma, prev, rb_link, rb_parent);
|
||||||
*need_rmap_locks = false;
|
*need_rmap_locks = false;
|
||||||
|
@ -1307,7 +1330,7 @@ index dc4291d..a96fac9 100644
|
||||||
}
|
}
|
||||||
return new_vma;
|
return new_vma;
|
||||||
|
|
||||||
@@ -3208,6 +3244,7 @@ static struct vm_area_struct *__install_special_mapping(
|
@@ -3015,6 +3052,7 @@ static struct vm_area_struct *__install_special_mapping(
|
||||||
vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT);
|
vm_stat_account(mm, vma->vm_flags, len >> PAGE_SHIFT);
|
||||||
|
|
||||||
perf_event_mmap(vma);
|
perf_event_mmap(vma);
|
||||||
|
@ -1316,10 +1339,10 @@ index dc4291d..a96fac9 100644
|
||||||
return vma;
|
return vma;
|
||||||
|
|
||||||
diff --git a/mm/rmap.c b/mm/rmap.c
|
diff --git a/mm/rmap.c b/mm/rmap.c
|
||||||
index 91619fd..3619420 100644
|
index 701b93f..64ba784 100644
|
||||||
--- a/mm/rmap.c
|
--- a/mm/rmap.c
|
||||||
+++ b/mm/rmap.c
|
+++ b/mm/rmap.c
|
||||||
@@ -1109,9 +1109,9 @@ void page_move_anon_rmap(struct page *page, struct vm_area_struct *vma)
|
@@ -1110,9 +1110,9 @@ void page_move_anon_rmap(struct page *page, struct vm_area_struct *vma)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __page_set_anon_rmap - set up new anonymous rmap
|
* __page_set_anon_rmap - set up new anonymous rmap
|
||||||
|
@ -1333,10 +1356,10 @@ index 91619fd..3619420 100644
|
||||||
static void __page_set_anon_rmap(struct page *page,
|
static void __page_set_anon_rmap(struct page *page,
|
||||||
diff --git a/mm/uksm.c b/mm/uksm.c
|
diff --git a/mm/uksm.c b/mm/uksm.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..d4596e1
|
index 0000000..039192f
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/mm/uksm.c
|
+++ b/mm/uksm.c
|
||||||
@@ -0,0 +1,5580 @@
|
@@ -0,0 +1,5518 @@
|
||||||
+/*
|
+/*
|
||||||
+ * Ultra KSM. Copyright (C) 2011-2012 Nai Xia
|
+ * Ultra KSM. Copyright (C) 2011-2012 Nai Xia
|
||||||
+ *
|
+ *
|
||||||
|
@ -1535,8 +1558,7 @@ index 0000000..d4596e1
|
||||||
+static struct sradix_tree_node *slot_tree_node_alloc(void)
|
+static struct sradix_tree_node *slot_tree_node_alloc(void)
|
||||||
+{
|
+{
|
||||||
+ struct slot_tree_node *p;
|
+ struct slot_tree_node *p;
|
||||||
+ p = kmem_cache_zalloc(slot_tree_node_cachep, GFP_KERNEL |
|
+ p = kmem_cache_zalloc(slot_tree_node_cachep, GFP_KERNEL);
|
||||||
+ __GFP_NORETRY | __GFP_NOWARN);
|
|
||||||
+ if (!p)
|
+ if (!p)
|
||||||
+ return NULL;
|
+ return NULL;
|
||||||
+
|
+
|
||||||
|
@ -2022,8 +2044,7 @@ index 0000000..d4596e1
|
||||||
+static inline struct node_vma *alloc_node_vma(void)
|
+static inline struct node_vma *alloc_node_vma(void)
|
||||||
+{
|
+{
|
||||||
+ struct node_vma *node_vma;
|
+ struct node_vma *node_vma;
|
||||||
+ node_vma = kmem_cache_zalloc(node_vma_cache, GFP_KERNEL |
|
+ node_vma = kmem_cache_zalloc(node_vma_cache, GFP_KERNEL);
|
||||||
+ __GFP_NORETRY | __GFP_NOWARN);
|
|
||||||
+ if (node_vma) {
|
+ if (node_vma) {
|
||||||
+ INIT_HLIST_HEAD(&node_vma->rmap_hlist);
|
+ INIT_HLIST_HEAD(&node_vma->rmap_hlist);
|
||||||
+ INIT_HLIST_NODE(&node_vma->hlist);
|
+ INIT_HLIST_NODE(&node_vma->hlist);
|
||||||
|
@ -2048,8 +2069,7 @@ index 0000000..d4596e1
|
||||||
+ if (!vma_slot_cache)
|
+ if (!vma_slot_cache)
|
||||||
+ return NULL;
|
+ return NULL;
|
||||||
+
|
+
|
||||||
+ slot = kmem_cache_zalloc(vma_slot_cache, GFP_KERNEL |
|
+ slot = kmem_cache_zalloc(vma_slot_cache, GFP_KERNEL);
|
||||||
+ __GFP_NORETRY | __GFP_NOWARN);
|
|
||||||
+ if (slot) {
|
+ if (slot) {
|
||||||
+ INIT_LIST_HEAD(&slot->slot_list);
|
+ INIT_LIST_HEAD(&slot->slot_list);
|
||||||
+ INIT_LIST_HEAD(&slot->dedup_list);
|
+ INIT_LIST_HEAD(&slot->dedup_list);
|
||||||
|
@ -2069,8 +2089,7 @@ index 0000000..d4596e1
|
||||||
+{
|
+{
|
||||||
+ struct rmap_item *rmap_item;
|
+ struct rmap_item *rmap_item;
|
||||||
+
|
+
|
||||||
+ rmap_item = kmem_cache_zalloc(rmap_item_cache, GFP_KERNEL |
|
+ rmap_item = kmem_cache_zalloc(rmap_item_cache, GFP_KERNEL);
|
||||||
+ __GFP_NORETRY | __GFP_NOWARN);
|
|
||||||
+ if (rmap_item) {
|
+ if (rmap_item) {
|
||||||
+ /* bug on lowest bit is not clear for flag use */
|
+ /* bug on lowest bit is not clear for flag use */
|
||||||
+ BUG_ON(is_addr(rmap_item));
|
+ BUG_ON(is_addr(rmap_item));
|
||||||
|
@ -2087,8 +2106,7 @@ index 0000000..d4596e1
|
||||||
+static inline struct stable_node *alloc_stable_node(void)
|
+static inline struct stable_node *alloc_stable_node(void)
|
||||||
+{
|
+{
|
||||||
+ struct stable_node *node;
|
+ struct stable_node *node;
|
||||||
+ node = kmem_cache_alloc(stable_node_cache, GFP_KERNEL |
|
+ node = kmem_cache_alloc(stable_node_cache, GFP_KERNEL | GFP_ATOMIC);
|
||||||
+ __GFP_NORETRY | __GFP_NOWARN);
|
|
||||||
+ if (!node)
|
+ if (!node)
|
||||||
+ return NULL;
|
+ return NULL;
|
||||||
+
|
+
|
||||||
|
@ -2106,8 +2124,7 @@ index 0000000..d4596e1
|
||||||
+static inline struct tree_node *alloc_tree_node(struct list_head *list)
|
+static inline struct tree_node *alloc_tree_node(struct list_head *list)
|
||||||
+{
|
+{
|
||||||
+ struct tree_node *node;
|
+ struct tree_node *node;
|
||||||
+ node = kmem_cache_zalloc(tree_node_cache, GFP_KERNEL |
|
+ node = kmem_cache_zalloc(tree_node_cache, GFP_KERNEL | GFP_ATOMIC);
|
||||||
+ __GFP_NORETRY | __GFP_NOWARN);
|
|
||||||
+ if (!node)
|
+ if (!node)
|
||||||
+ return NULL;
|
+ return NULL;
|
||||||
+
|
+
|
||||||
|
@ -2222,71 +2239,23 @@ index 0000000..d4596e1
|
||||||
+{
|
+{
|
||||||
+ struct page *page;
|
+ struct page *page;
|
||||||
+ void *expected_mapping;
|
+ void *expected_mapping;
|
||||||
+ unsigned long kpfn;
|
|
||||||
+
|
+
|
||||||
+ expected_mapping = (void *)((unsigned long)stable_node |
|
+ page = pfn_to_page(stable_node->kpfn);
|
||||||
+ PAGE_MAPPING_KSM);
|
+ expected_mapping = (void *)stable_node +
|
||||||
+again:
|
+ (PAGE_MAPPING_ANON | PAGE_MAPPING_KSM);
|
||||||
+ kpfn = READ_ONCE(stable_node->kpfn);
|
+ rcu_read_lock();
|
||||||
+ page = pfn_to_page(kpfn);
|
+ if (page->mapping != expected_mapping)
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * page is computed from kpfn, so on most architectures reading
|
|
||||||
+ * page->mapping is naturally ordered after reading node->kpfn,
|
|
||||||
+ * but on Alpha we need to be more careful.
|
|
||||||
+ */
|
|
||||||
+ smp_read_barrier_depends();
|
|
||||||
+
|
|
||||||
+ if (READ_ONCE(page->mapping) != expected_mapping)
|
|
||||||
+ goto stale;
|
+ goto stale;
|
||||||
+
|
+ if (!get_page_unless_zero(page))
|
||||||
+ /*
|
|
||||||
+ * We cannot do anything with the page while its refcount is 0.
|
|
||||||
+ * Usually 0 means free, or tail of a higher-order page: in which
|
|
||||||
+ * case this node is no longer referenced, and should be freed;
|
|
||||||
+ * however, it might mean that the page is under page_freeze_refs().
|
|
||||||
+ * The __remove_mapping() case is easy, again the node is now stale;
|
|
||||||
+ * but if page is swapcache in migrate_page_move_mapping(), it might
|
|
||||||
+ * still be our page, in which case it's essential to keep the node.
|
|
||||||
+ */
|
|
||||||
+ while (!get_page_unless_zero(page)) {
|
|
||||||
+ /*
|
|
||||||
+ * Another check for page->mapping != expected_mapping would
|
|
||||||
+ * work here too. We have chosen the !PageSwapCache test to
|
|
||||||
+ * optimize the common case, when the page is or is about to
|
|
||||||
+ * be freed: PageSwapCache is cleared (under spin_lock_irq)
|
|
||||||
+ * in the freeze_refs section of __remove_mapping(); but Anon
|
|
||||||
+ * page->mapping reset to NULL later, in free_pages_prepare().
|
|
||||||
+ */
|
|
||||||
+ if (!PageSwapCache(page))
|
|
||||||
+ goto stale;
|
+ goto stale;
|
||||||
+ cpu_relax();
|
+ if (page->mapping != expected_mapping) {
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (READ_ONCE(page->mapping) != expected_mapping) {
|
|
||||||
+ put_page(page);
|
+ put_page(page);
|
||||||
+ goto stale;
|
+ goto stale;
|
||||||
+ }
|
+ }
|
||||||
+
|
+ rcu_read_unlock();
|
||||||
+ lock_page(page);
|
|
||||||
+ if (READ_ONCE(page->mapping) != expected_mapping) {
|
|
||||||
+ unlock_page(page);
|
|
||||||
+ put_page(page);
|
|
||||||
+ goto stale;
|
|
||||||
+ }
|
|
||||||
+ unlock_page(page);
|
|
||||||
+ return page;
|
+ return page;
|
||||||
+stale:
|
+stale:
|
||||||
+ /*
|
+ rcu_read_unlock();
|
||||||
+ * We come here from above when page->mapping or !PageSwapCache
|
|
||||||
+ * suggests that the node is stale; but it might be under migration.
|
|
||||||
+ * We need smp_rmb(), matching the smp_wmb() in ksm_migrate_page(),
|
|
||||||
+ * before checking whether node->kpfn has been changed.
|
|
||||||
+ */
|
|
||||||
+ smp_rmb();
|
|
||||||
+ if (stable_node->kpfn != kpfn)
|
|
||||||
+ goto again;
|
|
||||||
+
|
|
||||||
+ remove_node_from_stable_tree(stable_node, unlink_rb, remove_tree_node);
|
+ remove_node_from_stable_tree(stable_node, unlink_rb, remove_tree_node);
|
||||||
+
|
+
|
||||||
+ return NULL;
|
+ return NULL;
|
||||||
|
@ -2950,7 +2919,6 @@ index 0000000..d4596e1
|
||||||
+ (page_to_pfn(kpage) == zero_pfn)) {
|
+ (page_to_pfn(kpage) == zero_pfn)) {
|
||||||
+ entry = pte_mkspecial(entry);
|
+ entry = pte_mkspecial(entry);
|
||||||
+ dec_mm_counter(mm, MM_ANONPAGES);
|
+ dec_mm_counter(mm, MM_ANONPAGES);
|
||||||
+ inc_zone_page_state(page, NR_UKSM_ZERO_PAGES);
|
|
||||||
+ } else {
|
+ } else {
|
||||||
+ get_page(kpage);
|
+ get_page(kpage);
|
||||||
+ page_add_anon_rmap(kpage, vma, addr, false);
|
+ page_add_anon_rmap(kpage, vma, addr, false);
|
||||||
|
@ -4018,7 +3986,7 @@ index 0000000..d4596e1
|
||||||
+ if (IS_ERR_OR_NULL(page))
|
+ if (IS_ERR_OR_NULL(page))
|
||||||
+ break;
|
+ break;
|
||||||
+ if (PageKsm(page)) {
|
+ if (PageKsm(page)) {
|
||||||
+ ret = handle_mm_fault(vma, addr,
|
+ ret = handle_mm_fault(vma->vm_mm, vma, addr,
|
||||||
+ FAULT_FLAG_WRITE | FAULT_FLAG_REMOTE);
|
+ FAULT_FLAG_WRITE | FAULT_FLAG_REMOTE);
|
||||||
+ } else
|
+ } else
|
||||||
+ ret = VM_FAULT_WRITE;
|
+ ret = VM_FAULT_WRITE;
|
||||||
|
@ -4666,6 +4634,7 @@ index 0000000..d4596e1
|
||||||
+ if (find_zero_page_hash(hash_strength, *hash)) {
|
+ if (find_zero_page_hash(hash_strength, *hash)) {
|
||||||
+ if (!cmp_and_merge_zero_page(slot->vma, page)) {
|
+ if (!cmp_and_merge_zero_page(slot->vma, page)) {
|
||||||
+ slot->pages_merged++;
|
+ slot->pages_merged++;
|
||||||
|
+ inc_zone_page_state(page, NR_UKSM_ZERO_PAGES);
|
||||||
+
|
+
|
||||||
+ /* For full-zero pages, no need to create rmap item */
|
+ /* For full-zero pages, no need to create rmap item */
|
||||||
+ goto putpage;
|
+ goto putpage;
|
||||||
|
@ -6102,14 +6071,6 @@ index 0000000..d4596e1
|
||||||
+ if (stable_node) {
|
+ if (stable_node) {
|
||||||
+ VM_BUG_ON(stable_node->kpfn != page_to_pfn(oldpage));
|
+ VM_BUG_ON(stable_node->kpfn != page_to_pfn(oldpage));
|
||||||
+ stable_node->kpfn = page_to_pfn(newpage);
|
+ stable_node->kpfn = page_to_pfn(newpage);
|
||||||
+ /*
|
|
||||||
+ * newpage->mapping was set in advance; now we need smp_wmb()
|
|
||||||
+ * to make sure that the new stable_node->kpfn is visible
|
|
||||||
+ * to get_ksm_page() before it can see that oldpage->mapping
|
|
||||||
+ * has gone stale (or that PageSwapCache has been cleared).
|
|
||||||
+ */
|
|
||||||
+ smp_wmb();
|
|
||||||
+ set_page_stable_node(oldpage, NULL);
|
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
+#endif /* CONFIG_MIGRATION */
|
+#endif /* CONFIG_MIGRATION */
|
||||||
|
@ -6800,7 +6761,7 @@ index 0000000..d4596e1
|
||||||
+ return 0; /* just ignore the advice */
|
+ return 0; /* just ignore the advice */
|
||||||
+
|
+
|
||||||
+ case MADV_UNMERGEABLE:
|
+ case MADV_UNMERGEABLE:
|
||||||
+ if (!(*vm_flags & VM_MERGEABLE) || !uksm_flags_can_scan(*vm_flags))
|
+ if (!(*vm_flags & VM_MERGEABLE))
|
||||||
+ return 0; /* just ignore the advice */
|
+ return 0; /* just ignore the advice */
|
||||||
+
|
+
|
||||||
+ if (vma->anon_vma) {
|
+ if (vma->anon_vma) {
|
||||||
|
@ -6918,12 +6879,12 @@ index 0000000..d4596e1
|
||||||
+#endif
|
+#endif
|
||||||
+
|
+
|
||||||
diff --git a/mm/vmstat.c b/mm/vmstat.c
|
diff --git a/mm/vmstat.c b/mm/vmstat.c
|
||||||
index 7c28df3..b1f783f 100644
|
index cb2a67b..912b86f 100644
|
||||||
--- a/mm/vmstat.c
|
--- a/mm/vmstat.c
|
||||||
+++ b/mm/vmstat.c
|
+++ b/mm/vmstat.c
|
||||||
@@ -974,6 +974,9 @@ const char * const vmstat_text[] = {
|
@@ -733,6 +733,9 @@ const char * const vmstat_text[] = {
|
||||||
"nr_dirtied",
|
"nr_anon_transparent_hugepages",
|
||||||
"nr_written",
|
"nr_free_cma",
|
||||||
|
|
||||||
+#ifdef CONFIG_UKSM
|
+#ifdef CONFIG_UKSM
|
||||||
+ "nr_uksm_zero_pages",
|
+ "nr_uksm_zero_pages",
|
|
@ -0,0 +1,16 @@
|
||||||
|
diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.c b/drivers/net/ethernet/intel/igb/e1000_phy.c
|
||||||
|
index 5b54254..93ec2d0 100644
|
||||||
|
--- a/drivers/net/ethernet/intel/igb/e1000_phy.c
|
||||||
|
+++ b/drivers/net/ethernet/intel/igb/e1000_phy.c
|
||||||
|
@@ -77,6 +77,10 @@ s32 igb_get_phy_id(struct e1000_hw *hw)
|
||||||
|
s32 ret_val = 0;
|
||||||
|
u16 phy_id;
|
||||||
|
|
||||||
|
+ /* ensure phy page selection to fix misconfigured i210 */
|
||||||
|
+ if (hw->mac.type == e1000_i210)
|
||||||
|
+ phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, 0);
|
||||||
|
+
|
||||||
|
ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
|
@ -1,111 +0,0 @@
|
||||||
From a7fb2842267fd275cae9cf44dd3037469f75eeef Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Tue, 1 Nov 2016 12:54:20 +1100
|
|
||||||
Subject: [PATCH 09/25] Implement min and msec hrtimeout un/interruptible
|
|
||||||
schedule timeout variants with a lower resolution of 1ms to work around low
|
|
||||||
Hz time resolutions.
|
|
||||||
|
|
||||||
---
|
|
||||||
include/linux/sched.h | 6 +++++
|
|
||||||
kernel/time/hrtimer.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 77 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
|
||||||
index d752ef6..46544f4 100644
|
|
||||||
--- a/include/linux/sched.h
|
|
||||||
+++ b/include/linux/sched.h
|
|
||||||
@@ -457,6 +457,12 @@ extern signed long schedule_timeout_interruptible(signed long timeout);
|
|
||||||
extern signed long schedule_timeout_killable(signed long timeout);
|
|
||||||
extern signed long schedule_timeout_uninterruptible(signed long timeout);
|
|
||||||
extern signed long schedule_timeout_idle(signed long timeout);
|
|
||||||
+
|
|
||||||
+extern signed long schedule_msec_hrtimeout(signed long timeout);
|
|
||||||
+extern signed long schedule_min_hrtimeout(void);
|
|
||||||
+extern signed long schedule_msec_hrtimeout_interruptible(signed long timeout);
|
|
||||||
+extern signed long schedule_msec_hrtimeout_uninterruptible(signed long timeout);
|
|
||||||
+
|
|
||||||
asmlinkage void schedule(void);
|
|
||||||
extern void schedule_preempt_disabled(void);
|
|
||||||
|
|
||||||
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
|
|
||||||
index c6ecedd..a47f5b3 100644
|
|
||||||
--- a/kernel/time/hrtimer.c
|
|
||||||
+++ b/kernel/time/hrtimer.c
|
|
||||||
@@ -1796,3 +1796,74 @@ int __sched schedule_hrtimeout(ktime_t *expires,
|
|
||||||
return schedule_hrtimeout_range(expires, 0, mode);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(schedule_hrtimeout);
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * As per schedule_hrtimeout but taskes a millisecond value and returns how
|
|
||||||
+ * many milliseconds are left.
|
|
||||||
+ */
|
|
||||||
+signed long __sched schedule_msec_hrtimeout(signed long timeout)
|
|
||||||
+{
|
|
||||||
+ struct hrtimer_sleeper t;
|
|
||||||
+ int delta, secs, jiffs;
|
|
||||||
+ ktime_t expires;
|
|
||||||
+
|
|
||||||
+ if (!timeout) {
|
|
||||||
+ __set_current_state(TASK_RUNNING);
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ jiffs = msecs_to_jiffies(timeout);
|
|
||||||
+ /*
|
|
||||||
+ * If regular timer resolution is adequate or hrtimer resolution is not
|
|
||||||
+ * (yet) better than Hz, as would occur during startup, use regular
|
|
||||||
+ * timers.
|
|
||||||
+ */
|
|
||||||
+ if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ)
|
|
||||||
+ return schedule_timeout(jiffs);
|
|
||||||
+
|
|
||||||
+ secs = timeout / 1000;
|
|
||||||
+ delta = (timeout % 1000) * NSEC_PER_MSEC;
|
|
||||||
+ expires = ktime_set(secs, delta);
|
|
||||||
+
|
|
||||||
+ hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
|
||||||
+ hrtimer_set_expires_range_ns(&t.timer, expires, delta);
|
|
||||||
+
|
|
||||||
+ hrtimer_init_sleeper(&t, current);
|
|
||||||
+
|
|
||||||
+ hrtimer_start_expires(&t.timer, HRTIMER_MODE_REL);
|
|
||||||
+
|
|
||||||
+ if (likely(t.task))
|
|
||||||
+ schedule();
|
|
||||||
+
|
|
||||||
+ hrtimer_cancel(&t.timer);
|
|
||||||
+ destroy_hrtimer_on_stack(&t.timer);
|
|
||||||
+
|
|
||||||
+ __set_current_state(TASK_RUNNING);
|
|
||||||
+
|
|
||||||
+ expires = hrtimer_expires_remaining(&t.timer);
|
|
||||||
+ timeout = ktime_to_ms(expires);
|
|
||||||
+ return timeout < 0 ? 0 : timeout;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+EXPORT_SYMBOL(schedule_msec_hrtimeout);
|
|
||||||
+
|
|
||||||
+signed long __sched schedule_min_hrtimeout(void)
|
|
||||||
+{
|
|
||||||
+ return schedule_msec_hrtimeout(1);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+EXPORT_SYMBOL(schedule_min_hrtimeout);
|
|
||||||
+
|
|
||||||
+signed long __sched schedule_msec_hrtimeout_interruptible(signed long timeout)
|
|
||||||
+{
|
|
||||||
+ __set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
+ return schedule_msec_hrtimeout(timeout);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(schedule_msec_hrtimeout_interruptible);
|
|
||||||
+
|
|
||||||
+signed long __sched schedule_msec_hrtimeout_uninterruptible(signed long timeout)
|
|
||||||
+{
|
|
||||||
+ __set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
+ return schedule_msec_hrtimeout(timeout);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(schedule_msec_hrtimeout_uninterruptible);
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
From a4f3820228ebab3d5d480d720fecebd3f7e71771 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Sat, 5 Nov 2016 09:27:36 +1100
|
|
||||||
Subject: [PATCH 10/25] Special case calls of schedule_timeout(1) to use the
|
|
||||||
min hrtimeout of 1ms, working around low Hz resolutions.
|
|
||||||
|
|
||||||
---
|
|
||||||
kernel/time/timer.c | 15 +++++++++++++--
|
|
||||||
1 file changed, 13 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
|
||||||
index ef3128f..3f72c13 100644
|
|
||||||
--- a/kernel/time/timer.c
|
|
||||||
+++ b/kernel/time/timer.c
|
|
||||||
@@ -1750,6 +1750,17 @@ signed long __sched schedule_timeout(signed long timeout)
|
|
||||||
|
|
||||||
expire = timeout + jiffies;
|
|
||||||
|
|
||||||
+ if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
|
|
||||||
+ /*
|
|
||||||
+ * Special case 1 as being a request for the minimum timeout
|
|
||||||
+ * and use highres timers to timeout after 1ms to workaround
|
|
||||||
+ * the granularity of low Hz tick timers.
|
|
||||||
+ */
|
|
||||||
+ if (!schedule_min_hrtimeout())
|
|
||||||
+ return 0;
|
|
||||||
+ goto out_timeout;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
|
|
||||||
__mod_timer(&timer, expire, false);
|
|
||||||
schedule();
|
|
||||||
@@ -1757,10 +1768,10 @@ signed long __sched schedule_timeout(signed long timeout)
|
|
||||||
|
|
||||||
/* Remove the timer from the object tracker */
|
|
||||||
destroy_timer_on_stack(&timer);
|
|
||||||
-
|
|
||||||
+out_timeout:
|
|
||||||
timeout = expire - jiffies;
|
|
||||||
|
|
||||||
- out:
|
|
||||||
+out:
|
|
||||||
return timeout < 0 ? 0 : timeout;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(schedule_timeout);
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
From 534bc9d3e559420eaf57771f48d2c2f549dcc4d2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Fri, 4 Nov 2016 09:25:54 +1100
|
|
||||||
Subject: [PATCH 11/25] Convert msleep to use hrtimers when active.
|
|
||||||
|
|
||||||
---
|
|
||||||
kernel/time/timer.c | 24 ++++++++++++++++++++++--
|
|
||||||
1 file changed, 22 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
|
||||||
index 3f72c13..bc53598 100644
|
|
||||||
--- a/kernel/time/timer.c
|
|
||||||
+++ b/kernel/time/timer.c
|
|
||||||
@@ -1892,7 +1892,19 @@ void __init init_timers(void)
|
|
||||||
*/
|
|
||||||
void msleep(unsigned int msecs)
|
|
||||||
{
|
|
||||||
- unsigned long timeout = msecs_to_jiffies(msecs) + 1;
|
|
||||||
+ int jiffs = msecs_to_jiffies(msecs);
|
|
||||||
+ unsigned long timeout;
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * Use high resolution timers where the resolution of tick based
|
|
||||||
+ * timers is inadequate.
|
|
||||||
+ */
|
|
||||||
+ if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
|
|
||||||
+ while (msecs)
|
|
||||||
+ msecs = schedule_msec_hrtimeout_uninterruptible(msecs);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ timeout = msecs_to_jiffies(msecs) + 1;
|
|
||||||
|
|
||||||
while (timeout)
|
|
||||||
timeout = schedule_timeout_uninterruptible(timeout);
|
|
||||||
@@ -1906,7 +1918,15 @@ EXPORT_SYMBOL(msleep);
|
|
||||||
*/
|
|
||||||
unsigned long msleep_interruptible(unsigned int msecs)
|
|
||||||
{
|
|
||||||
- unsigned long timeout = msecs_to_jiffies(msecs) + 1;
|
|
||||||
+ int jiffs = msecs_to_jiffies(msecs);
|
|
||||||
+ unsigned long timeout;
|
|
||||||
+
|
|
||||||
+ if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
|
|
||||||
+ while (msecs && !signal_pending(current))
|
|
||||||
+ msecs = schedule_msec_hrtimeout_interruptible(msecs);
|
|
||||||
+ return msecs;
|
|
||||||
+ }
|
|
||||||
+ timeout = msecs_to_jiffies(msecs) + 1;
|
|
||||||
|
|
||||||
while (timeout && !signal_pending(current))
|
|
||||||
timeout = schedule_timeout_interruptible(timeout);
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,226 +0,0 @@
|
||||||
From 8fef7b75352d874af02881de3493f2ce2d47a341 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:28:30 +1100
|
|
||||||
Subject: [PATCH 12/25] Replace all schedule timeout(1) with
|
|
||||||
schedule_min_hrtimeout()
|
|
||||||
|
|
||||||
---
|
|
||||||
drivers/block/swim.c | 6 +++---
|
|
||||||
drivers/char/ipmi/ipmi_msghandler.c | 2 +-
|
|
||||||
drivers/char/ipmi/ipmi_ssif.c | 2 +-
|
|
||||||
drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | 2 +-
|
|
||||||
drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | 2 +-
|
|
||||||
drivers/mfd/ucb1x00-core.c | 2 +-
|
|
||||||
drivers/misc/sgi-xp/xpc_channel.c | 2 +-
|
|
||||||
drivers/net/caif/caif_hsi.c | 2 +-
|
|
||||||
drivers/ntb/test/ntb_perf.c | 2 +-
|
|
||||||
drivers/staging/comedi/drivers/ni_mio_common.c | 2 +-
|
|
||||||
fs/afs/vlocation.c | 2 +-
|
|
||||||
fs/btrfs/extent-tree.c | 2 +-
|
|
||||||
fs/btrfs/inode-map.c | 2 +-
|
|
||||||
sound/usb/line6/pcm.c | 2 +-
|
|
||||||
14 files changed, 16 insertions(+), 16 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/block/swim.c b/drivers/block/swim.c
|
|
||||||
index b5afd49..7d09955 100644
|
|
||||||
--- a/drivers/block/swim.c
|
|
||||||
+++ b/drivers/block/swim.c
|
|
||||||
@@ -332,7 +332,7 @@ static inline void swim_motor(struct swim __iomem *base,
|
|
||||||
if (swim_readbit(base, MOTOR_ON))
|
|
||||||
break;
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
}
|
|
||||||
} else if (action == OFF) {
|
|
||||||
swim_action(base, MOTOR_OFF);
|
|
||||||
@@ -351,7 +351,7 @@ static inline void swim_eject(struct swim __iomem *base)
|
|
||||||
if (!swim_readbit(base, DISK_IN))
|
|
||||||
break;
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
}
|
|
||||||
swim_select(base, RELAX);
|
|
||||||
}
|
|
||||||
@@ -375,7 +375,7 @@ static inline int swim_step(struct swim __iomem *base)
|
|
||||||
for (wait = 0; wait < HZ; wait++) {
|
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
|
|
||||||
swim_select(base, RELAX);
|
|
||||||
if (!swim_readbit(base, STEP))
|
|
||||||
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
|
|
||||||
index 92e53ac..a2418e7 100644
|
|
||||||
--- a/drivers/char/ipmi/ipmi_msghandler.c
|
|
||||||
+++ b/drivers/char/ipmi/ipmi_msghandler.c
|
|
||||||
@@ -2953,7 +2953,7 @@ static void cleanup_smi_msgs(ipmi_smi_t intf)
|
|
||||||
/* Current message first, to preserve order */
|
|
||||||
while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) {
|
|
||||||
/* Wait for the message to clear out. */
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* No need for locks, the interface is down. */
|
|
||||||
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c
|
|
||||||
index cca6e5b..fd3c7da 100644
|
|
||||||
--- a/drivers/char/ipmi/ipmi_ssif.c
|
|
||||||
+++ b/drivers/char/ipmi/ipmi_ssif.c
|
|
||||||
@@ -1185,7 +1185,7 @@ static int ssif_remove(struct i2c_client *client)
|
|
||||||
|
|
||||||
/* make sure the driver is not looking for flags any more. */
|
|
||||||
while (ssif_info->ssif_state != SSIF_NORMAL)
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
|
|
||||||
ssif_info->stopping = true;
|
|
||||||
del_timer_sync(&ssif_info->retry_timer);
|
|
||||||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
|
|
||||||
index b6a0806..b5b02cf 100644
|
|
||||||
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
|
|
||||||
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
|
|
||||||
@@ -235,7 +235,7 @@ static int vmw_fifo_wait_noirq(struct vmw_private *dev_priv,
|
|
||||||
DRM_ERROR("SVGA device lockup.\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
if (interruptible && signal_pending(current)) {
|
|
||||||
ret = -ERESTARTSYS;
|
|
||||||
break;
|
|
||||||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
|
|
||||||
index 0c7e172..4c1555c 100644
|
|
||||||
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
|
|
||||||
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
|
|
||||||
@@ -156,7 +156,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv,
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (lazy)
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
else if ((++count & 0x0F) == 0) {
|
|
||||||
/**
|
|
||||||
* FIXME: Use schedule_hr_timeout here for
|
|
||||||
diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c
|
|
||||||
index d6fb2e1..7ac951b 100644
|
|
||||||
--- a/drivers/mfd/ucb1x00-core.c
|
|
||||||
+++ b/drivers/mfd/ucb1x00-core.c
|
|
||||||
@@ -253,7 +253,7 @@ unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync)
|
|
||||||
break;
|
|
||||||
/* yield to other processes */
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
}
|
|
||||||
|
|
||||||
return UCB_ADC_DAT(val);
|
|
||||||
diff --git a/drivers/misc/sgi-xp/xpc_channel.c b/drivers/misc/sgi-xp/xpc_channel.c
|
|
||||||
index 128d561..38e68e9 100644
|
|
||||||
--- a/drivers/misc/sgi-xp/xpc_channel.c
|
|
||||||
+++ b/drivers/misc/sgi-xp/xpc_channel.c
|
|
||||||
@@ -837,7 +837,7 @@ xpc_allocate_msg_wait(struct xpc_channel *ch)
|
|
||||||
|
|
||||||
atomic_inc(&ch->n_on_msg_allocate_wq);
|
|
||||||
prepare_to_wait(&ch->msg_allocate_wq, &wait, TASK_INTERRUPTIBLE);
|
|
||||||
- ret = schedule_timeout(1);
|
|
||||||
+ ret = schedule_min_hrtimeout();
|
|
||||||
finish_wait(&ch->msg_allocate_wq, &wait);
|
|
||||||
atomic_dec(&ch->n_on_msg_allocate_wq);
|
|
||||||
|
|
||||||
diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c
|
|
||||||
index ddabce7..67fb5ce 100644
|
|
||||||
--- a/drivers/net/caif/caif_hsi.c
|
|
||||||
+++ b/drivers/net/caif/caif_hsi.c
|
|
||||||
@@ -944,7 +944,7 @@ static void cfhsi_wake_down(struct work_struct *work)
|
|
||||||
break;
|
|
||||||
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
retry--;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
|
|
||||||
index 434e1d4..2f9543b 100644
|
|
||||||
--- a/drivers/ntb/test/ntb_perf.c
|
|
||||||
+++ b/drivers/ntb/test/ntb_perf.c
|
|
||||||
@@ -308,7 +308,7 @@ static int perf_move_data(struct pthr_ctx *pctx, char __iomem *dst, char *src,
|
|
||||||
if (unlikely((jiffies - last_sleep) > 5 * HZ)) {
|
|
||||||
last_sleep = jiffies;
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unlikely(kthread_should_stop()))
|
|
||||||
diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c
|
|
||||||
index b2e3828..beae38b 100644
|
|
||||||
--- a/drivers/staging/comedi/drivers/ni_mio_common.c
|
|
||||||
+++ b/drivers/staging/comedi/drivers/ni_mio_common.c
|
|
||||||
@@ -4655,7 +4655,7 @@ static int cs5529_wait_for_idle(struct comedi_device *dev)
|
|
||||||
if ((status & NI67XX_CAL_STATUS_BUSY) == 0)
|
|
||||||
break;
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- if (schedule_timeout(1))
|
|
||||||
+ if (schedule_min_hrtimeout())
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
if (i == timeout) {
|
|
||||||
diff --git a/fs/afs/vlocation.c b/fs/afs/vlocation.c
|
|
||||||
index 45a8639..855d08e 100644
|
|
||||||
--- a/fs/afs/vlocation.c
|
|
||||||
+++ b/fs/afs/vlocation.c
|
|
||||||
@@ -129,7 +129,7 @@ static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl,
|
|
||||||
if (vl->upd_busy_cnt > 1) {
|
|
||||||
/* second+ BUSY - sleep a little bit */
|
|
||||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
|
|
||||||
index dcd2e79..16bf891 100644
|
|
||||||
--- a/fs/btrfs/extent-tree.c
|
|
||||||
+++ b/fs/btrfs/extent-tree.c
|
|
||||||
@@ -5952,7 +5952,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
|
|
||||||
|
|
||||||
if (flush != BTRFS_RESERVE_NO_FLUSH &&
|
|
||||||
btrfs_transaction_in_commit(fs_info))
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
|
|
||||||
if (delalloc_lock)
|
|
||||||
mutex_lock(&BTRFS_I(inode)->delalloc_mutex);
|
|
||||||
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c
|
|
||||||
index 144b119..03d2e8e 100644
|
|
||||||
--- a/fs/btrfs/inode-map.c
|
|
||||||
+++ b/fs/btrfs/inode-map.c
|
|
||||||
@@ -89,7 +89,7 @@ static int caching_kthread(void *data)
|
|
||||||
btrfs_release_path(path);
|
|
||||||
root->ino_cache_progress = last;
|
|
||||||
up_read(&fs_info->commit_root_sem);
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
goto again;
|
|
||||||
} else
|
|
||||||
continue;
|
|
||||||
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
|
|
||||||
index fab53f5..fda1ab5 100644
|
|
||||||
--- a/sound/usb/line6/pcm.c
|
|
||||||
+++ b/sound/usb/line6/pcm.c
|
|
||||||
@@ -131,7 +131,7 @@ static void line6_wait_clear_audio_urbs(struct snd_line6_pcm *line6pcm,
|
|
||||||
if (!alive)
|
|
||||||
break;
|
|
||||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
- schedule_timeout(1);
|
|
||||||
+ schedule_min_hrtimeout();
|
|
||||||
} while (--timeout > 0);
|
|
||||||
if (alive)
|
|
||||||
dev_err(line6pcm->line6->ifcdev,
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,397 +0,0 @@
|
||||||
From 56e8b01452fbb6c1aa85b0a52fbd352fddf7e959 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:29:16 +1100
|
|
||||||
Subject: [PATCH 13/25] Change all schedule_timeout with msecs_to_jiffies
|
|
||||||
potentially under 50ms to use schedule_msec_hrtimeout.
|
|
||||||
|
|
||||||
---
|
|
||||||
drivers/bluetooth/hci_qca.c | 2 +-
|
|
||||||
drivers/char/snsc.c | 4 ++--
|
|
||||||
drivers/media/pci/ivtv/ivtv-ioctl.c | 2 +-
|
|
||||||
drivers/media/pci/ivtv/ivtv-streams.c | 2 +-
|
|
||||||
drivers/net/can/usb/peak_usb/pcan_usb.c | 2 +-
|
|
||||||
drivers/net/usb/lan78xx.c | 2 +-
|
|
||||||
drivers/net/usb/usbnet.c | 2 +-
|
|
||||||
drivers/scsi/fnic/fnic_scsi.c | 4 ++--
|
|
||||||
drivers/scsi/snic/snic_scsi.c | 2 +-
|
|
||||||
drivers/staging/lustre/lnet/lnet/lib-eq.c | 2 +-
|
|
||||||
drivers/staging/rts5208/rtsx.c | 2 +-
|
|
||||||
drivers/staging/speakup/speakup_acntpc.c | 4 ++--
|
|
||||||
drivers/staging/speakup/speakup_apollo.c | 2 +-
|
|
||||||
drivers/staging/speakup/speakup_decext.c | 2 +-
|
|
||||||
drivers/staging/speakup/speakup_decpc.c | 2 +-
|
|
||||||
drivers/staging/speakup/speakup_dectlk.c | 2 +-
|
|
||||||
drivers/staging/speakup/speakup_dtlk.c | 4 ++--
|
|
||||||
drivers/staging/speakup/speakup_keypc.c | 4 ++--
|
|
||||||
drivers/staging/speakup/synth.c | 2 +-
|
|
||||||
drivers/staging/unisys/visornic/visornic_main.c | 6 +++---
|
|
||||||
drivers/target/target_core_user.c | 2 +-
|
|
||||||
drivers/video/fbdev/omap/hwa742.c | 2 +-
|
|
||||||
drivers/video/fbdev/pxafb.c | 2 +-
|
|
||||||
23 files changed, 30 insertions(+), 30 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
|
|
||||||
index 05c2307..6954d29 100644
|
|
||||||
--- a/drivers/bluetooth/hci_qca.c
|
|
||||||
+++ b/drivers/bluetooth/hci_qca.c
|
|
||||||
@@ -880,7 +880,7 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
|
|
||||||
* then host can communicate with new baudrate to controller
|
|
||||||
*/
|
|
||||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(BAUDRATE_SETTLE_TIMEOUT_MS));
|
|
||||||
+ schedule_msec_hrtimeout((BAUDRATE_SETTLE_TIMEOUT_MS));
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c
|
|
||||||
index ec07f0e..3410b46 100644
|
|
||||||
--- a/drivers/char/snsc.c
|
|
||||||
+++ b/drivers/char/snsc.c
|
|
||||||
@@ -198,7 +198,7 @@ scdrv_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos)
|
|
||||||
add_wait_queue(&sd->sd_rq, &wait);
|
|
||||||
spin_unlock_irqrestore(&sd->sd_rlock, flags);
|
|
||||||
|
|
||||||
- schedule_timeout(msecs_to_jiffies(SCDRV_TIMEOUT));
|
|
||||||
+ schedule_msec_hrtimeout((SCDRV_TIMEOUT));
|
|
||||||
|
|
||||||
remove_wait_queue(&sd->sd_rq, &wait);
|
|
||||||
if (signal_pending(current)) {
|
|
||||||
@@ -294,7 +294,7 @@ scdrv_write(struct file *file, const char __user *buf,
|
|
||||||
add_wait_queue(&sd->sd_wq, &wait);
|
|
||||||
spin_unlock_irqrestore(&sd->sd_wlock, flags);
|
|
||||||
|
|
||||||
- schedule_timeout(msecs_to_jiffies(SCDRV_TIMEOUT));
|
|
||||||
+ schedule_msec_hrtimeout((SCDRV_TIMEOUT));
|
|
||||||
|
|
||||||
remove_wait_queue(&sd->sd_wq, &wait);
|
|
||||||
if (signal_pending(current)) {
|
|
||||||
diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c
|
|
||||||
index 2dc4b20..8e061cf 100644
|
|
||||||
--- a/drivers/media/pci/ivtv/ivtv-ioctl.c
|
|
||||||
+++ b/drivers/media/pci/ivtv/ivtv-ioctl.c
|
|
||||||
@@ -1151,7 +1151,7 @@ void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id std)
|
|
||||||
TASK_UNINTERRUPTIBLE);
|
|
||||||
if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
|
|
||||||
break;
|
|
||||||
- schedule_timeout(msecs_to_jiffies(25));
|
|
||||||
+ schedule_msec_hrtimeout((25));
|
|
||||||
}
|
|
||||||
finish_wait(&itv->vsync_waitq, &wait);
|
|
||||||
mutex_lock(&itv->serialize_lock);
|
|
||||||
diff --git a/drivers/media/pci/ivtv/ivtv-streams.c b/drivers/media/pci/ivtv/ivtv-streams.c
|
|
||||||
index d27c6df..e9ffc4e 100644
|
|
||||||
--- a/drivers/media/pci/ivtv/ivtv-streams.c
|
|
||||||
+++ b/drivers/media/pci/ivtv/ivtv-streams.c
|
|
||||||
@@ -834,7 +834,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
|
|
||||||
while (!test_bit(IVTV_F_I_EOS, &itv->i_flags) &&
|
|
||||||
time_before(jiffies,
|
|
||||||
then + msecs_to_jiffies(2000))) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout((10));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* To convert jiffies to ms, we must multiply by 1000
|
|
||||||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c
|
|
||||||
index 838545c..34f8972 100644
|
|
||||||
--- a/drivers/net/can/usb/peak_usb/pcan_usb.c
|
|
||||||
+++ b/drivers/net/can/usb/peak_usb/pcan_usb.c
|
|
||||||
@@ -250,7 +250,7 @@ static int pcan_usb_write_mode(struct peak_usb_device *dev, u8 onoff)
|
|
||||||
} else {
|
|
||||||
/* the PCAN-USB needs time to init */
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT));
|
|
||||||
+ schedule_msec_hrtimeout((PCAN_USB_STARTUP_TIMEOUT));
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
|
|
||||||
index 08f8703..3b3bc86 100644
|
|
||||||
--- a/drivers/net/usb/lan78xx.c
|
|
||||||
+++ b/drivers/net/usb/lan78xx.c
|
|
||||||
@@ -2544,7 +2544,7 @@ static void lan78xx_terminate_urbs(struct lan78xx_net *dev)
|
|
||||||
while (!skb_queue_empty(&dev->rxq) &&
|
|
||||||
!skb_queue_empty(&dev->txq) &&
|
|
||||||
!skb_queue_empty(&dev->done)) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS));
|
|
||||||
+ schedule_msec_hrtimeout((UNLINK_TIMEOUT_MS));
|
|
||||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
netif_dbg(dev, ifdown, dev->net,
|
|
||||||
"waited for %d urb completions\n", temp);
|
|
||||||
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
|
|
||||||
index 3de65ea..f8a4b18 100644
|
|
||||||
--- a/drivers/net/usb/usbnet.c
|
|
||||||
+++ b/drivers/net/usb/usbnet.c
|
|
||||||
@@ -767,7 +767,7 @@ static void wait_skb_queue_empty(struct sk_buff_head *q)
|
|
||||||
spin_lock_irqsave(&q->lock, flags);
|
|
||||||
while (!skb_queue_empty(q)) {
|
|
||||||
spin_unlock_irqrestore(&q->lock, flags);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS));
|
|
||||||
+ schedule_msec_hrtimeout((UNLINK_TIMEOUT_MS));
|
|
||||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
spin_lock_irqsave(&q->lock, flags);
|
|
||||||
}
|
|
||||||
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
|
|
||||||
index adb3d58..de73e78 100644
|
|
||||||
--- a/drivers/scsi/fnic/fnic_scsi.c
|
|
||||||
+++ b/drivers/scsi/fnic/fnic_scsi.c
|
|
||||||
@@ -217,7 +217,7 @@ int fnic_fw_reset_handler(struct fnic *fnic)
|
|
||||||
|
|
||||||
/* wait for io cmpl */
|
|
||||||
while (atomic_read(&fnic->in_flight))
|
|
||||||
- schedule_timeout(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout((1));
|
|
||||||
|
|
||||||
spin_lock_irqsave(&fnic->wq_copy_lock[0], flags);
|
|
||||||
|
|
||||||
@@ -2201,7 +2201,7 @@ static int fnic_clean_pending_aborts(struct fnic *fnic,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- schedule_timeout(msecs_to_jiffies(2 * fnic->config.ed_tov));
|
|
||||||
+ schedule_msec_hrtimeout((2 * fnic->config.ed_tov));
|
|
||||||
|
|
||||||
/* walk again to check, if IOs are still pending in fw */
|
|
||||||
if (fnic_is_abts_pending(fnic, lr_sc))
|
|
||||||
diff --git a/drivers/scsi/snic/snic_scsi.c b/drivers/scsi/snic/snic_scsi.c
|
|
||||||
index abada16..0bf30dc 100644
|
|
||||||
--- a/drivers/scsi/snic/snic_scsi.c
|
|
||||||
+++ b/drivers/scsi/snic/snic_scsi.c
|
|
||||||
@@ -2356,7 +2356,7 @@ snic_reset(struct Scsi_Host *shost, struct scsi_cmnd *sc)
|
|
||||||
|
|
||||||
/* Wait for all the IOs that are entered in Qcmd */
|
|
||||||
while (atomic_read(&snic->ios_inflight))
|
|
||||||
- schedule_timeout(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout((1));
|
|
||||||
|
|
||||||
ret = snic_issue_hba_reset(snic, sc);
|
|
||||||
if (ret) {
|
|
||||||
diff --git a/drivers/staging/lustre/lnet/lnet/lib-eq.c b/drivers/staging/lustre/lnet/lnet/lib-eq.c
|
|
||||||
index d05c6cc..3f62b6f 100644
|
|
||||||
--- a/drivers/staging/lustre/lnet/lnet/lib-eq.c
|
|
||||||
+++ b/drivers/staging/lustre/lnet/lnet/lib-eq.c
|
|
||||||
@@ -328,7 +328,7 @@ __must_hold(&the_lnet.ln_eq_wait_lock)
|
|
||||||
schedule();
|
|
||||||
} else {
|
|
||||||
now = jiffies;
|
|
||||||
- schedule_timeout(msecs_to_jiffies(tms));
|
|
||||||
+ schedule_msec_hrtimeout((tms));
|
|
||||||
tms -= jiffies_to_msecs(jiffies - now);
|
|
||||||
if (tms < 0) /* no more wait but may have new event */
|
|
||||||
tms = 0;
|
|
||||||
diff --git a/drivers/staging/rts5208/rtsx.c b/drivers/staging/rts5208/rtsx.c
|
|
||||||
index 68d75d0..aef88c4 100644
|
|
||||||
--- a/drivers/staging/rts5208/rtsx.c
|
|
||||||
+++ b/drivers/staging/rts5208/rtsx.c
|
|
||||||
@@ -537,7 +537,7 @@ static int rtsx_polling_thread(void *__dev)
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(POLLING_INTERVAL));
|
|
||||||
+ schedule_msec_hrtimeout((POLLING_INTERVAL));
|
|
||||||
|
|
||||||
/* lock the device pointers */
|
|
||||||
mutex_lock(&dev->dev_mutex);
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_acntpc.c b/drivers/staging/speakup/speakup_acntpc.c
|
|
||||||
index efb791b..fd02fb2 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_acntpc.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_acntpc.c
|
|
||||||
@@ -204,7 +204,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
full_time_val = full_time->u.n.value;
|
|
||||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
|
||||||
if (synth_full()) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(full_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((full_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
set_current_state(TASK_RUNNING);
|
|
||||||
@@ -232,7 +232,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
jiffy_delta_val = jiffy_delta->u.n.value;
|
|
||||||
delay_time_val = delay_time->u.n.value;
|
|
||||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
jiff_max = jiffies+jiffy_delta_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_apollo.c b/drivers/staging/speakup/speakup_apollo.c
|
|
||||||
index 3cbc8a7..3c17854 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_apollo.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_apollo.c
|
|
||||||
@@ -172,7 +172,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
outb(UART_MCR_DTR, speakup_info.port_tts + UART_MCR);
|
|
||||||
outb(UART_MCR_DTR | UART_MCR_RTS,
|
|
||||||
speakup_info.port_tts + UART_MCR);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(full_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((full_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (time_after_eq(jiffies, jiff_max) && (ch == SPACE)) {
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_decext.c b/drivers/staging/speakup/speakup_decext.c
|
|
||||||
index 1a5cf3d..fa2b4e1 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_decext.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_decext.c
|
|
||||||
@@ -186,7 +186,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
if (ch == '\n')
|
|
||||||
ch = 0x0D;
|
|
||||||
if (synth_full() || !spk_serial_out(ch)) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
set_current_state(TASK_RUNNING);
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_decpc.c b/drivers/staging/speakup/speakup_decpc.c
|
|
||||||
index d6479bd..f7554bf 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_decpc.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_decpc.c
|
|
||||||
@@ -403,7 +403,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
if (ch == '\n')
|
|
||||||
ch = 0x0D;
|
|
||||||
if (dt_sendchar(ch)) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
set_current_state(TASK_RUNNING);
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_dectlk.c b/drivers/staging/speakup/speakup_dectlk.c
|
|
||||||
index 7646567..639192e 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_dectlk.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_dectlk.c
|
|
||||||
@@ -251,7 +251,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
if (ch == '\n')
|
|
||||||
ch = 0x0D;
|
|
||||||
if (synth_full_val || !spk_serial_out(ch)) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
set_current_state(TASK_RUNNING);
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_dtlk.c b/drivers/staging/speakup/speakup_dtlk.c
|
|
||||||
index 38aa401..1640519 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_dtlk.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_dtlk.c
|
|
||||||
@@ -217,7 +217,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
delay_time_val = delay_time->u.n.value;
|
|
||||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
|
||||||
if (synth_full()) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
set_current_state(TASK_RUNNING);
|
|
||||||
@@ -233,7 +233,7 @@ static void do_catch_up(struct spk_synth *synth)
|
|
||||||
delay_time_val = delay_time->u.n.value;
|
|
||||||
jiffy_delta_val = jiffy_delta->u.n.value;
|
|
||||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
jiff_max = jiffies + jiffy_delta_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/speakup/speakup_keypc.c b/drivers/staging/speakup/speakup_keypc.c
|
|
||||||
index 5e2170b..30b5df7 100644
|
|
||||||
--- a/drivers/staging/speakup/speakup_keypc.c
|
|
||||||
+++ b/drivers/staging/speakup/speakup_keypc.c
|
|
||||||
@@ -206,7 +206,7 @@ spin_lock_irqsave(&speakup_info.spinlock, flags);
|
|
||||||
full_time_val = full_time->u.n.value;
|
|
||||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
|
||||||
if (synth_full()) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(full_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((full_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
set_current_state(TASK_RUNNING);
|
|
||||||
@@ -239,7 +239,7 @@ spin_lock_irqsave(&speakup_info.spinlock, flags);
|
|
||||||
jiffy_delta_val = jiffy_delta->u.n.value;
|
|
||||||
delay_time_val = delay_time->u.n.value;
|
|
||||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(delay_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((delay_time_val));
|
|
||||||
jiff_max = jiffies+jiffy_delta_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c
|
|
||||||
index a61c02b..14299e5 100644
|
|
||||||
--- a/drivers/staging/speakup/synth.c
|
|
||||||
+++ b/drivers/staging/speakup/synth.c
|
|
||||||
@@ -120,7 +120,7 @@ void spk_do_catch_up(struct spk_synth *synth)
|
|
||||||
if (ch == '\n')
|
|
||||||
ch = synth->procspeech;
|
|
||||||
if (!spk_serial_out(ch)) {
|
|
||||||
- schedule_timeout(msecs_to_jiffies(full_time_val));
|
|
||||||
+ schedule_msec_hrtimeout((full_time_val));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (time_after_eq(jiffies, jiff_max) && (ch == SPACE)) {
|
|
||||||
diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c
|
|
||||||
index c1f674f..4f30a7a 100644
|
|
||||||
--- a/drivers/staging/unisys/visornic/visornic_main.c
|
|
||||||
+++ b/drivers/staging/unisys/visornic/visornic_main.c
|
|
||||||
@@ -468,7 +468,7 @@ visornic_disable_with_timeout(struct net_device *netdev, const int timeout)
|
|
||||||
}
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
spin_unlock_irqrestore(&devdata->priv_lock, flags);
|
|
||||||
- wait += schedule_timeout(msecs_to_jiffies(10));
|
|
||||||
+ wait += schedule_msec_hrtimeout((10));
|
|
||||||
spin_lock_irqsave(&devdata->priv_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -479,7 +479,7 @@ visornic_disable_with_timeout(struct net_device *netdev, const int timeout)
|
|
||||||
while (1) {
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
spin_unlock_irqrestore(&devdata->priv_lock, flags);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout((10));
|
|
||||||
spin_lock_irqsave(&devdata->priv_lock, flags);
|
|
||||||
if (atomic_read(&devdata->usage))
|
|
||||||
break;
|
|
||||||
@@ -611,7 +611,7 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout)
|
|
||||||
}
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
spin_unlock_irqrestore(&devdata->priv_lock, flags);
|
|
||||||
- wait += schedule_timeout(msecs_to_jiffies(10));
|
|
||||||
+ wait += schedule_msec_hrtimeout((10));
|
|
||||||
spin_lock_irqsave(&devdata->priv_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
|
|
||||||
index 8041710..f907a81 100644
|
|
||||||
--- a/drivers/target/target_core_user.c
|
|
||||||
+++ b/drivers/target/target_core_user.c
|
|
||||||
@@ -451,7 +451,7 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
|
|
||||||
|
|
||||||
pr_debug("sleeping for ring space\n");
|
|
||||||
spin_unlock_irq(&udev->cmdr_lock);
|
|
||||||
- ret = schedule_timeout(msecs_to_jiffies(TCMU_TIME_OUT));
|
|
||||||
+ ret = schedule_msec_hrtimeout((TCMU_TIME_OUT));
|
|
||||||
finish_wait(&udev->wait_cmdr, &__wait);
|
|
||||||
if (!ret) {
|
|
||||||
pr_warn("tcmu: command timed out\n");
|
|
||||||
diff --git a/drivers/video/fbdev/omap/hwa742.c b/drivers/video/fbdev/omap/hwa742.c
|
|
||||||
index a4ee65b..cf38bcb 100644
|
|
||||||
--- a/drivers/video/fbdev/omap/hwa742.c
|
|
||||||
+++ b/drivers/video/fbdev/omap/hwa742.c
|
|
||||||
@@ -926,7 +926,7 @@ static void hwa742_resume(void)
|
|
||||||
if (hwa742_read_reg(HWA742_PLL_DIV_REG) & (1 << 7))
|
|
||||||
break;
|
|
||||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(5));
|
|
||||||
+ schedule_msec_hrtimeout((5));
|
|
||||||
}
|
|
||||||
hwa742_set_update_mode(hwa742.update_mode_before_suspend);
|
|
||||||
}
|
|
||||||
diff --git a/drivers/video/fbdev/pxafb.c b/drivers/video/fbdev/pxafb.c
|
|
||||||
index ef73f14..7b5483b 100644
|
|
||||||
--- a/drivers/video/fbdev/pxafb.c
|
|
||||||
+++ b/drivers/video/fbdev/pxafb.c
|
|
||||||
@@ -1287,7 +1287,7 @@ static int pxafb_smart_thread(void *arg)
|
|
||||||
mutex_unlock(&fbi->ctrlr_lock);
|
|
||||||
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
- schedule_timeout(msecs_to_jiffies(30));
|
|
||||||
+ schedule_msec_hrtimeout((30));
|
|
||||||
}
|
|
||||||
|
|
||||||
pr_debug("%s(): task ending\n", __func__);
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
From af94b59651831b7e176ce8cb98441bdccb87eac0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:30:07 +1100
|
|
||||||
Subject: [PATCH 14/25] Replace all calls to schedule_timeout_interruptible of
|
|
||||||
potentially under 50ms to use schedule_msec_hrtimeout_interruptible.
|
|
||||||
|
|
||||||
---
|
|
||||||
drivers/hwmon/fam15h_power.c | 2 +-
|
|
||||||
drivers/iio/light/tsl2563.c | 6 +-----
|
|
||||||
drivers/media/i2c/msp3400-driver.c | 4 ++--
|
|
||||||
drivers/media/pci/ivtv/ivtv-gpio.c | 6 +++---
|
|
||||||
drivers/media/radio/radio-mr800.c | 2 +-
|
|
||||||
drivers/media/radio/radio-tea5777.c | 2 +-
|
|
||||||
drivers/media/radio/tea575x.c | 2 +-
|
|
||||||
drivers/misc/panel.c | 2 +-
|
|
||||||
drivers/parport/ieee1284.c | 2 +-
|
|
||||||
drivers/parport/ieee1284_ops.c | 2 +-
|
|
||||||
drivers/platform/x86/intel_ips.c | 8 ++++----
|
|
||||||
net/core/pktgen.c | 2 +-
|
|
||||||
sound/soc/codecs/wm8350.c | 12 ++++++------
|
|
||||||
sound/soc/codecs/wm8900.c | 2 +-
|
|
||||||
sound/soc/codecs/wm9713.c | 4 ++--
|
|
||||||
15 files changed, 27 insertions(+), 31 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c
|
|
||||||
index 15aa49d..991e8a7 100644
|
|
||||||
--- a/drivers/hwmon/fam15h_power.c
|
|
||||||
+++ b/drivers/hwmon/fam15h_power.c
|
|
||||||
@@ -238,7 +238,7 @@ static ssize_t acc_show_power(struct device *dev,
|
|
||||||
prev_ptsc[cu] = data->cpu_sw_pwr_ptsc[cu];
|
|
||||||
}
|
|
||||||
|
|
||||||
- leftover = schedule_timeout_interruptible(msecs_to_jiffies(data->power_period));
|
|
||||||
+ leftover = schedule_msec_hrtimeout_interruptible((data->power_period));
|
|
||||||
if (leftover)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
diff --git a/drivers/iio/light/tsl2563.c b/drivers/iio/light/tsl2563.c
|
|
||||||
index 04598ae..a8c095d 100644
|
|
||||||
--- a/drivers/iio/light/tsl2563.c
|
|
||||||
+++ b/drivers/iio/light/tsl2563.c
|
|
||||||
@@ -282,11 +282,7 @@ static void tsl2563_wait_adc(struct tsl2563_chip *chip)
|
|
||||||
default:
|
|
||||||
delay = 402;
|
|
||||||
}
|
|
||||||
- /*
|
|
||||||
- * TODO: Make sure that we wait at least required delay but why we
|
|
||||||
- * have to extend it one tick more?
|
|
||||||
- */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(delay) + 2);
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(delay + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tsl2563_adjust_gainlevel(struct tsl2563_chip *chip, u16 adc)
|
|
||||||
diff --git a/drivers/media/i2c/msp3400-driver.c b/drivers/media/i2c/msp3400-driver.c
|
|
||||||
index 201a9800..5cebabc 100644
|
|
||||||
--- a/drivers/media/i2c/msp3400-driver.c
|
|
||||||
+++ b/drivers/media/i2c/msp3400-driver.c
|
|
||||||
@@ -184,7 +184,7 @@ static int msp_read(struct i2c_client *client, int dev, int addr)
|
|
||||||
break;
|
|
||||||
dev_warn(&client->dev, "I/O error #%d (read 0x%02x/0x%02x)\n", err,
|
|
||||||
dev, addr);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((10));
|
|
||||||
}
|
|
||||||
if (err == 3) {
|
|
||||||
dev_warn(&client->dev, "resetting chip, sound will go off.\n");
|
|
||||||
@@ -225,7 +225,7 @@ static int msp_write(struct i2c_client *client, int dev, int addr, int val)
|
|
||||||
break;
|
|
||||||
dev_warn(&client->dev, "I/O error #%d (write 0x%02x/0x%02x)\n", err,
|
|
||||||
dev, addr);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((10));
|
|
||||||
}
|
|
||||||
if (err == 3) {
|
|
||||||
dev_warn(&client->dev, "resetting chip, sound will go off.\n");
|
|
||||||
diff --git a/drivers/media/pci/ivtv/ivtv-gpio.c b/drivers/media/pci/ivtv/ivtv-gpio.c
|
|
||||||
index f752f39..23372af6 100644
|
|
||||||
--- a/drivers/media/pci/ivtv/ivtv-gpio.c
|
|
||||||
+++ b/drivers/media/pci/ivtv/ivtv-gpio.c
|
|
||||||
@@ -117,7 +117,7 @@ void ivtv_reset_ir_gpio(struct ivtv *itv)
|
|
||||||
curout = (curout & ~0xF) | 1;
|
|
||||||
write_reg(curout, IVTV_REG_GPIO_OUT);
|
|
||||||
/* We could use something else for smaller time */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((1));
|
|
||||||
curout |= 2;
|
|
||||||
write_reg(curout, IVTV_REG_GPIO_OUT);
|
|
||||||
curdir &= ~0x80;
|
|
||||||
@@ -137,11 +137,11 @@ int ivtv_reset_tuner_gpio(void *dev, int component, int cmd, int value)
|
|
||||||
curout = read_reg(IVTV_REG_GPIO_OUT);
|
|
||||||
curout &= ~(1 << itv->card->xceive_pin);
|
|
||||||
write_reg(curout, IVTV_REG_GPIO_OUT);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((1));
|
|
||||||
|
|
||||||
curout |= 1 << itv->card->xceive_pin;
|
|
||||||
write_reg(curout, IVTV_REG_GPIO_OUT);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((1));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/media/radio/radio-mr800.c b/drivers/media/radio/radio-mr800.c
|
|
||||||
index c2927fd..bdee269 100644
|
|
||||||
--- a/drivers/media/radio/radio-mr800.c
|
|
||||||
+++ b/drivers/media/radio/radio-mr800.c
|
|
||||||
@@ -382,7 +382,7 @@ static int vidioc_s_hw_freq_seek(struct file *file, void *priv,
|
|
||||||
retval = -ENODATA;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
- if (schedule_timeout_interruptible(msecs_to_jiffies(10))) {
|
|
||||||
+ if (schedule_msec_hrtimeout_interruptible((10))) {
|
|
||||||
retval = -ERESTARTSYS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/media/radio/radio-tea5777.c b/drivers/media/radio/radio-tea5777.c
|
|
||||||
index 83fe7ab..aaae5fa 100644
|
|
||||||
--- a/drivers/media/radio/radio-tea5777.c
|
|
||||||
+++ b/drivers/media/radio/radio-tea5777.c
|
|
||||||
@@ -249,7 +249,7 @@ static int radio_tea5777_update_read_reg(struct radio_tea5777 *tea, int wait)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wait) {
|
|
||||||
- if (schedule_timeout_interruptible(msecs_to_jiffies(wait)))
|
|
||||||
+ if (schedule_msec_hrtimeout_interruptible((wait)))
|
|
||||||
return -ERESTARTSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/media/radio/tea575x.c b/drivers/media/radio/tea575x.c
|
|
||||||
index 4dc2067..29f4416 100644
|
|
||||||
--- a/drivers/media/radio/tea575x.c
|
|
||||||
+++ b/drivers/media/radio/tea575x.c
|
|
||||||
@@ -416,7 +416,7 @@ int snd_tea575x_s_hw_freq_seek(struct file *file, struct snd_tea575x *tea,
|
|
||||||
for (;;) {
|
|
||||||
if (time_after(jiffies, timeout))
|
|
||||||
break;
|
|
||||||
- if (schedule_timeout_interruptible(msecs_to_jiffies(10))) {
|
|
||||||
+ if (schedule_msec_hrtimeout_interruptible((10))) {
|
|
||||||
/* some signal arrived, stop search */
|
|
||||||
tea->val &= ~TEA575X_BIT_SEARCH;
|
|
||||||
snd_tea575x_set_freq(tea);
|
|
||||||
diff --git a/drivers/misc/panel.c b/drivers/misc/panel.c
|
|
||||||
index 6030ac5..f0c1a101 100644
|
|
||||||
--- a/drivers/misc/panel.c
|
|
||||||
+++ b/drivers/misc/panel.c
|
|
||||||
@@ -760,7 +760,7 @@ static void long_sleep(int ms)
|
|
||||||
if (in_interrupt())
|
|
||||||
mdelay(ms);
|
|
||||||
else
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(ms));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((ms));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c
|
|
||||||
index f9fd4b3..00ad2f3 100644
|
|
||||||
--- a/drivers/parport/ieee1284.c
|
|
||||||
+++ b/drivers/parport/ieee1284.c
|
|
||||||
@@ -215,7 +215,7 @@ int parport_wait_peripheral(struct parport *port,
|
|
||||||
/* parport_wait_event didn't time out, but the
|
|
||||||
* peripheral wasn't actually ready either.
|
|
||||||
* Wait for another 10ms. */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((10));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c
|
|
||||||
index c0e7d21..e1b4fd4 100644
|
|
||||||
--- a/drivers/parport/ieee1284_ops.c
|
|
||||||
+++ b/drivers/parport/ieee1284_ops.c
|
|
||||||
@@ -536,7 +536,7 @@ size_t parport_ieee1284_ecp_read_data (struct parport *port,
|
|
||||||
/* Yield the port for a while. */
|
|
||||||
if (count && dev->port->irq != PARPORT_IRQ_NONE) {
|
|
||||||
parport_release (dev);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(40));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((40));
|
|
||||||
parport_claim_or_block (dev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c
|
|
||||||
index 55663b3..0363fed 100644
|
|
||||||
--- a/drivers/platform/x86/intel_ips.c
|
|
||||||
+++ b/drivers/platform/x86/intel_ips.c
|
|
||||||
@@ -812,7 +812,7 @@ static int ips_adjust(void *data)
|
|
||||||
ips_gpu_lower(ips);
|
|
||||||
|
|
||||||
sleep:
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(IPS_ADJUST_PERIOD));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((IPS_ADJUST_PERIOD));
|
|
||||||
} while (!kthread_should_stop());
|
|
||||||
|
|
||||||
dev_dbg(&ips->dev->dev, "ips-adjust thread stopped\n");
|
|
||||||
@@ -991,7 +991,7 @@ static int ips_monitor(void *data)
|
|
||||||
seqno_timestamp = get_jiffies_64();
|
|
||||||
|
|
||||||
old_cpu_power = thm_readl(THM_CEC);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD));
|
|
||||||
|
|
||||||
/* Collect an initial average */
|
|
||||||
for (i = 0; i < IPS_SAMPLE_COUNT; i++) {
|
|
||||||
@@ -1018,7 +1018,7 @@ static int ips_monitor(void *data)
|
|
||||||
mchp_samples[i] = mchp;
|
|
||||||
}
|
|
||||||
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD));
|
|
||||||
if (kthread_should_stop())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
@@ -1045,7 +1045,7 @@ static int ips_monitor(void *data)
|
|
||||||
* us to reduce the sample frequency if the CPU and GPU are idle.
|
|
||||||
*/
|
|
||||||
old_cpu_power = thm_readl(THM_CEC);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD));
|
|
||||||
last_sample_period = IPS_SAMPLE_PERIOD;
|
|
||||||
|
|
||||||
setup_deferrable_timer_on_stack(&timer, monitor_timeout,
|
|
||||||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
|
|
||||||
index 8e69ce4..0227415 100644
|
|
||||||
--- a/net/core/pktgen.c
|
|
||||||
+++ b/net/core/pktgen.c
|
|
||||||
@@ -1992,7 +1992,7 @@ static void pktgen_mark_device(const struct pktgen_net *pn, const char *ifname)
|
|
||||||
mutex_unlock(&pktgen_thread_lock);
|
|
||||||
pr_debug("%s: waiting for %s to disappear....\n",
|
|
||||||
__func__, ifname);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((msec_per_try));
|
|
||||||
mutex_lock(&pktgen_thread_lock);
|
|
||||||
|
|
||||||
if (++i >= max_tries) {
|
|
||||||
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c
|
|
||||||
index 2efc5b4..3e3248c 100644
|
|
||||||
--- a/sound/soc/codecs/wm8350.c
|
|
||||||
+++ b/sound/soc/codecs/wm8350.c
|
|
||||||
@@ -236,10 +236,10 @@ static void wm8350_pga_work(struct work_struct *work)
|
|
||||||
out2->ramp == WM8350_RAMP_UP) {
|
|
||||||
/* delay is longer over 0dB as increases are larger */
|
|
||||||
if (i >= WM8350_OUTn_0dB)
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(
|
|
||||||
(2));
|
|
||||||
else
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(
|
|
||||||
(1));
|
|
||||||
} else
|
|
||||||
udelay(50); /* doesn't matter if we delay longer */
|
|
||||||
@@ -1123,7 +1123,7 @@ static int wm8350_set_bias_level(struct snd_soc_codec *codec,
|
|
||||||
(platform->dis_out4 << 6));
|
|
||||||
|
|
||||||
/* wait for discharge */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(
|
|
||||||
(platform->
|
|
||||||
cap_discharge_msecs));
|
|
||||||
|
|
||||||
@@ -1139,7 +1139,7 @@ static int wm8350_set_bias_level(struct snd_soc_codec *codec,
|
|
||||||
WM8350_VBUFEN);
|
|
||||||
|
|
||||||
/* wait for vmid */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(
|
|
||||||
(platform->
|
|
||||||
vmid_charge_msecs));
|
|
||||||
|
|
||||||
@@ -1190,7 +1190,7 @@ static int wm8350_set_bias_level(struct snd_soc_codec *codec,
|
|
||||||
wm8350_reg_write(wm8350, WM8350_POWER_MGMT_1, pm1);
|
|
||||||
|
|
||||||
/* wait */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(
|
|
||||||
(platform->
|
|
||||||
vmid_discharge_msecs));
|
|
||||||
|
|
||||||
@@ -1208,7 +1208,7 @@ static int wm8350_set_bias_level(struct snd_soc_codec *codec,
|
|
||||||
pm1 | WM8350_OUTPUT_DRAIN_EN);
|
|
||||||
|
|
||||||
/* wait */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies
|
|
||||||
+ schedule_msec_hrtimeout_interruptible(
|
|
||||||
(platform->drain_msecs));
|
|
||||||
|
|
||||||
pm1 &= ~WM8350_BIASEN;
|
|
||||||
diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c
|
|
||||||
index c77b49a..fc50456 100644
|
|
||||||
--- a/sound/soc/codecs/wm8900.c
|
|
||||||
+++ b/sound/soc/codecs/wm8900.c
|
|
||||||
@@ -1112,7 +1112,7 @@ static int wm8900_set_bias_level(struct snd_soc_codec *codec,
|
|
||||||
/* Need to let things settle before stopping the clock
|
|
||||||
* to ensure that restart works, see "Stopping the
|
|
||||||
* master clock" in the datasheet. */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((1));
|
|
||||||
snd_soc_write(codec, WM8900_REG_POWER2,
|
|
||||||
WM8900_REG_POWER2_SYSCLK_ENA);
|
|
||||||
break;
|
|
||||||
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
|
|
||||||
index 7e48221..0c85a20 100644
|
|
||||||
--- a/sound/soc/codecs/wm9713.c
|
|
||||||
+++ b/sound/soc/codecs/wm9713.c
|
|
||||||
@@ -199,7 +199,7 @@ static int wm9713_voice_shutdown(struct snd_soc_dapm_widget *w,
|
|
||||||
|
|
||||||
/* Gracefully shut down the voice interface. */
|
|
||||||
snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, 0x0200);
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((1));
|
|
||||||
snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, 0x0f00);
|
|
||||||
snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x1000, 0x1000);
|
|
||||||
|
|
||||||
@@ -868,7 +868,7 @@ static int wm9713_set_pll(struct snd_soc_codec *codec,
|
|
||||||
wm9713->pll_in = freq_in;
|
|
||||||
|
|
||||||
/* wait 10ms AC97 link frames for the link to stabilise */
|
|
||||||
- schedule_timeout_interruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_interruptible((10));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,160 +0,0 @@
|
||||||
From 1137ff2bfa5eb63b53747fe303fdb3937c5e1077 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:30:32 +1100
|
|
||||||
Subject: [PATCH 15/25] Replace all calls to schedule_timeout_uninterruptible
|
|
||||||
of potentially under 50ms to use schedule_msec_hrtimeout_uninterruptible
|
|
||||||
|
|
||||||
---
|
|
||||||
drivers/media/pci/cx18/cx18-gpio.c | 4 ++--
|
|
||||||
drivers/net/wireless/intel/ipw2x00/ipw2100.c | 4 ++--
|
|
||||||
drivers/rtc/rtc-wm8350.c | 6 +++---
|
|
||||||
drivers/scsi/lpfc/lpfc_scsi.c | 2 +-
|
|
||||||
sound/pci/maestro3.c | 4 ++--
|
|
||||||
sound/soc/codecs/rt5631.c | 4 ++--
|
|
||||||
sound/soc/soc-dapm.c | 2 +-
|
|
||||||
7 files changed, 13 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/media/pci/cx18/cx18-gpio.c b/drivers/media/pci/cx18/cx18-gpio.c
|
|
||||||
index 38dc6b8..3cd3098 100644
|
|
||||||
--- a/drivers/media/pci/cx18/cx18-gpio.c
|
|
||||||
+++ b/drivers/media/pci/cx18/cx18-gpio.c
|
|
||||||
@@ -95,11 +95,11 @@ static void gpio_reset_seq(struct cx18 *cx, u32 active_lo, u32 active_hi,
|
|
||||||
|
|
||||||
/* Assert */
|
|
||||||
gpio_update(cx, mask, ~active_lo);
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(assert_msecs));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((assert_msecs));
|
|
||||||
|
|
||||||
/* Deassert */
|
|
||||||
gpio_update(cx, mask, ~active_hi);
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(recovery_msecs));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((recovery_msecs));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.c b/drivers/net/wireless/intel/ipw2x00/ipw2100.c
|
|
||||||
index 356aba9..d2cc761 100644
|
|
||||||
--- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c
|
|
||||||
+++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c
|
|
||||||
@@ -830,7 +830,7 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
|
|
||||||
* doesn't seem to have as many firmware restart cycles...
|
|
||||||
*
|
|
||||||
* As a test, we're sticking in a 1/100s delay here */
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((10));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
@@ -1281,7 +1281,7 @@ static int ipw2100_start_adapter(struct ipw2100_priv *priv)
|
|
||||||
IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n");
|
|
||||||
i = 5000;
|
|
||||||
do {
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(40));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((40));
|
|
||||||
/* Todo... wait for sync command ... */
|
|
||||||
|
|
||||||
read_register(priv->net_dev, IPW_REG_INTA, &inta);
|
|
||||||
diff --git a/drivers/rtc/rtc-wm8350.c b/drivers/rtc/rtc-wm8350.c
|
|
||||||
index fa247de..f1a28d8 100644
|
|
||||||
--- a/drivers/rtc/rtc-wm8350.c
|
|
||||||
+++ b/drivers/rtc/rtc-wm8350.c
|
|
||||||
@@ -121,7 +121,7 @@ static int wm8350_rtc_settime(struct device *dev, struct rtc_time *tm)
|
|
||||||
/* Wait until confirmation of stopping */
|
|
||||||
do {
|
|
||||||
rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL);
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((1));
|
|
||||||
} while (--retries && !(rtc_ctrl & WM8350_RTC_STS));
|
|
||||||
|
|
||||||
if (!retries) {
|
|
||||||
@@ -204,7 +204,7 @@ static int wm8350_rtc_stop_alarm(struct wm8350 *wm8350)
|
|
||||||
/* Wait until confirmation of stopping */
|
|
||||||
do {
|
|
||||||
rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL);
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((1));
|
|
||||||
} while (retries-- && !(rtc_ctrl & WM8350_RTC_ALMSTS));
|
|
||||||
|
|
||||||
if (!(rtc_ctrl & WM8350_RTC_ALMSTS))
|
|
||||||
@@ -227,7 +227,7 @@ static int wm8350_rtc_start_alarm(struct wm8350 *wm8350)
|
|
||||||
/* Wait until confirmation */
|
|
||||||
do {
|
|
||||||
rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL);
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(1));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((1));
|
|
||||||
} while (retries-- && rtc_ctrl & WM8350_RTC_ALMSTS);
|
|
||||||
|
|
||||||
if (rtc_ctrl & WM8350_RTC_ALMSTS)
|
|
||||||
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
|
|
||||||
index ad350d9..69a58a8 100644
|
|
||||||
--- a/drivers/scsi/lpfc/lpfc_scsi.c
|
|
||||||
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
|
|
||||||
@@ -5109,7 +5109,7 @@ lpfc_reset_flush_io_context(struct lpfc_vport *vport, uint16_t tgt_id,
|
|
||||||
tgt_id, lun_id, context);
|
|
||||||
later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies;
|
|
||||||
while (time_after(later, jiffies) && cnt) {
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(20));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((20));
|
|
||||||
cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context);
|
|
||||||
}
|
|
||||||
if (cnt) {
|
|
||||||
diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c
|
|
||||||
index cafea6d..d374514 100644
|
|
||||||
--- a/sound/pci/maestro3.c
|
|
||||||
+++ b/sound/pci/maestro3.c
|
|
||||||
@@ -2016,7 +2016,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip)
|
|
||||||
outw(0, io + GPIO_DATA);
|
|
||||||
outw(dir | GPO_PRIMARY_AC97, io + GPIO_DIRECTION);
|
|
||||||
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(delay1));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((delay1));
|
|
||||||
|
|
||||||
outw(GPO_PRIMARY_AC97, io + GPIO_DATA);
|
|
||||||
udelay(5);
|
|
||||||
@@ -2024,7 +2024,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip)
|
|
||||||
outw(IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE, io + RING_BUS_CTRL_A);
|
|
||||||
outw(~0, io + GPIO_MASK);
|
|
||||||
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(delay2));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((delay2));
|
|
||||||
|
|
||||||
if (! snd_m3_try_read_vendor(chip))
|
|
||||||
break;
|
|
||||||
diff --git a/sound/soc/codecs/rt5631.c b/sound/soc/codecs/rt5631.c
|
|
||||||
index 0e41808..611cb9f 100644
|
|
||||||
--- a/sound/soc/codecs/rt5631.c
|
|
||||||
+++ b/sound/soc/codecs/rt5631.c
|
|
||||||
@@ -419,7 +419,7 @@ static void onebit_depop_mute_stage(struct snd_soc_codec *codec, int enable)
|
|
||||||
hp_zc = snd_soc_read(codec, RT5631_INT_ST_IRQ_CTRL_2);
|
|
||||||
snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff);
|
|
||||||
if (enable) {
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((10));
|
|
||||||
/* config one-bit depop parameter */
|
|
||||||
rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x307f);
|
|
||||||
snd_soc_update_bits(codec, RT5631_HP_OUT_VOL,
|
|
||||||
@@ -529,7 +529,7 @@ static void depop_seq_mute_stage(struct snd_soc_codec *codec, int enable)
|
|
||||||
hp_zc = snd_soc_read(codec, RT5631_INT_ST_IRQ_CTRL_2);
|
|
||||||
snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff);
|
|
||||||
if (enable) {
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(10));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((10));
|
|
||||||
|
|
||||||
/* config depop sequence parameter */
|
|
||||||
rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x302f);
|
|
||||||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
|
|
||||||
index 27dd02e..7ba49f4 100644
|
|
||||||
--- a/sound/soc/soc-dapm.c
|
|
||||||
+++ b/sound/soc/soc-dapm.c
|
|
||||||
@@ -134,7 +134,7 @@ static void dapm_assert_locked(struct snd_soc_dapm_context *dapm)
|
|
||||||
static void pop_wait(u32 pop_time)
|
|
||||||
{
|
|
||||||
if (pop_time)
|
|
||||||
- schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
|
|
||||||
+ schedule_msec_hrtimeout_uninterruptible((pop_time));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...)
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
From 37496baeea800e745a77620e90660496135f7fa5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:31:42 +1100
|
|
||||||
Subject: [PATCH 16/25] Fix build for disabled highres timers with hrtimeout
|
|
||||||
code.
|
|
||||||
|
|
||||||
---
|
|
||||||
include/linux/freezer.h | 1 +
|
|
||||||
include/linux/sched.h | 22 ++++++++++++++++++++++
|
|
||||||
kernel/time/timer.c | 2 ++
|
|
||||||
3 files changed, 25 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/include/linux/freezer.h b/include/linux/freezer.h
|
|
||||||
index dd03e83..2fda682 100644
|
|
||||||
--- a/include/linux/freezer.h
|
|
||||||
+++ b/include/linux/freezer.h
|
|
||||||
@@ -296,6 +296,7 @@ static inline void set_freezable(void) {}
|
|
||||||
#define wait_event_freezekillable_unsafe(wq, condition) \
|
|
||||||
wait_event_killable(wq, condition)
|
|
||||||
|
|
||||||
+#define pm_freezing (false)
|
|
||||||
#endif /* !CONFIG_FREEZER */
|
|
||||||
|
|
||||||
#endif /* FREEZER_H_INCLUDED */
|
|
||||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
|
||||||
index 46544f4..680494d 100644
|
|
||||||
--- a/include/linux/sched.h
|
|
||||||
+++ b/include/linux/sched.h
|
|
||||||
@@ -458,10 +458,32 @@ extern signed long schedule_timeout_killable(signed long timeout);
|
|
||||||
extern signed long schedule_timeout_uninterruptible(signed long timeout);
|
|
||||||
extern signed long schedule_timeout_idle(signed long timeout);
|
|
||||||
|
|
||||||
+#ifdef CONFIG_HIGH_RES_TIMERS
|
|
||||||
extern signed long schedule_msec_hrtimeout(signed long timeout);
|
|
||||||
extern signed long schedule_min_hrtimeout(void);
|
|
||||||
extern signed long schedule_msec_hrtimeout_interruptible(signed long timeout);
|
|
||||||
extern signed long schedule_msec_hrtimeout_uninterruptible(signed long timeout);
|
|
||||||
+#else
|
|
||||||
+static inline signed long schedule_msec_hrtimeout(signed long timeout)
|
|
||||||
+{
|
|
||||||
+ return schedule_timeout(msecs_to_jiffies(timeout));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline signed long schedule_min_hrtimeout(void)
|
|
||||||
+{
|
|
||||||
+ return schedule_timeout(1);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline signed long schedule_msec_hrtimeout_interruptible(signed long timeout)
|
|
||||||
+{
|
|
||||||
+ return schedule_timeout_interruptible(msecs_to_jiffies(timeout));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static inline signed long schedule_msec_hrtimeout_uninterruptible(signed long timeout)
|
|
||||||
+{
|
|
||||||
+ return schedule_timeout_uninterruptible(msecs_to_jiffies(timeout));
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
asmlinkage void schedule(void);
|
|
||||||
extern void schedule_preempt_disabled(void);
|
|
||||||
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
|
||||||
index bc53598..0e22641 100644
|
|
||||||
--- a/kernel/time/timer.c
|
|
||||||
+++ b/kernel/time/timer.c
|
|
||||||
@@ -1750,6 +1750,7 @@ signed long __sched schedule_timeout(signed long timeout)
|
|
||||||
|
|
||||||
expire = timeout + jiffies;
|
|
||||||
|
|
||||||
+#ifdef CONFIG_HIGH_RES_TIMERS
|
|
||||||
if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
|
|
||||||
/*
|
|
||||||
* Special case 1 as being a request for the minimum timeout
|
|
||||||
@@ -1760,6 +1761,7 @@ signed long __sched schedule_timeout(signed long timeout)
|
|
||||||
return 0;
|
|
||||||
goto out_timeout;
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
|
|
||||||
__mod_timer(&timer, expire, false);
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
From a0d29f014dbcb29649dff1a9b8df58bad7be3926 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Wed, 7 Dec 2016 21:13:16 +1100
|
|
||||||
Subject: [PATCH 18/25] Make threaded IRQs optionally the default which can be
|
|
||||||
disabled.
|
|
||||||
|
|
||||||
---
|
|
||||||
kernel/irq/Kconfig | 14 ++++++++++++++
|
|
||||||
kernel/irq/manage.c | 10 ++++++++++
|
|
||||||
2 files changed, 24 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig
|
|
||||||
index 3bbfd6a..351bf16 100644
|
|
||||||
--- a/kernel/irq/Kconfig
|
|
||||||
+++ b/kernel/irq/Kconfig
|
|
||||||
@@ -95,6 +95,20 @@ config IRQ_DOMAIN_DEBUG
|
|
||||||
config IRQ_FORCED_THREADING
|
|
||||||
bool
|
|
||||||
|
|
||||||
+config FORCE_IRQ_THREADING
|
|
||||||
+ bool "Make IRQ threading compulsory"
|
|
||||||
+ depends on IRQ_FORCED_THREADING
|
|
||||||
+ default y
|
|
||||||
+ ---help---
|
|
||||||
+
|
|
||||||
+ Make IRQ threading mandatory for any IRQ handlers that support it
|
|
||||||
+ instead of being optional and requiring the threadirqs kernel
|
|
||||||
+ parameter. Instead they can be optionally disabled with the
|
|
||||||
+ nothreadirqs kernel parameter.
|
|
||||||
+
|
|
||||||
+ Enable if you are building for a desktop or low latency system,
|
|
||||||
+ otherwise say N.
|
|
||||||
+
|
|
||||||
config SPARSE_IRQ
|
|
||||||
bool "Support sparse irq numbering" if MAY_HAVE_SPARSE_IRQ
|
|
||||||
---help---
|
|
||||||
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
|
|
||||||
index 6b66959..6b3fb17 100644
|
|
||||||
--- a/kernel/irq/manage.c
|
|
||||||
+++ b/kernel/irq/manage.c
|
|
||||||
@@ -22,7 +22,17 @@
|
|
||||||
#include "internals.h"
|
|
||||||
|
|
||||||
#ifdef CONFIG_IRQ_FORCED_THREADING
|
|
||||||
+#ifdef CONFIG_FORCE_IRQ_THREADING
|
|
||||||
+__read_mostly bool force_irqthreads = true;
|
|
||||||
+#else
|
|
||||||
__read_mostly bool force_irqthreads;
|
|
||||||
+#endif
|
|
||||||
+static int __init setup_noforced_irqthreads(char *arg)
|
|
||||||
+{
|
|
||||||
+ force_irqthreads = false;
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+early_param("nothreadirqs", setup_noforced_irqthreads);
|
|
||||||
|
|
||||||
static int __init setup_forced_irqthreads(char *arg)
|
|
||||||
{
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
From a278cad439033005610ddda23882f2c681c669d1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:32:58 +1100
|
|
||||||
Subject: [PATCH 20/25] Don't use hrtimer overlay when pm_freezing since some
|
|
||||||
drivers still don't correctly use freezable timeouts.
|
|
||||||
|
|
||||||
---
|
|
||||||
kernel/time/hrtimer.c | 2 +-
|
|
||||||
kernel/time/timer.c | 9 +++++----
|
|
||||||
2 files changed, 6 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
|
|
||||||
index 26ac1f8..25e1555 100644
|
|
||||||
--- a/kernel/time/hrtimer.c
|
|
||||||
+++ b/kernel/time/hrtimer.c
|
|
||||||
@@ -1818,7 +1818,7 @@ signed long __sched schedule_msec_hrtimeout(signed long timeout)
|
|
||||||
* (yet) better than Hz, as would occur during startup, use regular
|
|
||||||
* timers.
|
|
||||||
*/
|
|
||||||
- if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ)
|
|
||||||
+ if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ || pm_freezing)
|
|
||||||
return schedule_timeout(jiffs);
|
|
||||||
|
|
||||||
delta = (timeout % 1000) * NSEC_PER_MSEC;
|
|
||||||
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
|
|
||||||
index 0e22641..45a6e1f 100644
|
|
||||||
--- a/kernel/time/timer.c
|
|
||||||
+++ b/kernel/time/timer.c
|
|
||||||
@@ -42,6 +42,7 @@
|
|
||||||
#include <linux/sched/sysctl.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/compat.h>
|
|
||||||
+#include <linux/freezer.h>
|
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
|
||||||
#include <asm/unistd.h>
|
|
||||||
@@ -1901,12 +1902,12 @@ void msleep(unsigned int msecs)
|
|
||||||
* Use high resolution timers where the resolution of tick based
|
|
||||||
* timers is inadequate.
|
|
||||||
*/
|
|
||||||
- if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
|
|
||||||
+ if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) {
|
|
||||||
while (msecs)
|
|
||||||
msecs = schedule_msec_hrtimeout_uninterruptible(msecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
- timeout = msecs_to_jiffies(msecs) + 1;
|
|
||||||
+ timeout = jiffs + 1;
|
|
||||||
|
|
||||||
while (timeout)
|
|
||||||
timeout = schedule_timeout_uninterruptible(timeout);
|
|
||||||
@@ -1923,12 +1924,12 @@ unsigned long msleep_interruptible(unsigned int msecs)
|
|
||||||
int jiffs = msecs_to_jiffies(msecs);
|
|
||||||
unsigned long timeout;
|
|
||||||
|
|
||||||
- if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
|
|
||||||
+ if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) {
|
|
||||||
while (msecs && !signal_pending(current))
|
|
||||||
msecs = schedule_msec_hrtimeout_interruptible(msecs);
|
|
||||||
return msecs;
|
|
||||||
}
|
|
||||||
- timeout = msecs_to_jiffies(msecs) + 1;
|
|
||||||
+ timeout = jiffs + 1;
|
|
||||||
|
|
||||||
while (timeout && !signal_pending(current))
|
|
||||||
timeout = schedule_timeout_interruptible(timeout);
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
From da915e0f3abeb61f6a132bb77b7d0a9bf0573233 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:38:23 +1100
|
|
||||||
Subject: [PATCH 21/25] Make writeback throttling default enabled.
|
|
||||||
|
|
||||||
---
|
|
||||||
block/Kconfig | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/block/Kconfig b/block/Kconfig
|
|
||||||
index 8bf114a..83e6f9d 100644
|
|
||||||
--- a/block/Kconfig
|
|
||||||
+++ b/block/Kconfig
|
|
||||||
@@ -123,7 +123,7 @@ config BLK_CMDLINE_PARSER
|
|
||||||
|
|
||||||
config BLK_WBT
|
|
||||||
bool "Enable support for block device writeback throttling"
|
|
||||||
- default n
|
|
||||||
+ default y
|
|
||||||
---help---
|
|
||||||
Enabling this option enables the block layer to throttle buffered
|
|
||||||
background writeback from the VM, making it more smooth and having
|
|
||||||
@@ -133,7 +133,7 @@ config BLK_WBT
|
|
||||||
|
|
||||||
config BLK_WBT_SQ
|
|
||||||
bool "Single queue writeback throttling"
|
|
||||||
- default n
|
|
||||||
+ default y
|
|
||||||
depends on BLK_WBT
|
|
||||||
---help---
|
|
||||||
Enable writeback throttling by default on legacy single queue devices
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
From 2f96168f72bbd431c0e6d28b44393e98b49ca787 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Con Kolivas <kernel@kolivas.org>
|
|
||||||
Date: Mon, 20 Feb 2017 13:48:54 +1100
|
|
||||||
Subject: [PATCH 22/25] Swap sucks.
|
|
||||||
|
|
||||||
---
|
|
||||||
include/linux/swap.h | 6 +-----
|
|
||||||
mm/vmscan.c | 2 +-
|
|
||||||
2 files changed, 2 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/linux/swap.h b/include/linux/swap.h
|
|
||||||
index 7f47b70..1c2ed28 100644
|
|
||||||
--- a/include/linux/swap.h
|
|
||||||
+++ b/include/linux/swap.h
|
|
||||||
@@ -361,11 +361,7 @@ extern struct page *swapin_readahead(swp_entry_t, gfp_t,
|
|
||||||
extern atomic_long_t nr_swap_pages;
|
|
||||||
extern long total_swap_pages;
|
|
||||||
|
|
||||||
-/* Swap 50% full? Release swapcache more aggressively.. */
|
|
||||||
-static inline bool vm_swap_full(void)
|
|
||||||
-{
|
|
||||||
- return atomic_long_read(&nr_swap_pages) * 2 < total_swap_pages;
|
|
||||||
-}
|
|
||||||
+#define vm_swap_full() 1
|
|
||||||
|
|
||||||
static inline long get_nr_swap_pages(void)
|
|
||||||
{
|
|
||||||
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
|
||||||
index 532a2a7..15e4260 100644
|
|
||||||
--- a/mm/vmscan.c
|
|
||||||
+++ b/mm/vmscan.c
|
|
||||||
@@ -141,7 +141,7 @@ struct scan_control {
|
|
||||||
/*
|
|
||||||
* From 0 .. 100. Higher means more swappy.
|
|
||||||
*/
|
|
||||||
-int vm_swappiness = 60;
|
|
||||||
+int vm_swappiness = 33;
|
|
||||||
/*
|
|
||||||
* The total number of pages which are beyond the high watermark within all
|
|
||||||
* zones.
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
|
||||||
|
index 00ef432..0c2bf77 100644
|
||||||
|
--- a/arch/x86/kernel/cpu/mcheck/mce.c
|
||||||
|
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
|
||||||
|
@@ -1157,6 +1157,23 @@ void do_machine_check(struct pt_regs *regs, long error_code)
|
||||||
|
|
||||||
|
mce_gather_info(&m, regs);
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Check if this MCE is signaled to only this logical processor,
|
||||||
|
+ * on Intel only.
|
||||||
|
+ */
|
||||||
|
+ if (m.cpuvendor == X86_VENDOR_INTEL)
|
||||||
|
+ lmce = m.mcgstatus & MCG_STATUS_LMCES;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Special treatment for Intel broadcasted machine check:
|
||||||
|
+ * To avoid panic due to MCE synchronization in case of kdump,
|
||||||
|
+ * after system panic, clear global status and bail out.
|
||||||
|
+ */
|
||||||
|
+ if (!lmce && atomic_read(&panic_cpu) != PANIC_CPU_INVALID) {
|
||||||
|
+ wrmsrl(MSR_IA32_MCG_STATUS, 0);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
final = this_cpu_ptr(&mces_seen);
|
||||||
|
*final = m;
|
||||||
|
|
||||||
|
@@ -1174,13 +1191,6 @@ void do_machine_check(struct pt_regs *regs, long error_code)
|
||||||
|
kill_it = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Check if this MCE is signaled to only this logical processor,
|
||||||
|
- * on Intel only.
|
||||||
|
- */
|
||||||
|
- if (m.cpuvendor == X86_VENDOR_INTEL)
|
||||||
|
- lmce = m.mcgstatus & MCG_STATUS_LMCES;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
* Go through all banks in exclusion of the other CPUs. This way we
|
||||||
|
* don't report duplicated events on shared banks because the first one
|
||||||
|
* to see it will clear it. If this is a Local MCE, then no need to
|
||||||
|
|
Loading…
Reference in New Issue