Linux 3.3
Rebase to the 3.3 release
This commit is contained in:
parent
d8b686023e
commit
bfafc479d5
@ -1,78 +0,0 @@
|
||||
From 0769c5de24621141c953fbe1f943582d37cb4244 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Stephan=20B=C3=A4rwolf?= <stephan.baerwolf@tu-ilmenau.de>
|
||||
Date: Thu, 12 Jan 2012 16:43:03 +0100
|
||||
Subject: [PATCH 1/2] KVM: x86: extend "struct x86_emulate_ops" with
|
||||
"get_cpuid"
|
||||
|
||||
In order to be able to proceed checks on CPU-specific properties
|
||||
within the emulator, function "get_cpuid" is introduced.
|
||||
With "get_cpuid" it is possible to virtually call the guests
|
||||
"cpuid"-opcode without changing the VM's context.
|
||||
|
||||
[mtosatti: cleanup/beautify code]
|
||||
|
||||
Signed-off-by: Stephan Baerwolf <stephan.baerwolf@tu-ilmenau.de>
|
||||
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
|
||||
---
|
||||
arch/x86/include/asm/kvm_emulate.h | 3 +++
|
||||
arch/x86/kvm/x86.c | 23 +++++++++++++++++++++++
|
||||
2 files changed, 26 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
|
||||
index ab4092e..c8b2868 100644
|
||||
--- a/arch/x86/include/asm/kvm_emulate.h
|
||||
+++ b/arch/x86/include/asm/kvm_emulate.h
|
||||
@@ -190,6 +190,9 @@ struct x86_emulate_ops {
|
||||
int (*intercept)(struct x86_emulate_ctxt *ctxt,
|
||||
struct x86_instruction_info *info,
|
||||
enum x86_intercept_stage stage);
|
||||
+
|
||||
+ bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt,
|
||||
+ u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
|
||||
};
|
||||
|
||||
typedef u32 __attribute__((vector_size(16))) sse128_t;
|
||||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
||||
index f0fa3fb..c95ca2d 100644
|
||||
--- a/arch/x86/kvm/x86.c
|
||||
+++ b/arch/x86/kvm/x86.c
|
||||
@@ -4205,6 +4205,28 @@ static int emulator_intercept(struct x86_emulate_ctxt *ctxt,
|
||||
return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage);
|
||||
}
|
||||
|
||||
+static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt,
|
||||
+ u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
|
||||
+{
|
||||
+ struct kvm_cpuid_entry2 *cpuid = NULL;
|
||||
+
|
||||
+ if (eax && ecx)
|
||||
+ cpuid = kvm_find_cpuid_entry(emul_to_vcpu(ctxt),
|
||||
+ *eax, *ecx);
|
||||
+
|
||||
+ if (cpuid) {
|
||||
+ *eax = cpuid->eax;
|
||||
+ *ecx = cpuid->ecx;
|
||||
+ if (ebx)
|
||||
+ *ebx = cpuid->ebx;
|
||||
+ if (edx)
|
||||
+ *edx = cpuid->edx;
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static struct x86_emulate_ops emulate_ops = {
|
||||
.read_std = kvm_read_guest_virt_system,
|
||||
.write_std = kvm_write_guest_virt_system,
|
||||
@@ -4236,6 +4258,7 @@ static struct x86_emulate_ops emulate_ops = {
|
||||
.get_fpu = emulator_get_fpu,
|
||||
.put_fpu = emulator_put_fpu,
|
||||
.intercept = emulator_intercept,
|
||||
+ .get_cpuid = emulator_get_cpuid,
|
||||
};
|
||||
|
||||
static void cache_all_regs(struct kvm_vcpu *vcpu)
|
||||
--
|
||||
1.7.7.5
|
||||
|
@ -1,144 +0,0 @@
|
||||
From e28ba7bb020f07193bc000453c8775e9d2c0dda7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Stephan=20B=C3=A4rwolf?= <stephan.baerwolf@tu-ilmenau.de>
|
||||
Date: Thu, 12 Jan 2012 16:43:04 +0100
|
||||
Subject: [PATCH 2/2] KVM: x86: fix missing checks in syscall emulation
|
||||
|
||||
On hosts without this patch, 32bit guests will crash (and 64bit guests
|
||||
may behave in a wrong way) for example by simply executing following
|
||||
nasm-demo-application:
|
||||
|
||||
[bits 32]
|
||||
global _start
|
||||
SECTION .text
|
||||
_start: syscall
|
||||
|
||||
(I tested it with winxp and linux - both always crashed)
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
00000000 <_start>:
|
||||
0: 0f 05 syscall
|
||||
|
||||
The reason seems a missing "invalid opcode"-trap (int6) for the
|
||||
syscall opcode "0f05", which is not available on Intel CPUs
|
||||
within non-longmodes, as also on some AMD CPUs within legacy-mode.
|
||||
(depending on CPU vendor, MSR_EFER and cpuid)
|
||||
|
||||
Because previous mentioned OSs may not engage corresponding
|
||||
syscall target-registers (STAR, LSTAR, CSTAR), they remain
|
||||
NULL and (non trapping) syscalls are leading to multiple
|
||||
faults and finally crashs.
|
||||
|
||||
Depending on the architecture (AMD or Intel) pretended by
|
||||
guests, various checks according to vendor's documentation
|
||||
are implemented to overcome the current issue and behave
|
||||
like the CPUs physical counterparts.
|
||||
|
||||
[mtosatti: cleanup/beautify code]
|
||||
|
||||
Signed-off-by: Stephan Baerwolf <stephan.baerwolf@tu-ilmenau.de>
|
||||
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
|
||||
---
|
||||
arch/x86/include/asm/kvm_emulate.h | 13 +++++++++
|
||||
arch/x86/kvm/emulate.c | 51 ++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 64 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
|
||||
index c8b2868..7b9cfc4 100644
|
||||
--- a/arch/x86/include/asm/kvm_emulate.h
|
||||
+++ b/arch/x86/include/asm/kvm_emulate.h
|
||||
@@ -301,6 +301,19 @@ struct x86_emulate_ctxt {
|
||||
#define X86EMUL_MODE_PROT (X86EMUL_MODE_PROT16|X86EMUL_MODE_PROT32| \
|
||||
X86EMUL_MODE_PROT64)
|
||||
|
||||
+/* CPUID vendors */
|
||||
+#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
|
||||
+#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
|
||||
+#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
|
||||
+
|
||||
+#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
|
||||
+#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
|
||||
+#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
|
||||
+
|
||||
+#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
|
||||
+#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
|
||||
+#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
|
||||
+
|
||||
enum x86_intercept_stage {
|
||||
X86_ICTP_NONE = 0, /* Allow zero-init to not match anything */
|
||||
X86_ICPT_PRE_EXCEPT,
|
||||
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
|
||||
index 05a562b..0982507 100644
|
||||
--- a/arch/x86/kvm/emulate.c
|
||||
+++ b/arch/x86/kvm/emulate.c
|
||||
@@ -1891,6 +1891,51 @@ setup_syscalls_segments(struct x86_emulate_ctxt *ctxt,
|
||||
ss->p = 1;
|
||||
}
|
||||
|
||||
+static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt)
|
||||
+{
|
||||
+ struct x86_emulate_ops *ops = ctxt->ops;
|
||||
+ u32 eax, ebx, ecx, edx;
|
||||
+
|
||||
+ /*
|
||||
+ * syscall should always be enabled in longmode - so only become
|
||||
+ * vendor specific (cpuid) if other modes are active...
|
||||
+ */
|
||||
+ if (ctxt->mode == X86EMUL_MODE_PROT64)
|
||||
+ return true;
|
||||
+
|
||||
+ eax = 0x00000000;
|
||||
+ ecx = 0x00000000;
|
||||
+ if (ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx)) {
|
||||
+ /*
|
||||
+ * Intel ("GenuineIntel")
|
||||
+ * remark: Intel CPUs only support "syscall" in 64bit
|
||||
+ * longmode. Also an 64bit guest with a
|
||||
+ * 32bit compat-app running will #UD !! While this
|
||||
+ * behaviour can be fixed (by emulating) into AMD
|
||||
+ * response - CPUs of AMD can't behave like Intel.
|
||||
+ */
|
||||
+ if (ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx &&
|
||||
+ ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx &&
|
||||
+ edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx)
|
||||
+ return false;
|
||||
+
|
||||
+ /* AMD ("AuthenticAMD") */
|
||||
+ if (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx &&
|
||||
+ ecx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx &&
|
||||
+ edx == X86EMUL_CPUID_VENDOR_AuthenticAMD_edx)
|
||||
+ return true;
|
||||
+
|
||||
+ /* AMD ("AMDisbetter!") */
|
||||
+ if (ebx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx &&
|
||||
+ ecx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx &&
|
||||
+ edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx)
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ /* default: (not Intel, not AMD), apply Intel's stricter rules... */
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static int em_syscall(struct x86_emulate_ctxt *ctxt)
|
||||
{
|
||||
struct x86_emulate_ops *ops = ctxt->ops;
|
||||
@@ -1904,9 +1949,15 @@ static int em_syscall(struct x86_emulate_ctxt *ctxt)
|
||||
ctxt->mode == X86EMUL_MODE_VM86)
|
||||
return emulate_ud(ctxt);
|
||||
|
||||
+ if (!(em_syscall_is_enabled(ctxt)))
|
||||
+ return emulate_ud(ctxt);
|
||||
+
|
||||
ops->get_msr(ctxt, MSR_EFER, &efer);
|
||||
setup_syscalls_segments(ctxt, &cs, &ss);
|
||||
|
||||
+ if (!(efer & EFER_SCE))
|
||||
+ return emulate_ud(ctxt);
|
||||
+
|
||||
ops->get_msr(ctxt, MSR_STAR, &msr_data);
|
||||
msr_data >>= 32;
|
||||
cs_sel = (u16)(msr_data & 0xfffc);
|
||||
--
|
||||
1.7.7.5
|
||||
|
1861
alps.patch
1861
alps.patch
File diff suppressed because it is too large
Load Diff
@ -194,3 +194,15 @@ CONFIG_ARM_ERRATA_751472=y
|
||||
# CONFIG_MX3_IPU is not set
|
||||
# CONFIG_MX3_IPU_IRQS is not set
|
||||
|
||||
# CONFIG_OF_SELFTEST is not set
|
||||
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
|
||||
# CONFIG_INPUT_GP2A is not set
|
||||
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
|
||||
|
||||
# CONFIG_MACH_IMX51_DT is not set
|
||||
# CONFIG_MACH_IMX53_DT is not set
|
||||
# CONFIG_MACH_MX53_EVK is not set
|
||||
# CONFIG_MACH_MX53_SMD is not set
|
||||
# CONFIG_MACH_MX53_LOCO is not set
|
||||
# CONFIG_MACH_MX53_ARD is not set
|
||||
# CONFIG_ARM_EXYNOS4210_CPUFREQ is not set
|
||||
|
@ -14,3 +14,4 @@ CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
|
||||
CONFIG_CPU_FREQ_TABLE=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_NET_CALXEDA_XGMAC=y
|
||||
|
@ -1083,3 +1083,14 @@ CONFIG_LEDS_RENESAS_TPU=y
|
||||
# CONFIG_OMAP_IOMMU is not set
|
||||
CONFIG_USB_RENESAS_USBHS_HCD=m
|
||||
|
||||
# CONFIG_SOC_OMAPTI81XX is not set
|
||||
# CONFIG_SOC_OMAPAM33XX is not set
|
||||
# CONFIG_MACH_TI8148EVM is not set
|
||||
# CONFIG_OMAP4_ERRATA_I688 is not set
|
||||
# CONFIG_ARM_LPAE is not set
|
||||
# CONFIG_MICREL_KS8995MA is not set
|
||||
# CONFIG_CHARGER_MANAGER is not set
|
||||
# CONFIG_MFD_DA9052_SPI is not set
|
||||
# CONFIG_MFD_DA9052_I2C is not set
|
||||
# CONFIG_MFD_S5M_CORE is not set
|
||||
# CONFIG_VIDEO_AS3645A is not set
|
||||
|
@ -90,3 +90,12 @@ CONFIG_ARM_CPU_TOPOLOGY=y
|
||||
CONFIG_SCHED_MC=y
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_LEDS_RENESAS_TPU=y
|
||||
|
||||
# CONFIG_ARCH_TEGRA_2x_SOC is not set
|
||||
# CONFIG_ARCH_TEGRA_3x_SOC is not set
|
||||
# CONFIG_ETHERNET is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_DVB_TDA1004X is not set
|
||||
# CONFIG_DVB_PLL is not set
|
||||
# CONFIG_SND_SOC_TEGRA_ALC5632 is not set
|
||||
|
||||
|
@ -152,6 +152,7 @@ CONFIG_INFINIBAND_IPOIB_DEBUG=y
|
||||
CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y
|
||||
CONFIG_INFINIBAND_IPOIB_CM=y
|
||||
CONFIG_INFINIBAND_SRP=m
|
||||
CONFIG_INFINIBAND_SRPT=m
|
||||
CONFIG_INFINIBAND_USER_MAD=m
|
||||
CONFIG_INFINIBAND_USER_ACCESS=m
|
||||
CONFIG_INFINIBAND_IPATH=m
|
||||
@ -362,6 +363,7 @@ CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
# CONFIG_BLK_DEV_NVME is not set
|
||||
CONFIG_BLK_DEV_OSD=m
|
||||
CONFIG_BLK_DEV_RAM=m
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
@ -783,12 +785,14 @@ CONFIG_TCP_MD5SIG=y
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_UNIX_DIAG=m
|
||||
CONFIG_NET_KEY=m
|
||||
CONFIG_NET_KEY_MIGRATE=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_INET_LRO=y
|
||||
CONFIG_INET_TUNNEL=m
|
||||
CONFIG_INET_DIAG=m
|
||||
CONFIG_INET_UDP_DIAG=m
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_FIB_TRIE_STATS=y
|
||||
@ -837,6 +841,13 @@ CONFIG_IP_VS_DH=m
|
||||
CONFIG_IP_VS_SH=m
|
||||
CONFIG_IP_VS_SED=m
|
||||
CONFIG_IP_VS_NQ=m
|
||||
|
||||
#
|
||||
# IPVS SH scheduler
|
||||
#
|
||||
#
|
||||
CONFIG_IP_VS_SH_TAB_BITS=8
|
||||
|
||||
CONFIG_IP_VS_FTP=m
|
||||
CONFIG_IP_VS_PE_SIP=m
|
||||
|
||||
@ -879,6 +890,7 @@ CONFIG_NETFILTER=y
|
||||
CONFIG_NETFILTER_ADVANCED=y
|
||||
CONFIG_NF_CONNTRACK=m
|
||||
CONFIG_NETFILTER_NETLINK=m
|
||||
CONFIG_NETFILTER_NETLINK_ACCT=m
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE=m
|
||||
CONFIG_NETFILTER_NETLINK_LOG=m
|
||||
CONFIG_NETFILTER_TPROXY=m
|
||||
@ -919,6 +931,7 @@ CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_DCCP=m
|
||||
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
|
||||
CONFIG_NETFILTER_XT_MATCH_DSCP=m
|
||||
CONFIG_NETFILTER_XT_MATCH_ECN=m
|
||||
CONFIG_NETFILTER_XT_MATCH_ESP=m
|
||||
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_HELPER=m
|
||||
@ -930,6 +943,7 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MAC=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MARK=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_OSF=m
|
||||
CONFIG_NETFILTER_XT_MATCH_OWNER=m
|
||||
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
|
||||
@ -959,6 +973,7 @@ CONFIG_NF_CONNTRACK_MARK=y
|
||||
CONFIG_NF_CONNTRACK_SECMARK=y
|
||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||
CONFIG_NF_CONNTRACK_ZONES=y
|
||||
CONFIG_NF_CONNTRACK_PROCFS=y
|
||||
# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
|
||||
CONFIG_NF_CONNTRACK_AMANDA=m
|
||||
CONFIG_NF_CONNTRACK_FTP=m
|
||||
@ -982,6 +997,7 @@ CONFIG_NF_CT_PROTO_UDPLITE=m
|
||||
|
||||
CONFIG_IP_NF_MATCH_AH=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_TARGET_CLUSTERIP=m
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
@ -1014,6 +1030,7 @@ CONFIG_IP6_NF_MATCH_FRAG=m
|
||||
CONFIG_IP6_NF_MATCH_HL=m
|
||||
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
|
||||
CONFIG_IP6_NF_MATCH_MH=m
|
||||
CONFIG_IP6_NF_MATCH_RPFILTER=m
|
||||
CONFIG_IP6_NF_MATCH_OPTS=m
|
||||
CONFIG_IP6_NF_MATCH_RT=m
|
||||
CONFIG_IP6_NF_QUEUE=m
|
||||
@ -1175,6 +1192,8 @@ CONFIG_NET_ACT_SIMP=m
|
||||
CONFIG_NET_ACT_SKBEDIT=m
|
||||
|
||||
CONFIG_DCB=y
|
||||
CONFIG_OPENVSWITCH=m
|
||||
CONFIG_NETPRIO_CGROUP=m
|
||||
|
||||
#
|
||||
# Network testing
|
||||
@ -1191,6 +1210,9 @@ CONFIG_NETDEVICES=y
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
CONFIG_IFB=m
|
||||
CONFIG_NET_TEAM=m
|
||||
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
|
||||
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_MACVLAN=m
|
||||
@ -1280,6 +1302,7 @@ CONFIG_ATL1E=m
|
||||
|
||||
CONFIG_NET_VENDOR_BROCADE=y
|
||||
CONFIG_BNA=m
|
||||
CONFIG_NET_CALXEDA_XGMAC=m
|
||||
|
||||
CONFIG_NET_VENDOR_CHELSIO=y
|
||||
CONFIG_CHELSIO_T1=m
|
||||
@ -1417,6 +1440,8 @@ CONFIG_SMSC9420=m
|
||||
|
||||
CONFIG_NET_VENDOR_STMICRO=y
|
||||
CONFIG_STMMAC_ETH=m
|
||||
# CONFIG_STMMAC_PLATFORM is not set
|
||||
# CONFIG_STMMAC_PCI is not set
|
||||
# CONFIG_STMMAC_DA is not set
|
||||
# CONFIG_STMMAC_DUAL_MAC is not set
|
||||
# CONFIG_STMMAC_TIMER is not set
|
||||
@ -1566,6 +1591,7 @@ CONFIG_ATH9K_AHB=y
|
||||
# CONFIG_ATH9K_DEBUG is not set
|
||||
CONFIG_ATH9K_DEBUGFS=y
|
||||
CONFIG_ATH9K_HTC=m
|
||||
CONFIG_ATH9K_BTCOEX_SUPPORT=y
|
||||
# CONFIG_ATH9K_HTC_DEBUGFS is not set
|
||||
CONFIG_ATH9K_RATE_CONTROL=y
|
||||
CONFIG_CARL9170=m
|
||||
@ -1579,6 +1605,7 @@ CONFIG_B43=m
|
||||
CONFIG_B43_PCMCIA=y
|
||||
CONFIG_B43_SDIO=y
|
||||
CONFIG_B43_BCMA=y
|
||||
# CONFIG_B43_BCMA_EXTRA is not set
|
||||
CONFIG_B43_BCMA_PIO=y
|
||||
# CONFIG_B43_DEBUG is not set
|
||||
CONFIG_B43_PHY_LP=y
|
||||
@ -1594,6 +1621,7 @@ CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
|
||||
# CONFIG_B43LEGACY_PIO_MODE is not set
|
||||
CONFIG_BRCMSMAC=m
|
||||
CONFIG_BRCMFMAC=m
|
||||
CONFIG_BRCMFMAC_SDIO=y
|
||||
# CONFIG_BRCMDBG is not set
|
||||
CONFIG_HERMES=m
|
||||
CONFIG_HERMES_CACHE_FW_ON_INIT=y
|
||||
@ -1627,11 +1655,10 @@ CONFIG_IWLWIFI=m
|
||||
CONFIG_IWLWIFI_DEBUG=y
|
||||
CONFIG_IWLWIFI_DEBUGFS=y
|
||||
CONFIG_IWLWIFI_DEVICE_SVTOOL=y
|
||||
# CONFIG_IWL_P2P is not set
|
||||
CONFIG_IWLAGN=m
|
||||
CONFIG_IWLWIFI_LEGACY=m
|
||||
CONFIG_IWLWIFI_LEGACY_DEBUG=y
|
||||
CONFIG_IWLWIFI_LEGACY_DEBUGFS=y
|
||||
# CONFIG_IWLWIFI_P2P is not set
|
||||
CONFIG_IWLEGACY=m
|
||||
CONFIG_IWLEGACY_DEBUG=y
|
||||
CONFIG_IWLEGACY_DEBUGFS=y
|
||||
# CONFIG_IWLWIFI_LEGACY_DEVICE_TRACING is not set
|
||||
CONFIG_IWL4965=y
|
||||
CONFIG_IWL3945=m
|
||||
@ -2015,8 +2042,10 @@ CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_KEYBOARD_QT1070 is not set
|
||||
# CONFIG_KEYBOARD_MCS is not set
|
||||
# CONFIG_KEYBOARD_OPENCORES is not set
|
||||
# CONFIG_KEYBOARD_SAMSUNG is not set
|
||||
# CONFIG_KEYBOARD_QT2160 is not set
|
||||
# CONFIG_KEYBOARD_TCA6416 is not set
|
||||
# CONFIG_KEYBOARD_TCA8418 is not set
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
|
||||
@ -2065,6 +2094,7 @@ CONFIG_TOUCHSCREEN_AD7879_I2C=m
|
||||
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
|
||||
CONFIG_TOUCHSCREEN_DYNAPRO=m
|
||||
CONFIG_TOUCHSCREEN_EETI=m
|
||||
CONFIG_TOUCHSCREEN_EGALAX=m
|
||||
CONFIG_TOUCHSCREEN_ELO=m
|
||||
CONFIG_TOUCHSCREEN_FUJITSU=m
|
||||
CONFIG_TOUCHSCREEN_GUNZE=m
|
||||
@ -2081,6 +2111,7 @@ CONFIG_TOUCHSCREEN_TSC2007=m
|
||||
CONFIG_TOUCHSCREEN_TOUCHIT213=m
|
||||
CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
|
||||
CONFIG_TOUCHSCREEN_TOUCHWIN=m
|
||||
CONFIG_TOUCHSCREEN_PIXCIR=m
|
||||
CONFIG_TOUCHSCREEN_UCB1400=m
|
||||
CONFIG_TOUCHSCREEN_WACOM_W8001=m
|
||||
CONFIG_TOUCHSCREEN_USB_E2I=y
|
||||
@ -2568,6 +2599,7 @@ CONFIG_VIDEO_V4L2_SUBDEV_API=y
|
||||
#
|
||||
CONFIG_V4L_USB_DRIVERS=y
|
||||
CONFIG_VIDEO_CAPTURE_DRIVERS=y
|
||||
CONFIG_V4L_PCI_DRIVERS=y
|
||||
CONFIG_VIDEO_AU0828=m
|
||||
CONFIG_VIDEO_BT848=m
|
||||
CONFIG_VIDEO_BT848_DVB=y
|
||||
@ -2618,6 +2650,8 @@ CONFIG_VIDEO_ZORAN_DC30=m
|
||||
CONFIG_VIDEO_ZORAN_LML33=m
|
||||
CONFIG_VIDEO_ZORAN_LML33R10=m
|
||||
CONFIG_VIDEO_ZORAN_ZR36060=m
|
||||
# CONFIG_V4L_ISA_PARPORT_DRIVERS is not set
|
||||
# CONFIG_V4L_PLATFORM_DRIVERS is not set
|
||||
CONFIG_VIDEO_FB_IVTV=m
|
||||
CONFIG_VIDEO_SAA7164=m
|
||||
CONFIG_VIDEO_TM6000=m
|
||||
@ -2645,6 +2679,7 @@ CONFIG_MEDIA_TUNER_TEA5761=m
|
||||
CONFIG_MEDIA_TUNER_TEA5767=m
|
||||
CONFIG_MEDIA_TUNER_MT20XX=m
|
||||
CONFIG_MEDIA_TUNER_MT2060=m
|
||||
CONFIG_MEDIA_TUNER_MT2063=m
|
||||
CONFIG_MEDIA_TUNER_MT2266=m
|
||||
CONFIG_MEDIA_TUNER_MT2131=m
|
||||
CONFIG_MEDIA_TUNER_QT1010=m
|
||||
@ -2768,6 +2803,7 @@ CONFIG_DVB_DDBRIDGE=m
|
||||
CONFIG_DVB_MB86A20S=m
|
||||
CONFIG_DVB_USB_TECHNISAT_USB2=m
|
||||
CONFIG_DVB_DIB9000=m
|
||||
CONFIG_DVB_HD29L2=m
|
||||
CONFIG_DVB_STV0367=m
|
||||
|
||||
#
|
||||
@ -2843,6 +2879,7 @@ CONFIG_IR_RC6_DECODER=m
|
||||
CONFIG_IR_JVC_DECODER=m
|
||||
CONFIG_IR_SONY_DECODER=m
|
||||
CONFIG_IR_RC5_SZ_DECODER=m
|
||||
CONFIG_IR_SANYO_DECODER=m
|
||||
CONFIG_IR_MCE_KBD_DECODER=m
|
||||
CONFIG_IR_LIRC_CODEC=m
|
||||
CONFIG_IR_IMON=m
|
||||
@ -3152,6 +3189,7 @@ CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||
# CONFIG_USB_EHCI_MV is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
# CONFIG_USB_OHCI_HCD_SSB is not set
|
||||
CONFIG_USB_UHCI_HCD=y
|
||||
@ -3236,6 +3274,7 @@ CONFIG_HID_PANTHERLORD=m
|
||||
CONFIG_HID_PETALYNX=m
|
||||
CONFIG_HID_PICOLCD=m
|
||||
CONFIG_HID_ROCCAT=m
|
||||
CONFIG_HID_ROCCAT_ISKU=m
|
||||
CONFIG_HID_ROCCAT_KONE=m
|
||||
CONFIG_HID_SAMSUNG=m
|
||||
CONFIG_HID_SONY=m
|
||||
@ -3262,6 +3301,7 @@ CONFIG_HID_HOLTEK=m
|
||||
CONFIG_HOLTEK_FF=y
|
||||
CONFIG_HID_SPEEDLINK=m
|
||||
CONFIG_HID_WIIMOTE=m
|
||||
CONFIG_HID_WIIMOTE_EXT=y
|
||||
|
||||
#
|
||||
# USB Imaging devices
|
||||
@ -3313,6 +3353,7 @@ CONFIG_USB_GSPCA_PAC7302=m
|
||||
CONFIG_USB_GSPCA_STV0680=m
|
||||
CONFIG_USB_GL860=m
|
||||
CONFIG_USB_GSPCA_JEILINJ=m
|
||||
CONFIG_USB_GSPCA_JL2005BCD=m
|
||||
CONFIG_USB_GSPCA_KONICA=m
|
||||
CONFIG_USB_GSPCA_XIRLINK_CIT=m
|
||||
CONFIG_USB_GSPCA_SPCA1528=m
|
||||
@ -3703,6 +3744,7 @@ CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NFSD_V4=y
|
||||
# CONFIG_NFSD_FAULT_INJECTION is not set
|
||||
CONFIG_NFS_FSCACHE=y
|
||||
# CONFIG_NFS_USE_LEGACY_DNS is not set
|
||||
# CONFIG_NFS_USE_NEW_IDMAPPER is not set
|
||||
@ -3749,6 +3791,7 @@ CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
|
||||
|
||||
CONFIG_BTRFS_FS=m
|
||||
CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||
# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set
|
||||
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
|
||||
@ -3923,6 +3966,7 @@ CONFIG_SECURITY_SELINUX_AVC_STATS=y
|
||||
# CONFIG_SECURITY_APPARMOR is not set
|
||||
CONFIG_AUDIT=y
|
||||
CONFIG_AUDITSYSCALL=y
|
||||
# CONFIG_AUDIT_LOGINUID_IMMUTABLE is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
@ -4061,6 +4105,7 @@ CONFIG_CGROUP_SCHED=y
|
||||
CONFIG_CGROUP_MEM_RES_CTLR=y
|
||||
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y # XXX disabled by default, pass 'swapaccount'
|
||||
# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
|
||||
CONFIG_CGROUP_MEM_RES_CTLR_KMEM=y
|
||||
CONFIG_CGROUP_PERF=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
|
||||
@ -4232,6 +4277,8 @@ CONFIG_LEDS_CLASS=y
|
||||
# CONFIG_LEDS_BD2802 is not set
|
||||
# CONFIG_LEDS_S3C24XX is not set
|
||||
CONFIG_LEDS_DELL_NETBOOKS=m
|
||||
# CONFIG_LEDS_TCA6507 is not set
|
||||
# CONFIG_LEDS_OT200 is not set
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=m
|
||||
CONFIG_LEDS_TRIGGER_IDE_DISK=y
|
||||
@ -4305,6 +4352,7 @@ CONFIG_APM_POWER=m
|
||||
|
||||
# CONFIG_BATTERY_DS2760 is not set
|
||||
# CONFIG_BATTERY_DS2782 is not set
|
||||
# CONFIG_BATTERY_SBS is not set
|
||||
# CONFIG_BATTERY_BQ20Z75 is not set
|
||||
# CONFIG_BATTERY_DS2780 is not set
|
||||
# CONFIG_BATTERY_BQ27x00 is not set
|
||||
@ -4313,6 +4361,7 @@ CONFIG_APM_POWER=m
|
||||
|
||||
# CONFIG_CHARGER_ISP1704 is not set
|
||||
# CONFIG_CHARGER_MAX8903 is not set
|
||||
# CONFIG_CHARGER_LP8727 is not set
|
||||
# CONFIG_CHARGER_GPIO is not set
|
||||
# CONFIG_CHARGER_PCF50633 is not set
|
||||
|
||||
@ -4415,6 +4464,8 @@ CONFIG_UWB_WHCI=m
|
||||
CONFIG_UWB_I1480U=m
|
||||
|
||||
CONFIG_STAGING=y
|
||||
# CONFIG_RTLLIB is not set
|
||||
# CONFIG_ANDROID is not set
|
||||
CONFIG_STAGING_MEDIA=y
|
||||
# CONFIG_DVB_AS102 is not set
|
||||
# CONFIG_ET131X is not set
|
||||
|
@ -353,3 +353,10 @@ CONFIG_RFKILL_GPIO=m
|
||||
|
||||
# Disable btrfs until it is shown to work with 64k pages (rhbz 747079)
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
# CONFIG_OF_SELFTEST is not set
|
||||
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
|
||||
# CONFIG_INPUT_GP2A is not set
|
||||
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
|
||||
# CONFIG_CPU_IDLE is not set
|
||||
CONFIG_STRICT_DEVMEM=y
|
||||
# CONFIG_V4L_RADIO_ISA_DRIVERS is not set
|
||||
|
@ -159,3 +159,7 @@ CONFIG_IO_EVENT_IRQ=y
|
||||
CONFIG_HW_RANDOM_AMD=m
|
||||
|
||||
CONFIG_BPF_JIT=y
|
||||
|
||||
# CONFIG_PPC_ICSWX_PID is not set
|
||||
# CONFIG_PPC_ICSWX_USE_SIGILL is not set
|
||||
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
|
||||
|
@ -195,3 +195,4 @@ CONFIG_CRYPTO_DEV_NIAGARA2=y
|
||||
# CONFIG_MTD_OF_PARTS is not set
|
||||
# CONFIG_MTD_PHYSMAP_OF is not set
|
||||
# CONFIG_MMC_SDHCI_OF is not set
|
||||
# CONFIG_OF_SELFTEST is not set
|
||||
|
@ -203,3 +203,7 @@ CONFIG_I2O_BUS=m
|
||||
# CONFIG_EDAC_SBRIDGE is not set
|
||||
|
||||
# CONFIG_X86_WANT_INTEL_MID is not set
|
||||
# CONFIG_OF_SELFTEST is not set
|
||||
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
|
||||
# CONFIG_INPUT_GP2A is not set
|
||||
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
|
||||
|
@ -29,6 +29,7 @@ CONFIG_X86_PAT=y
|
||||
CONFIG_X86_PM_TIMER=y
|
||||
|
||||
CONFIG_EFI=y
|
||||
CONFIG_EFI_STUB=y
|
||||
CONFIG_EFI_VARS=y
|
||||
CONFIG_EFI_PCDP=y
|
||||
CONFIG_FB_EFI=y
|
||||
@ -108,6 +109,7 @@ CONFIG_PM_STD_PARTITION=""
|
||||
|
||||
CONFIG_PCI_MMCONFIG=y
|
||||
CONFIG_PCI_BIOS=y
|
||||
CONFIG_PCI_IOAPIC=y
|
||||
|
||||
CONFIG_HOTPLUG_PCI=y
|
||||
CONFIG_HOTPLUG_PCI_COMPAQ=m
|
||||
@ -192,6 +194,9 @@ CONFIG_PANASONIC_LAPTOP=m
|
||||
CONFIG_SAMSUNG_LAPTOP=m
|
||||
CONFIG_SONY_LAPTOP=m
|
||||
CONFIG_TOPSTAR_LAPTOP=m
|
||||
CONFIG_FUJITSU_TABLET=m
|
||||
CONFIG_AMILO_RFKILL=m
|
||||
|
||||
|
||||
CONFIG_ACPI_WMI=m
|
||||
CONFIG_ACER_WMI=m
|
||||
@ -211,6 +216,7 @@ CONFIG_XO15_EBOOK=m
|
||||
|
||||
# CONFIG_SMSC37B787_WDT is not set
|
||||
CONFIG_W83697HF_WDT=m
|
||||
CONFIG_VIA_WDT=m
|
||||
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_PROC_VMCORE=y
|
||||
@ -360,7 +366,7 @@ CONFIG_INTEL_IPS=m
|
||||
# CONFIG_IBM_RTL is not set
|
||||
|
||||
CONFIG_VIDEO_VIA_CAMERA=m
|
||||
|
||||
# CONFIG_V4L_RADIO_ISA_DRIVERS is not set
|
||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_X86_RESERVE_LOW=64
|
||||
|
||||
@ -370,6 +376,7 @@ CONFIG_PCH_PHUB=m
|
||||
CONFIG_TRANSPARENT_HUGEPAGE=y
|
||||
|
||||
CONFIG_CRYPTO_AES_NI_INTEL=y
|
||||
CONFIG_CRYPTO_SERPENT_SSE2_586=m
|
||||
|
||||
CONFIG_HP_ACCEL=m
|
||||
|
||||
@ -384,3 +391,12 @@ CONFIG_RELOCATABLE=y
|
||||
|
||||
# CONFIG_HYPERV is not set
|
||||
|
||||
# Depends on HOTPLUG_PCI_PCIE
|
||||
CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
|
||||
|
||||
CONFIG_DRM_GMA500=m
|
||||
# CONFIG_DRM_GMA600 is not set
|
||||
# CONFIG_DRM_GMA3600 is not set
|
||||
|
||||
# Maybe enable in debug kernels?
|
||||
# CONFIG_DEBUG_NMI_SELFTEST is not set
|
||||
|
@ -11,6 +11,8 @@ CONFIG_K8_NUMA=y
|
||||
CONFIG_AMD_NUMA=y
|
||||
CONFIG_X86_64_ACPI_NUMA=y
|
||||
# CONFIG_NUMA_EMU is not set
|
||||
# CONFIG_X86_NUMACHIP is not set
|
||||
|
||||
|
||||
CONFIG_NR_CPUS=256
|
||||
CONFIG_PHYSICAL_START=0x1000000
|
||||
@ -20,6 +22,7 @@ CONFIG_IA32_EMULATION=y
|
||||
|
||||
CONFIG_AMD_IOMMU=y
|
||||
CONFIG_AMD_IOMMU_STATS=y
|
||||
CONFIG_AMD_IOMMU_V2=m
|
||||
# CONFIG_IOMMU_DEBUG is not set
|
||||
CONFIG_SWIOTLB=y
|
||||
# CONFIG_CALGARY_IOMMU is not set
|
||||
@ -40,6 +43,7 @@ CONFIG_PNP=y
|
||||
CONFIG_BLK_DEV_AMD74XX=y
|
||||
|
||||
CONFIG_CRYPTO_AES_X86_64=y
|
||||
CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m
|
||||
CONFIG_CRYPTO_TWOFISH_X86_64=m
|
||||
CONFIG_CRYPTO_SALSA20_X86_64=m
|
||||
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
|
||||
|
@ -1,95 +0,0 @@
|
||||
From 09357b00255c233705b1cf6d76a8d147340545b8 Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||
Date: Fri, 18 Nov 2011 14:25:00 +0000
|
||||
Subject: [PATCH] e1000e: Avoid wrong check on TX hang
|
||||
|
||||
Based on the original patch submitted my Michael Wang
|
||||
<wangyun@linux.vnet.ibm.com>.
|
||||
Descriptors may not be write-back while checking TX hang with flag
|
||||
FLAG2_DMA_BURST on.
|
||||
So when we detect hang, we just flush the descriptor and detect
|
||||
again for once.
|
||||
|
||||
-v2 change 1 to true and 0 to false and remove extra ()
|
||||
|
||||
CC: Michael Wang <wangyun@linux.vnet.ibm.com>
|
||||
CC: Flavio Leitner <fbl@redhat.com>
|
||||
Acked-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
||||
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
|
||||
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||
---
|
||||
drivers/net/ethernet/intel/e1000e/e1000.h | 1 +
|
||||
drivers/net/ethernet/intel/e1000e/netdev.c | 23 ++++++++++++++++++++---
|
||||
2 files changed, 21 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h
|
||||
index 9fe18d1..f478a22 100644
|
||||
--- a/drivers/net/ethernet/intel/e1000e/e1000.h
|
||||
+++ b/drivers/net/ethernet/intel/e1000e/e1000.h
|
||||
@@ -309,6 +309,7 @@ struct e1000_adapter {
|
||||
u32 txd_cmd;
|
||||
|
||||
bool detect_tx_hung;
|
||||
+ bool tx_hang_recheck;
|
||||
u8 tx_timeout_factor;
|
||||
|
||||
u32 tx_int_delay;
|
||||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
|
||||
index c6e9763..c12df69 100644
|
||||
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
|
||||
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
|
||||
@@ -1014,6 +1014,7 @@ static void e1000_print_hw_hang(struct work_struct *work)
|
||||
struct e1000_adapter *adapter = container_of(work,
|
||||
struct e1000_adapter,
|
||||
print_hang_task);
|
||||
+ struct net_device *netdev = adapter->netdev;
|
||||
struct e1000_ring *tx_ring = adapter->tx_ring;
|
||||
unsigned int i = tx_ring->next_to_clean;
|
||||
unsigned int eop = tx_ring->buffer_info[i].next_to_watch;
|
||||
@@ -1025,6 +1026,21 @@ static void e1000_print_hw_hang(struct work_struct *work)
|
||||
if (test_bit(__E1000_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
+ if (!adapter->tx_hang_recheck &&
|
||||
+ (adapter->flags2 & FLAG2_DMA_BURST)) {
|
||||
+ /* May be block on write-back, flush and detect again
|
||||
+ * flush pending descriptor writebacks to memory
|
||||
+ */
|
||||
+ ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||
+ /* execute the writes immediately */
|
||||
+ e1e_flush();
|
||||
+ adapter->tx_hang_recheck = true;
|
||||
+ return;
|
||||
+ }
|
||||
+ /* Real hang detected */
|
||||
+ adapter->tx_hang_recheck = false;
|
||||
+ netif_stop_queue(netdev);
|
||||
+
|
||||
e1e_rphy(hw, PHY_STATUS, &phy_status);
|
||||
e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
|
||||
e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
|
||||
@@ -1145,10 +1161,10 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
|
||||
if (tx_ring->buffer_info[i].time_stamp &&
|
||||
time_after(jiffies, tx_ring->buffer_info[i].time_stamp
|
||||
+ (adapter->tx_timeout_factor * HZ)) &&
|
||||
- !(er32(STATUS) & E1000_STATUS_TXOFF)) {
|
||||
+ !(er32(STATUS) & E1000_STATUS_TXOFF))
|
||||
schedule_work(&adapter->print_hang_task);
|
||||
- netif_stop_queue(netdev);
|
||||
- }
|
||||
+ else
|
||||
+ adapter->tx_hang_recheck = false;
|
||||
}
|
||||
adapter->total_tx_bytes += total_tx_bytes;
|
||||
adapter->total_tx_packets += total_tx_packets;
|
||||
@@ -3838,6 +3854,7 @@ static int e1000_open(struct net_device *netdev)
|
||||
|
||||
e1000_irq_enable(adapter);
|
||||
|
||||
+ adapter->tx_hang_recheck = false;
|
||||
netif_start_queue(netdev);
|
||||
|
||||
adapter->idle_check = true;
|
||||
--
|
||||
1.7.9
|
||||
|
@ -1,19 +0,0 @@
|
||||
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
|
||||
index 00beb4f..8fb6844 100644
|
||||
--- a/fs/ext4/ialloc.c
|
||||
+++ b/fs/ext4/ialloc.c
|
||||
@@ -885,8 +885,12 @@ got:
|
||||
if (IS_DIRSYNC(inode))
|
||||
ext4_handle_sync(handle);
|
||||
if (insert_inode_locked(inode) < 0) {
|
||||
- err = -EINVAL;
|
||||
- goto fail_drop;
|
||||
+ /*
|
||||
+ * Likely a bitmap corruption causing inode to be allocated
|
||||
+ * twice.
|
||||
+ */
|
||||
+ err = -EIO;
|
||||
+ goto fail;
|
||||
}
|
||||
spin_lock(&sbi->s_next_gen_lock);
|
||||
inode->i_generation = sbi->s_next_generation++;
|
@ -1,4 +1,6 @@
|
||||
From: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
commit b94887bbc0621e1e8402e7f0ec4bc3adf46c9a6e
|
||||
Author: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Date: Fri Feb 17 12:42:08 2012 -0500
|
||||
|
||||
Freeze all filesystems during system suspend and (kernel-driven)
|
||||
hibernation by calling freeze_supers() for all superblocks and thaw
|
||||
@ -20,40 +22,14 @@ accessing device special files it needs to do its job.
|
||||
This change is based on earlier work by Nigel Cunningham.
|
||||
|
||||
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
---
|
||||
fs/super.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/fs.h | 3 +
|
||||
kernel/power/hibernate.c | 11 +++++--
|
||||
kernel/power/power.h | 23 --------------
|
||||
kernel/power/suspend.c | 42 +++++++++++++++++++++++++++
|
||||
5 files changed, 128 insertions(+), 24 deletions(-)
|
||||
|
||||
Index: linux/include/linux/fs.h
|
||||
===================================================================
|
||||
--- linux.orig/include/linux/fs.h
|
||||
+++ linux/include/linux/fs.h
|
||||
@@ -210,6 +210,7 @@ struct inodes_stat_t {
|
||||
#define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */
|
||||
#define MS_I_VERSION (1<<23) /* Update inode I_version field */
|
||||
#define MS_STRICTATIME (1<<24) /* Always perform atime updates */
|
||||
+#define MS_FROZEN (1<<25) /* Frozen filesystem */
|
||||
#define MS_NOSEC (1<<28)
|
||||
#define MS_BORN (1<<29)
|
||||
#define MS_ACTIVE (1<<30)
|
||||
@@ -2501,6 +2502,8 @@ extern void drop_super(struct super_bloc
|
||||
extern void iterate_supers(void (*)(struct super_block *, void *), void *);
|
||||
extern void iterate_supers_type(struct file_system_type *,
|
||||
void (*)(struct super_block *, void *), void *);
|
||||
+extern int freeze_supers(void);
|
||||
+extern void thaw_supers(void);
|
||||
Rebased to 3.3-rc3 by Josh Boyer <jwboyer@redhat.com>
|
||||
|
||||
extern int dcache_dir_open(struct inode *, struct file *);
|
||||
extern int dcache_dir_close(struct inode *, struct file *);
|
||||
Index: linux/fs/super.c
|
||||
===================================================================
|
||||
--- linux.orig/fs/super.c
|
||||
+++ linux/fs/super.c
|
||||
@@ -594,6 +594,79 @@ void iterate_supers_type(struct file_sys
|
||||
diff --git a/fs/super.c b/fs/super.c
|
||||
index 6015c02..c8057fa 100644
|
||||
--- a/fs/super.c
|
||||
+++ b/fs/super.c
|
||||
@@ -594,6 +594,79 @@ void iterate_supers_type(struct file_system_type *type,
|
||||
EXPORT_SYMBOL(iterate_supers_type);
|
||||
|
||||
/**
|
||||
@ -65,7 +41,7 @@ Index: linux/fs/super.c
|
||||
+
|
||||
+ spin_lock(&sb_lock);
|
||||
+ list_for_each_entry(sb, &super_blocks, s_list) {
|
||||
+ if (list_empty(&sb->s_instances))
|
||||
+ if (hlist_unhashed(&sb->s_instances))
|
||||
+ continue;
|
||||
+ sb->s_count++;
|
||||
+ spin_unlock(&sb_lock);
|
||||
@ -99,7 +75,7 @@ Index: linux/fs/super.c
|
||||
+ * frozen in the right order (eg. loopback on ext3).
|
||||
+ */
|
||||
+ list_for_each_entry_reverse(sb, &super_blocks, s_list) {
|
||||
+ if (list_empty(&sb->s_instances))
|
||||
+ if (hlist_unhashed(&sb->s_instances))
|
||||
+ continue;
|
||||
+ sb->s_count++;
|
||||
+ spin_unlock(&sb_lock);
|
||||
@ -133,98 +109,31 @@ Index: linux/fs/super.c
|
||||
* get_super - get the superblock of a device
|
||||
* @bdev: device to get the superblock for
|
||||
*
|
||||
Index: linux/kernel/power/power.h
|
||||
===================================================================
|
||||
--- linux.orig/kernel/power/power.h
|
||||
+++ linux/kernel/power/power.h
|
||||
@@ -1,3 +1,4 @@
|
||||
+#include <linux/fs.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/suspend_ioctls.h>
|
||||
#include <linux/utsname.h>
|
||||
@@ -227,25 +228,3 @@ enum {
|
||||
#define TEST_MAX (__TEST_AFTER_LAST - 1)
|
||||
diff --git a/include/linux/fs.h b/include/linux/fs.h
|
||||
index 386da09..a164f4a 100644
|
||||
--- a/include/linux/fs.h
|
||||
+++ b/include/linux/fs.h
|
||||
@@ -210,6 +210,7 @@ struct inodes_stat_t {
|
||||
#define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */
|
||||
#define MS_I_VERSION (1<<23) /* Update inode I_version field */
|
||||
#define MS_STRICTATIME (1<<24) /* Always perform atime updates */
|
||||
+#define MS_FROZEN (1<<25) /* Frozen filesystem */
|
||||
#define MS_NOSEC (1<<28)
|
||||
#define MS_BORN (1<<29)
|
||||
#define MS_ACTIVE (1<<30)
|
||||
@@ -2501,6 +2502,8 @@ extern void drop_super(struct super_block *sb);
|
||||
extern void iterate_supers(void (*)(struct super_block *, void *), void *);
|
||||
extern void iterate_supers_type(struct file_system_type *,
|
||||
void (*)(struct super_block *, void *), void *);
|
||||
+extern int freeze_supers(void);
|
||||
+extern void thaw_supers(void);
|
||||
|
||||
extern int pm_test_level;
|
||||
-
|
||||
-#ifdef CONFIG_SUSPEND_FREEZER
|
||||
-static inline int suspend_freeze_processes(void)
|
||||
-{
|
||||
- int error = freeze_processes();
|
||||
- return error ? : freeze_kernel_threads();
|
||||
-}
|
||||
-
|
||||
-static inline void suspend_thaw_processes(void)
|
||||
-{
|
||||
- thaw_processes();
|
||||
-}
|
||||
-#else
|
||||
-static inline int suspend_freeze_processes(void)
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static inline void suspend_thaw_processes(void)
|
||||
-{
|
||||
-}
|
||||
-#endif
|
||||
Index: linux/kernel/power/suspend.c
|
||||
===================================================================
|
||||
--- linux.orig/kernel/power/suspend.c
|
||||
+++ linux/kernel/power/suspend.c
|
||||
@@ -29,6 +29,48 @@
|
||||
|
||||
#include "power.h"
|
||||
|
||||
+#ifdef CONFIG_SUSPEND_FREEZER
|
||||
+
|
||||
+static inline int suspend_freeze_processes(void)
|
||||
+{
|
||||
+ int error;
|
||||
+
|
||||
+ error = freeze_processes();
|
||||
+ if (error)
|
||||
+ return error;
|
||||
+
|
||||
+ error = freeze_supers();
|
||||
+ if (error) {
|
||||
+ thaw_processes();
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ error = freeze_kernel_threads();
|
||||
+ if (error)
|
||||
+ thaw_supers();
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static inline void suspend_thaw_processes(void)
|
||||
+{
|
||||
+ thaw_supers();
|
||||
+ thaw_processes();
|
||||
+}
|
||||
+
|
||||
+#else /* !CONFIG_SUSPEND_FREEZER */
|
||||
+
|
||||
+static inline int suspend_freeze_processes(void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void suspend_thaw_processes(void)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+#endif /* !CONFIG_SUSPEND_FREEZER */
|
||||
+
|
||||
const char *const pm_states[PM_SUSPEND_MAX] = {
|
||||
[PM_SUSPEND_STANDBY] = "standby",
|
||||
[PM_SUSPEND_MEM] = "mem",
|
||||
Index: linux/kernel/power/hibernate.c
|
||||
===================================================================
|
||||
--- linux.orig/kernel/power/hibernate.c
|
||||
+++ linux/kernel/power/hibernate.c
|
||||
extern int dcache_dir_open(struct inode *, struct file *);
|
||||
extern int dcache_dir_close(struct inode *, struct file *);
|
||||
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
|
||||
index 6d6d288..492fc62 100644
|
||||
--- a/kernel/power/hibernate.c
|
||||
+++ b/kernel/power/hibernate.c
|
||||
@@ -626,12 +626,17 @@ int hibernate(void)
|
||||
if (error)
|
||||
goto Finish;
|
||||
@ -254,4 +163,125 @@ Index: linux/kernel/power/hibernate.c
|
||||
Thaw:
|
||||
thaw_processes();
|
||||
Finish:
|
||||
diff --git a/kernel/power/power.h b/kernel/power/power.h
|
||||
index 21724ee..40d6f64 100644
|
||||
--- a/kernel/power/power.h
|
||||
+++ b/kernel/power/power.h
|
||||
@@ -1,3 +1,4 @@
|
||||
+#include <linux/fs.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/suspend_ioctls.h>
|
||||
#include <linux/utsname.h>
|
||||
@@ -227,45 +228,3 @@ enum {
|
||||
#define TEST_MAX (__TEST_AFTER_LAST - 1)
|
||||
|
||||
extern int pm_test_level;
|
||||
-
|
||||
-#ifdef CONFIG_SUSPEND_FREEZER
|
||||
-static inline int suspend_freeze_processes(void)
|
||||
-{
|
||||
- int error;
|
||||
-
|
||||
- error = freeze_processes();
|
||||
-
|
||||
- /*
|
||||
- * freeze_processes() automatically thaws every task if freezing
|
||||
- * fails. So we need not do anything extra upon error.
|
||||
- */
|
||||
- if (error)
|
||||
- goto Finish;
|
||||
-
|
||||
- error = freeze_kernel_threads();
|
||||
-
|
||||
- /*
|
||||
- * freeze_kernel_threads() thaws only kernel threads upon freezing
|
||||
- * failure. So we have to thaw the userspace tasks ourselves.
|
||||
- */
|
||||
- if (error)
|
||||
- thaw_processes();
|
||||
-
|
||||
- Finish:
|
||||
- return error;
|
||||
-}
|
||||
-
|
||||
-static inline void suspend_thaw_processes(void)
|
||||
-{
|
||||
- thaw_processes();
|
||||
-}
|
||||
-#else
|
||||
-static inline int suspend_freeze_processes(void)
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static inline void suspend_thaw_processes(void)
|
||||
-{
|
||||
-}
|
||||
-#endif
|
||||
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
|
||||
index 4fd51be..5f51fc7 100644
|
||||
--- a/kernel/power/suspend.c
|
||||
+++ b/kernel/power/suspend.c
|
||||
@@ -29,6 +29,62 @@
|
||||
|
||||
#include "power.h"
|
||||
|
||||
+#ifdef CONFIG_SUSPEND_FREEZER
|
||||
+
|
||||
+static inline int suspend_freeze_processes(void)
|
||||
+{
|
||||
+ int error;
|
||||
+
|
||||
+ error = freeze_processes();
|
||||
+
|
||||
+ /*
|
||||
+ * freeze_processes() automatically thaws every task if freezing
|
||||
+ * fails. So we need not do anything extra upon error.
|
||||
+ */
|
||||
+
|
||||
+ if (error)
|
||||
+ goto Finish;
|
||||
+
|
||||
+ error = freeze_supers();
|
||||
+ if (error) {
|
||||
+ thaw_processes();
|
||||
+ goto Finish;
|
||||
+ }
|
||||
+
|
||||
+ error = freeze_kernel_threads();
|
||||
+
|
||||
+ /*
|
||||
+ * freeze_kernel_threads() thaws only kernel threads upon freezing
|
||||
+ * failure. So we have to thaw the userspace tasks ourselves.
|
||||
+ */
|
||||
+ if (error) {
|
||||
+ thaw_supers();
|
||||
+ thaw_processes();
|
||||
+ }
|
||||
+
|
||||
+Finish:
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static inline void suspend_thaw_processes(void)
|
||||
+{
|
||||
+ thaw_supers();
|
||||
+ thaw_processes();
|
||||
+}
|
||||
+
|
||||
+#else /* !CONFIG_SUSPEND_FREEZER */
|
||||
+
|
||||
+static inline int suspend_freeze_processes(void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void suspend_thaw_processes(void)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+#endif /* !CONFIG_SUSPEND_FREEZER */
|
||||
+
|
||||
const char *const pm_states[PM_SUSPEND_MAX] = {
|
||||
[PM_SUSPEND_STANDBY] = "standby",
|
||||
[PM_SUSPEND_MEM] = "mem",
|
||||
|
@ -1,34 +0,0 @@
|
||||
hpsa: Add IRQF_SHARED back in for the non-MSI(X) interrupt handler
|
||||
|
||||
From: Stephen M. Cameron <scameron@beardog.cce.hp.com>
|
||||
|
||||
IRQF_SHARED is required for older controllers that don't support MSI(X)
|
||||
and which may end up sharing an interrupt. All the controllers hpsa
|
||||
normally supports have MSI(X) capability, but older controllers may be
|
||||
encountered via the hpsa_allow_any=1 module parameter.
|
||||
|
||||
Also remove deprecated IRQF_DISABLED.
|
||||
|
||||
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
|
||||
---
|
||||
drivers/scsi/hpsa.c | 4 ++--
|
||||
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
RHBZ 754907
|
||||
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
|
||||
index 865d452..594ce83 100644
|
||||
--- a/drivers/scsi/hpsa.c
|
||||
+++ b/drivers/scsi/hpsa.c
|
||||
@@ -4072,10 +4072,10 @@ static int hpsa_request_irq(struct ctlr_info *h,
|
||||
|
||||
if (h->msix_vector || h->msi_vector)
|
||||
rc = request_irq(h->intr[h->intr_mode], msixhandler,
|
||||
- IRQF_DISABLED, h->devname, h);
|
||||
+ 0, h->devname, h);
|
||||
else
|
||||
rc = request_irq(h->intr[h->intr_mode], intxhandler,
|
||||
- IRQF_DISABLED, h->devname, h);
|
||||
+ IRQF_SHARED, h->devname, h);
|
||||
if (rc) {
|
||||
dev_err(&h->pdev->dev, "unable to get irq %d for %s\n",
|
||||
h->intr[h->intr_mode], h->devname);
|
76
kernel.spec
76
kernel.spec
@ -54,19 +54,19 @@ Summary: The Linux kernel
|
||||
# For non-released -rc kernels, this will be appended after the rcX and
|
||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||
#
|
||||
%global baserelease 5
|
||||
%global baserelease 1
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
# on top of -- for example, 2.6.22-rc7-git1 starts with a 2.6.21 base,
|
||||
# which yields a base_sublevel of 21.
|
||||
%define base_sublevel 2
|
||||
%define base_sublevel 3
|
||||
|
||||
## If this is a released kernel ##
|
||||
%if 0%{?released_kernel}
|
||||
|
||||
# Do we have a -stable update to apply?
|
||||
%define stable_update 10
|
||||
%define stable_update 0
|
||||
# Is it a -stable RC?
|
||||
%define stable_rc 0
|
||||
# Set rpm version accordingly
|
||||
@ -725,7 +725,6 @@ Patch12016: disable-i8042-check-on-apple-mac.patch
|
||||
|
||||
Patch12303: dmar-disable-when-ricoh-multifunction.patch
|
||||
|
||||
Patch13002: revert-efi-rtclock.patch
|
||||
Patch13003: efi-dont-map-boot-services-on-32bit.patch
|
||||
|
||||
Patch14000: hibernate-freeze-filesystems.patch
|
||||
@ -738,39 +737,11 @@ Patch20000: utrace.patch
|
||||
Patch21000: arm-omap-dt-compat.patch
|
||||
Patch21001: arm-smsc-support-reading-mac-address-from-device-tree.patch
|
||||
|
||||
#rhbz 717735
|
||||
Patch21045: nfs-client-freezer.patch
|
||||
|
||||
#rhbz 590880
|
||||
Patch21050: alps.patch
|
||||
|
||||
Patch21070: ext4-Support-check-none-nocheck-mount-options.patch
|
||||
Patch21071: ext4-Fix-error-handling-on-inode-bitmap-corruption.patch
|
||||
|
||||
#rhbz 769766
|
||||
Patch21072: mac80211-fix-rx-key-NULL-ptr-deref-in-promiscuous-mode.patch
|
||||
|
||||
#rhbz 773392
|
||||
Patch21073: KVM-x86-extend-struct-x86_emulate_ops-with-get_cpuid.patch
|
||||
Patch21074: KVM-x86-fix-missing-checks-in-syscall-emulation.patch
|
||||
|
||||
#rhbz 728740
|
||||
Patch21076: rtl8192cu-Fix-WARNING-on-suspend-resume.patch
|
||||
|
||||
#rhbz752176
|
||||
Patch21080: sysfs-msi-irq-per-device.patch
|
||||
|
||||
#rhbz 782686
|
||||
Patch21082: procfs-parse-mount-options.patch
|
||||
Patch21083: procfs-add-hidepid-and-gid-mount-options.patch
|
||||
Patch21084: proc-fix-null-pointer-deref-in-proc_pid_permission.patch
|
||||
|
||||
#rhbz 771058
|
||||
Patch22100: msi-irq-sysfs-warning.patch
|
||||
|
||||
# rhbz 754907
|
||||
Patch21101: hpsa-add-irqf-shared.patch
|
||||
|
||||
Patch21226: pci-crs-blacklist.patch
|
||||
|
||||
#rhbz 772772
|
||||
@ -779,12 +750,8 @@ Patch21232: rt2x00_fix_MCU_request_failures.patch
|
||||
#rhbz 788260
|
||||
Patch21233: jbd2-clear-BH_Delay-and-BH_Unwritten-in-journal_unmap_buf.patch
|
||||
|
||||
#rhbz 785806
|
||||
Patch21234: e1000e-Avoid-wrong-check-on-TX-hang.patch
|
||||
|
||||
#rhbz 754518
|
||||
#Patch21235: scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
|
||||
Patch21235: scsi-fix-sd_revalidate_disk-oops.patch
|
||||
|
||||
#rhbz 727865 730007
|
||||
Patch21240: ACPICA-Fix-regression-in-FADT-revision-checks.patch
|
||||
@ -1302,7 +1269,7 @@ ApplyOptionalPatch linux-2.6-upstream-reverts.patch -R
|
||||
#
|
||||
# ARM
|
||||
#
|
||||
ApplyPatch arm-omap-dt-compat.patch
|
||||
# ApplyPatch arm-omap-dt-compat.patch
|
||||
ApplyPatch arm-smsc-support-reading-mac-address-from-device-tree.patch
|
||||
|
||||
ApplyPatch taint-vbox.patch
|
||||
@ -1418,7 +1385,6 @@ ApplyPatch disable-i8042-check-on-apple-mac.patch
|
||||
# rhbz#605888
|
||||
ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
||||
|
||||
ApplyPatch revert-efi-rtclock.patch
|
||||
ApplyPatch efi-dont-map-boot-services-on-32bit.patch
|
||||
|
||||
ApplyPatch hibernate-freeze-filesystems.patch
|
||||
@ -1428,51 +1394,18 @@ ApplyPatch lis3-improve-handling-of-null-rate.patch
|
||||
# utrace.
|
||||
ApplyPatch utrace.patch
|
||||
|
||||
#rhbz 752176
|
||||
ApplyPatch sysfs-msi-irq-per-device.patch
|
||||
|
||||
# rhbz 754907
|
||||
ApplyPatch hpsa-add-irqf-shared.patch
|
||||
|
||||
#ApplyPatch pci-crs-blacklist.patch
|
||||
|
||||
#rhbz 717735
|
||||
ApplyPatch nfs-client-freezer.patch
|
||||
|
||||
#rhbz 590880
|
||||
ApplyPatch alps.patch
|
||||
|
||||
#rhbz 771058
|
||||
ApplyPatch msi-irq-sysfs-warning.patch
|
||||
|
||||
ApplyPatch ext4-Support-check-none-nocheck-mount-options.patch
|
||||
|
||||
ApplyPatch ext4-Fix-error-handling-on-inode-bitmap-corruption.patch
|
||||
|
||||
#rhbz 773392
|
||||
ApplyPatch KVM-x86-extend-struct-x86_emulate_ops-with-get_cpuid.patch
|
||||
ApplyPatch KVM-x86-fix-missing-checks-in-syscall-emulation.patch
|
||||
|
||||
#rhbz 728740
|
||||
ApplyPatch rtl8192cu-Fix-WARNING-on-suspend-resume.patch
|
||||
|
||||
#rhbz 782686
|
||||
ApplyPatch procfs-parse-mount-options.patch
|
||||
ApplyPatch procfs-add-hidepid-and-gid-mount-options.patch
|
||||
ApplyPatch proc-fix-null-pointer-deref-in-proc_pid_permission.patch
|
||||
|
||||
#rhbz 772772
|
||||
ApplyPatch rt2x00_fix_MCU_request_failures.patch
|
||||
|
||||
#rhbz 788269
|
||||
ApplyPatch jbd2-clear-BH_Delay-and-BH_Unwritten-in-journal_unmap_buf.patch
|
||||
|
||||
#rhbz 785806
|
||||
ApplyPatch e1000e-Avoid-wrong-check-on-TX-hang.patch
|
||||
|
||||
#rhbz 754518
|
||||
#ApplyPatch scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
|
||||
ApplyPatch scsi-fix-sd_revalidate_disk-oops.patch
|
||||
|
||||
#rhbz 727865 730007
|
||||
ApplyPatch ACPICA-Fix-regression-in-FADT-revision-checks.patch
|
||||
@ -2222,6 +2155,7 @@ fi
|
||||
|
||||
%changelog
|
||||
* Mon Mar 19 2012 Josh Boyer <jwboyer@redhat.com>
|
||||
- Linux 3.3
|
||||
- Drop compat-wireless infrastructure in preparation for 3.3 rebase
|
||||
|
||||
* Fri Mar 16 2012 Justin M. Forbes <jforbes@redhat.com>
|
||||
|
@ -1,13 +1,13 @@
|
||||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
|
||||
index d8d7596..a1b7117 100644
|
||||
index eaef02a..2029819 100644
|
||||
--- a/drivers/acpi/video.c
|
||||
+++ b/drivers/acpi/video.c
|
||||
@@ -71,7 +71,7 @@ MODULE_AUTHOR("Bruno Ducrot");
|
||||
@@ -69,7 +69,7 @@ MODULE_AUTHOR("Bruno Ducrot");
|
||||
MODULE_DESCRIPTION("ACPI Video Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
-static int brightness_switch_enabled = 1;
|
||||
+static int brightness_switch_enabled = 0;
|
||||
-static bool brightness_switch_enabled = 1;
|
||||
+static bool brightness_switch_enabled = 0;
|
||||
module_param(brightness_switch_enabled, bool, 0644);
|
||||
|
||||
static int acpi_video_bus_add(struct acpi_device *device);
|
||||
/*
|
||||
|
@ -1,7 +1,7 @@
|
||||
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
|
||||
index 2209620..659c1bb 100644
|
||||
--- a/drivers/tty/serial/8250.c
|
||||
+++ b/drivers/tty/serial/8250.c
|
||||
--- a/drivers/tty/serial/8250/8250.c
|
||||
+++ b/drivers/tty/serial/8250/8250.c
|
||||
@@ -7,6 +7,9 @@
|
||||
*
|
||||
* Copyright (C) 2001 Russell King.
|
||||
|
@ -363,7 +363,7 @@ index fa2f04e..e3090fc 100644
|
||||
@@ -1251,12 +1251,20 @@ static inline unsigned long zap_pmd_range(struct mmu_gather *tlb,
|
||||
VM_BUG_ON(!rwsem_is_locked(&tlb->mm->mmap_sem));
|
||||
split_huge_page_pmd(vma->vm_mm, pmd);
|
||||
} else if (zap_huge_pmd(tlb, vma, pmd))
|
||||
} else if (zap_huge_pmd(tlb, vma, pmd, addr))
|
||||
- continue;
|
||||
+ goto next;
|
||||
/* fall through */
|
||||
|
@ -1,87 +0,0 @@
|
||||
commit 3ff0e97a1bc3059bfbcc1d864c5d4ff5f8d3c2b9
|
||||
Author: Neil Horman <nhorman@tuxdriver.com>
|
||||
Date: Tue Jan 3 10:17:21 2012 -0500
|
||||
|
||||
msi: fix imbalanced refcount of msi irq sysfs objects
|
||||
|
||||
This warning was recently reported to me:
|
||||
|
||||
------------[ cut here ]------------
|
||||
WARNING: at lib/kobject.c:595 kobject_put+0x50/0x60()
|
||||
Hardware name: VMware Virtual Platform
|
||||
kobject: '(null)' (ffff880027b0df40): is not initialized, yet kobject_put() is
|
||||
being called.
|
||||
Modules linked in: vmxnet3(+) vmw_balloon i2c_piix4 i2c_core shpchp raid10
|
||||
vmw_pvscsi
|
||||
Pid: 630, comm: modprobe Tainted: G W 3.1.6-1.fc16.x86_64 #1
|
||||
Call Trace:
|
||||
[<ffffffff8106b73f>] warn_slowpath_common+0x7f/0xc0
|
||||
[<ffffffff8106b836>] warn_slowpath_fmt+0x46/0x50
|
||||
[<ffffffff810da293>] ? free_desc+0x63/0x70
|
||||
[<ffffffff812a9aa0>] kobject_put+0x50/0x60
|
||||
[<ffffffff812e4c25>] free_msi_irqs+0xd5/0x120
|
||||
[<ffffffff812e524c>] pci_enable_msi_block+0x24c/0x2c0
|
||||
[<ffffffffa017c273>] vmxnet3_alloc_intr_resources+0x173/0x240 [vmxnet3]
|
||||
[<ffffffffa0182e94>] vmxnet3_probe_device+0x615/0x834 [vmxnet3]
|
||||
[<ffffffff812d141c>] local_pci_probe+0x5c/0xd0
|
||||
[<ffffffff812d2cb9>] pci_device_probe+0x109/0x130
|
||||
[<ffffffff8138ba2c>] driver_probe_device+0x9c/0x2b0
|
||||
[<ffffffff8138bceb>] __driver_attach+0xab/0xb0
|
||||
[<ffffffff8138bc40>] ? driver_probe_device+0x2b0/0x2b0
|
||||
[<ffffffff8138bc40>] ? driver_probe_device+0x2b0/0x2b0
|
||||
[<ffffffff8138a8ac>] bus_for_each_dev+0x5c/0x90
|
||||
[<ffffffff8138b63e>] driver_attach+0x1e/0x20
|
||||
[<ffffffff8138b240>] bus_add_driver+0x1b0/0x2a0
|
||||
[<ffffffffa0188000>] ? 0xffffffffa0187fff
|
||||
[<ffffffff8138c246>] driver_register+0x76/0x140
|
||||
[<ffffffff815ca414>] ? printk+0x51/0x53
|
||||
[<ffffffffa0188000>] ? 0xffffffffa0187fff
|
||||
[<ffffffff812d2996>] __pci_register_driver+0x56/0xd0
|
||||
[<ffffffffa018803a>] vmxnet3_init_module+0x3a/0x3c [vmxnet3]
|
||||
[<ffffffff81002042>] do_one_initcall+0x42/0x180
|
||||
[<ffffffff810aad71>] sys_init_module+0x91/0x200
|
||||
[<ffffffff815dccc2>] system_call_fastpath+0x16/0x1b
|
||||
---[ end trace 44593438a59a9558 ]---
|
||||
Using INTx interrupt, #Rx queues: 1.
|
||||
|
||||
It occurs when populate_msi_sysfs fails, which in turn causes free_msi_irqs to
|
||||
be called. Because populate_msi_sysfs fails, we never registered any of the
|
||||
msi irq sysfs objects, but free_msi_irqs still calls kobject_del and kobject_put
|
||||
on each of them, which gets flagged in the above stack trace.
|
||||
|
||||
The fix is pretty straightforward. We can key of the parent pointer in the
|
||||
kobject. It is only set if the kobject_init_and_add succededs in
|
||||
populate_msi_sysfs. If anything fails there, each kobject has its parent reset
|
||||
to NULL
|
||||
|
||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
||||
CC: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
CC: Bjorn Helgaas <bhelgaas@google.com>
|
||||
CC: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
CC: linux-pci@vger.kernel.org
|
||||
|
||||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
|
||||
index 337e16a..82de95e 100644
|
||||
--- a/drivers/pci/msi.c
|
||||
+++ b/drivers/pci/msi.c
|
||||
@@ -323,8 +323,18 @@ static void free_msi_irqs(struct pci_dev *dev)
|
||||
if (list_is_last(&entry->list, &dev->msi_list))
|
||||
iounmap(entry->mask_base);
|
||||
}
|
||||
- kobject_del(&entry->kobj);
|
||||
- kobject_put(&entry->kobj);
|
||||
+
|
||||
+ /*
|
||||
+ * Its possible that we get into this path
|
||||
+ * When populate_msi_sysfs fails, which means the entries
|
||||
+ * were not registered with sysfs. In that case don't
|
||||
+ * unregister them.
|
||||
+ */
|
||||
+ if (entry->kobj.parent) {
|
||||
+ kobject_del(&entry->kobj);
|
||||
+ kobject_put(&entry->kobj);
|
||||
+ }
|
||||
+
|
||||
list_del(&entry->list);
|
||||
kfree(entry);
|
||||
}
|
@ -1,197 +0,0 @@
|
||||
@@ -, +, @@
|
||||
fs/nfs/inode.c | 3 ++-
|
||||
fs/nfs/nfs3proc.c | 3 ++-
|
||||
fs/nfs/nfs4proc.c | 5 +++--
|
||||
fs/nfs/proc.c | 3 ++-
|
||||
include/linux/freezer.h | 28 ++++++++++++++++++++++++++++
|
||||
net/sunrpc/sched.c | 3 ++-
|
||||
6 files changed, 39 insertions(+), 6 deletions(-)
|
||||
--- a/fs/nfs/inode.c
|
||||
+++ a/fs/nfs/inode.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/nfs_xdr.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/compat.h>
|
||||
+#include <linux/freezer.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
@@ -77,7 +78,7 @@ int nfs_wait_bit_killable(void *word)
|
||||
{
|
||||
if (fatal_signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
- schedule();
|
||||
+ freezable_schedule();
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- a/fs/nfs/nfs3proc.c
|
||||
+++ a/fs/nfs/nfs3proc.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/nfs_page.h>
|
||||
#include <linux/lockd/bind.h>
|
||||
#include <linux/nfs_mount.h>
|
||||
+#include <linux/freezer.h>
|
||||
|
||||
#include "iostat.h"
|
||||
#include "internal.h"
|
||||
@@ -32,7 +33,7 @@ nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
|
||||
res = rpc_call_sync(clnt, msg, flags);
|
||||
if (res != -EJUKEBOX && res != -EKEYEXPIRED)
|
||||
break;
|
||||
- schedule_timeout_killable(NFS_JUKEBOX_RETRY_TIME);
|
||||
+ freezable_schedule_timeout_killable(NFS_JUKEBOX_RETRY_TIME);
|
||||
res = -ERESTARTSYS;
|
||||
} while (!fatal_signal_pending(current));
|
||||
return res;
|
||||
--- a/fs/nfs/nfs4proc.c
|
||||
+++ a/fs/nfs/nfs4proc.c
|
||||
@@ -53,6 +53,7 @@
|
||||
#include <linux/sunrpc/bc_xprt.h>
|
||||
#include <linux/xattr.h>
|
||||
#include <linux/utsname.h>
|
||||
+#include <linux/freezer.h>
|
||||
|
||||
#include "nfs4_fs.h"
|
||||
#include "delegation.h"
|
||||
@@ -241,7 +242,7 @@ static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
|
||||
*timeout = NFS4_POLL_RETRY_MIN;
|
||||
if (*timeout > NFS4_POLL_RETRY_MAX)
|
||||
*timeout = NFS4_POLL_RETRY_MAX;
|
||||
- schedule_timeout_killable(*timeout);
|
||||
+ freezable_schedule_timeout_killable(*timeout);
|
||||
if (fatal_signal_pending(current))
|
||||
res = -ERESTARTSYS;
|
||||
*timeout <<= 1;
|
||||
@@ -3950,7 +3951,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
|
||||
static unsigned long
|
||||
nfs4_set_lock_task_retry(unsigned long timeout)
|
||||
{
|
||||
- schedule_timeout_killable(timeout);
|
||||
+ freezable_schedule_timeout_killable(timeout);
|
||||
timeout <<= 1;
|
||||
if (timeout > NFS4_LOCK_MAXTIMEOUT)
|
||||
return NFS4_LOCK_MAXTIMEOUT;
|
||||
--- a/fs/nfs/proc.c
|
||||
+++ a/fs/nfs/proc.c
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <linux/nfs_fs.h>
|
||||
#include <linux/nfs_page.h>
|
||||
#include <linux/lockd/bind.h>
|
||||
+#include <linux/freezer.h>
|
||||
#include "internal.h"
|
||||
|
||||
#define NFSDBG_FACILITY NFSDBG_PROC
|
||||
@@ -59,7 +60,7 @@ nfs_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
|
||||
res = rpc_call_sync(clnt, msg, flags);
|
||||
if (res != -EKEYEXPIRED)
|
||||
break;
|
||||
- schedule_timeout_killable(NFS_JUKEBOX_RETRY_TIME);
|
||||
+ freezable_schedule_timeout_killable(NFS_JUKEBOX_RETRY_TIME);
|
||||
res = -ERESTARTSYS;
|
||||
} while (!fatal_signal_pending(current));
|
||||
return res;
|
||||
--- a/include/linux/freezer.h
|
||||
+++ a/include/linux/freezer.h
|
||||
@@ -135,6 +135,29 @@ static inline void set_freezable_with_signal(void)
|
||||
}
|
||||
|
||||
/*
|
||||
+ * These macros are intended to be used whenever you want allow a task that's
|
||||
+ * sleeping in TASK_UNINTERRUPTIBLE or TASK_KILLABLE state to be frozen. Note
|
||||
+ * that neither return any clear indication of whether a freeze event happened
|
||||
+ * while in this function.
|
||||
+ */
|
||||
+
|
||||
+/* Like schedule(), but should not block the freezer. */
|
||||
+#define freezable_schedule() \
|
||||
+({ \
|
||||
+ freezer_do_not_count(); \
|
||||
+ schedule(); \
|
||||
+ freezer_count(); \
|
||||
+})
|
||||
+
|
||||
+/* Like schedule_timeout_killable(), but should not block the freezer. */
|
||||
+#define freezable_schedule_timeout_killable(timeout) \
|
||||
+({ \
|
||||
+ freezer_do_not_count(); \
|
||||
+ schedule_timeout_killable(timeout); \
|
||||
+ freezer_count(); \
|
||||
+})
|
||||
+
|
||||
+/*
|
||||
* Freezer-friendly wrappers around wait_event_interruptible(),
|
||||
* wait_event_killable() and wait_event_interruptible_timeout(), originally
|
||||
* defined in <linux/wait.h>
|
||||
@@ -194,6 +217,11 @@ static inline int freezer_should_skip(struct task_struct *p) { return 0; }
|
||||
static inline void set_freezable(void) {}
|
||||
static inline void set_freezable_with_signal(void) {}
|
||||
|
||||
+#define freezable_schedule() schedule()
|
||||
+
|
||||
+#define freezable_schedule_timeout_killable(timeout) \
|
||||
+ schedule_timeout_killable(timeout)
|
||||
+
|
||||
#define wait_event_freezable(wq, condition) \
|
||||
wait_event_interruptible(wq, condition)
|
||||
|
||||
--- a/net/sunrpc/sched.c
|
||||
+++ a/net/sunrpc/sched.c
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <linux/smp.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mutex.h>
|
||||
+#include <linux/freezer.h>
|
||||
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
|
||||
@@ -231,7 +232,7 @@ static int rpc_wait_bit_killable(void *word)
|
||||
{
|
||||
if (fatal_signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
- schedule();
|
||||
+ freezable_schedule();
|
||||
return 0;
|
||||
}
|
||||
|
||||
include/linux/freezer.h | 21 ++++++++++++++++++---
|
||||
1 files changed, 18 insertions(+), 3 deletions(-)
|
||||
--- a/include/linux/freezer.h
|
||||
+++ a/include/linux/freezer.h
|
||||
@@ -141,18 +141,33 @@ static inline void set_freezable_with_signal(void)
|
||||
* while in this function.
|
||||
*/
|
||||
|
||||
-/* Like schedule(), but should not block the freezer. */
|
||||
+/*
|
||||
+ * Like schedule(), but should not block the freezer. It may return immediately
|
||||
+ * if it ends up racing with the freezer. Callers must be able to deal with
|
||||
+ * spurious wakeups.
|
||||
+ */
|
||||
#define freezable_schedule() \
|
||||
({ \
|
||||
freezer_do_not_count(); \
|
||||
- schedule(); \
|
||||
+ if (!try_to_freeze()) \
|
||||
+ schedule(); \
|
||||
freezer_count(); \
|
||||
})
|
||||
|
||||
-/* Like schedule_timeout_killable(), but should not block the freezer. */
|
||||
+/*
|
||||
+ * Like schedule_timeout_killable(), but should not block the freezer. It may
|
||||
+ * end up returning immediately if it ends up racing with the freezer. Callers
|
||||
+ * must be able to deal with the loose wakeup timing that can occur when the
|
||||
+ * freezer races in. When that occurs, this function will return the timeout
|
||||
+ * value instead of 0.
|
||||
+ */
|
||||
#define freezable_schedule_timeout_killable(timeout) \
|
||||
({ \
|
||||
freezer_do_not_count(); \
|
||||
+ if (try_to_freeze()) { \
|
||||
+ freezer_count(); \
|
||||
+ return timeout; \
|
||||
+ } \
|
||||
schedule_timeout_killable(timeout); \
|
||||
freezer_count(); \
|
||||
})
|
@ -1,44 +0,0 @@
|
||||
From a2ef990ab5a6705a356d146dd773a3b359787497 Mon Sep 17 00:00:00 2001
|
||||
From: Xiaotian Feng <xtfeng@gmail.com>
|
||||
Date: Thu, 12 Jan 2012 17:17:08 -0800
|
||||
Subject: [PATCH] proc: fix null pointer deref in proc_pid_permission()
|
||||
|
||||
get_proc_task() can fail to search the task and return NULL,
|
||||
put_task_struct() will then bomb the kernel with following oops:
|
||||
|
||||
BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
|
||||
IP: [<ffffffff81217d34>] proc_pid_permission+0x64/0xe0
|
||||
PGD 112075067 PUD 112814067 PMD 0
|
||||
Oops: 0002 [#1] PREEMPT SMP
|
||||
|
||||
This is a regression introduced by commit 0499680a ("procfs: add hidepid=
|
||||
and gid= mount options"). The kernel should return -ESRCH if
|
||||
get_proc_task() failed.
|
||||
|
||||
Signed-off-by: Xiaotian Feng <dannyfeng@tencent.com>
|
||||
Cc: Al Viro <viro@zeniv.linux.org.uk>
|
||||
Cc: Vasiliy Kulikov <segoon@openwall.com>
|
||||
Cc: Stephen Wilson <wilsons@start.ca>
|
||||
Acked-by: David Rientjes <rientjes@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
fs/proc/base.c | 2 ++
|
||||
1 files changed, 2 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/fs/proc/base.c b/fs/proc/base.c
|
||||
index 8173dfd..5485a53 100644
|
||||
--- a/fs/proc/base.c
|
||||
+++ b/fs/proc/base.c
|
||||
@@ -654,6 +654,8 @@ static int proc_pid_permission(struct inode *inode, int mask)
|
||||
bool has_perms;
|
||||
|
||||
task = get_proc_task(inode);
|
||||
+ if (!task)
|
||||
+ return -ESRCH;
|
||||
has_perms = has_pid_permissions(pid, task, 1);
|
||||
put_task_struct(task);
|
||||
|
||||
--
|
||||
1.7.7.5
|
||||
|
@ -1,342 +0,0 @@
|
||||
From 0499680a42141d86417a8fbaa8c8db806bea1201 Mon Sep 17 00:00:00 2001
|
||||
From: Vasiliy Kulikov <segooon@gmail.com>
|
||||
Date: Tue, 10 Jan 2012 15:11:31 -0800
|
||||
Subject: [PATCH] procfs: add hidepid= and gid= mount options
|
||||
|
||||
Add support for mount options to restrict access to /proc/PID/
|
||||
directories. The default backward-compatible "relaxed" behaviour is left
|
||||
untouched.
|
||||
|
||||
The first mount option is called "hidepid" and its value defines how much
|
||||
info about processes we want to be available for non-owners:
|
||||
|
||||
hidepid=0 (default) means the old behavior - anybody may read all
|
||||
world-readable /proc/PID/* files.
|
||||
|
||||
hidepid=1 means users may not access any /proc/<pid>/ directories, but
|
||||
their own. Sensitive files like cmdline, sched*, status are now protected
|
||||
against other users. As permission checking done in proc_pid_permission()
|
||||
and files' permissions are left untouched, programs expecting specific
|
||||
files' modes are not confused.
|
||||
|
||||
hidepid=2 means hidepid=1 plus all /proc/PID/ will be invisible to other
|
||||
users. It doesn't mean that it hides whether a process exists (it can be
|
||||
learned by other means, e.g. by kill -0 $PID), but it hides process' euid
|
||||
and egid. It compicates intruder's task of gathering info about running
|
||||
processes, whether some daemon runs with elevated privileges, whether
|
||||
another user runs some sensitive program, whether other users run any
|
||||
program at all, etc.
|
||||
|
||||
gid=XXX defines a group that will be able to gather all processes' info
|
||||
(as in hidepid=0 mode). This group should be used instead of putting
|
||||
nonroot user in sudoers file or something. However, untrusted users (like
|
||||
daemons, etc.) which are not supposed to monitor the tasks in the whole
|
||||
system should not be added to the group.
|
||||
|
||||
hidepid=1 or higher is designed to restrict access to procfs files, which
|
||||
might reveal some sensitive private information like precise keystrokes
|
||||
timings:
|
||||
|
||||
http://www.openwall.com/lists/oss-security/2011/11/05/3
|
||||
|
||||
hidepid=1/2 doesn't break monitoring userspace tools. ps, top, pgrep, and
|
||||
conky gracefully handle EPERM/ENOENT and behave as if the current user is
|
||||
the only user running processes. pstree shows the process subtree which
|
||||
contains "pstree" process.
|
||||
|
||||
Note: the patch doesn't deal with setuid/setgid issues of keeping
|
||||
preopened descriptors of procfs files (like
|
||||
https://lkml.org/lkml/2011/2/7/368). We rely on that the leaked
|
||||
information like the scheduling counters of setuid apps doesn't threaten
|
||||
anybody's privacy - only the user started the setuid program may read the
|
||||
counters.
|
||||
|
||||
Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
|
||||
Cc: Alexey Dobriyan <adobriyan@gmail.com>
|
||||
Cc: Al Viro <viro@zeniv.linux.org.uk>
|
||||
Cc: Randy Dunlap <rdunlap@xenotime.net>
|
||||
Cc: "H. Peter Anvin" <hpa@zytor.com>
|
||||
Cc: Greg KH <greg@kroah.com>
|
||||
Cc: Theodore Tso <tytso@MIT.EDU>
|
||||
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||
Cc: James Morris <jmorris@namei.org>
|
||||
Cc: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Hugh Dickins <hughd@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
Documentation/filesystems/proc.txt | 39 ++++++++++++++++++++
|
||||
fs/proc/base.c | 69 +++++++++++++++++++++++++++++++++++-
|
||||
fs/proc/inode.c | 8 ++++
|
||||
fs/proc/root.c | 21 +++++++++--
|
||||
include/linux/pid_namespace.h | 2 +
|
||||
5 files changed, 135 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
|
||||
index 0ec91f0..12fee13 100644
|
||||
--- a/Documentation/filesystems/proc.txt
|
||||
+++ b/Documentation/filesystems/proc.txt
|
||||
@@ -41,6 +41,8 @@ Table of Contents
|
||||
3.5 /proc/<pid>/mountinfo - Information about mounts
|
||||
3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm
|
||||
|
||||
+ 4 Configuring procfs
|
||||
+ 4.1 Mount options
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Preface
|
||||
@@ -1542,3 +1544,40 @@ a task to set its own or one of its thread siblings comm value. The comm value
|
||||
is limited in size compared to the cmdline value, so writing anything longer
|
||||
then the kernel's TASK_COMM_LEN (currently 16 chars) will result in a truncated
|
||||
comm value.
|
||||
+
|
||||
+
|
||||
+------------------------------------------------------------------------------
|
||||
+Configuring procfs
|
||||
+------------------------------------------------------------------------------
|
||||
+
|
||||
+4.1 Mount options
|
||||
+---------------------
|
||||
+
|
||||
+The following mount options are supported:
|
||||
+
|
||||
+ hidepid= Set /proc/<pid>/ access mode.
|
||||
+ gid= Set the group authorized to learn processes information.
|
||||
+
|
||||
+hidepid=0 means classic mode - everybody may access all /proc/<pid>/ directories
|
||||
+(default).
|
||||
+
|
||||
+hidepid=1 means users may not access any /proc/<pid>/ directories but their
|
||||
+own. Sensitive files like cmdline, sched*, status are now protected against
|
||||
+other users. This makes it impossible to learn whether any user runs
|
||||
+specific program (given the program doesn't reveal itself by its behaviour).
|
||||
+As an additional bonus, as /proc/<pid>/cmdline is unaccessible for other users,
|
||||
+poorly written programs passing sensitive information via program arguments are
|
||||
+now protected against local eavesdroppers.
|
||||
+
|
||||
+hidepid=2 means hidepid=1 plus all /proc/<pid>/ will be fully invisible to other
|
||||
+users. It doesn't mean that it hides a fact whether a process with a specific
|
||||
+pid value exists (it can be learned by other means, e.g. by "kill -0 $PID"),
|
||||
+but it hides process' uid and gid, which may be learned by stat()'ing
|
||||
+/proc/<pid>/ otherwise. It greatly complicates an intruder's task of gathering
|
||||
+information about running processes, whether some daemon runs with elevated
|
||||
+privileges, whether other user runs some sensitive program, whether other users
|
||||
+run any program at all, etc.
|
||||
+
|
||||
+gid= defines a group authorized to learn processes information otherwise
|
||||
+prohibited by hidepid=. If you use some daemon like identd which needs to learn
|
||||
+information about processes information, just add identd to this group.
|
||||
diff --git a/fs/proc/base.c b/fs/proc/base.c
|
||||
index 4d755fe..8173dfd 100644
|
||||
--- a/fs/proc/base.c
|
||||
+++ b/fs/proc/base.c
|
||||
@@ -631,6 +631,50 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * May current process learn task's sched/cmdline info (for hide_pid_min=1)
|
||||
+ * or euid/egid (for hide_pid_min=2)?
|
||||
+ */
|
||||
+static bool has_pid_permissions(struct pid_namespace *pid,
|
||||
+ struct task_struct *task,
|
||||
+ int hide_pid_min)
|
||||
+{
|
||||
+ if (pid->hide_pid < hide_pid_min)
|
||||
+ return true;
|
||||
+ if (in_group_p(pid->pid_gid))
|
||||
+ return true;
|
||||
+ return ptrace_may_access(task, PTRACE_MODE_READ);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int proc_pid_permission(struct inode *inode, int mask)
|
||||
+{
|
||||
+ struct pid_namespace *pid = inode->i_sb->s_fs_info;
|
||||
+ struct task_struct *task;
|
||||
+ bool has_perms;
|
||||
+
|
||||
+ task = get_proc_task(inode);
|
||||
+ has_perms = has_pid_permissions(pid, task, 1);
|
||||
+ put_task_struct(task);
|
||||
+
|
||||
+ if (!has_perms) {
|
||||
+ if (pid->hide_pid == 2) {
|
||||
+ /*
|
||||
+ * Let's make getdents(), stat(), and open()
|
||||
+ * consistent with each other. If a process
|
||||
+ * may not stat() a file, it shouldn't be seen
|
||||
+ * in procfs at all.
|
||||
+ */
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ return -EPERM;
|
||||
+ }
|
||||
+ return generic_permission(inode, mask);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
static const struct inode_operations proc_def_inode_operations = {
|
||||
.setattr = proc_setattr,
|
||||
};
|
||||
@@ -1615,6 +1659,7 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct task_struct *task;
|
||||
const struct cred *cred;
|
||||
+ struct pid_namespace *pid = dentry->d_sb->s_fs_info;
|
||||
|
||||
generic_fillattr(inode, stat);
|
||||
|
||||
@@ -1623,6 +1668,14 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
|
||||
stat->gid = 0;
|
||||
task = pid_task(proc_pid(inode), PIDTYPE_PID);
|
||||
if (task) {
|
||||
+ if (!has_pid_permissions(pid, task, 2)) {
|
||||
+ rcu_read_unlock();
|
||||
+ /*
|
||||
+ * This doesn't prevent learning whether PID exists,
|
||||
+ * it only makes getattr() consistent with readdir().
|
||||
+ */
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) ||
|
||||
task_dumpable(task)) {
|
||||
cred = __task_cred(task);
|
||||
@@ -3119,6 +3172,7 @@ static const struct inode_operations proc_tgid_base_inode_operations = {
|
||||
.lookup = proc_tgid_base_lookup,
|
||||
.getattr = pid_getattr,
|
||||
.setattr = proc_setattr,
|
||||
+ .permission = proc_pid_permission,
|
||||
};
|
||||
|
||||
static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)
|
||||
@@ -3322,6 +3376,12 @@ static int proc_pid_fill_cache(struct file *filp, void *dirent, filldir_t filldi
|
||||
proc_pid_instantiate, iter.task, NULL);
|
||||
}
|
||||
|
||||
+static int fake_filldir(void *buf, const char *name, int namelen,
|
||||
+ loff_t offset, u64 ino, unsigned d_type)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* for the /proc/ directory itself, after non-process stuff has been done */
|
||||
int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
||||
{
|
||||
@@ -3329,6 +3389,7 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
||||
struct task_struct *reaper;
|
||||
struct tgid_iter iter;
|
||||
struct pid_namespace *ns;
|
||||
+ filldir_t __filldir;
|
||||
|
||||
if (filp->f_pos >= PID_MAX_LIMIT + TGID_OFFSET)
|
||||
goto out_no_task;
|
||||
@@ -3350,8 +3411,13 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
||||
for (iter = next_tgid(ns, iter);
|
||||
iter.task;
|
||||
iter.tgid += 1, iter = next_tgid(ns, iter)) {
|
||||
+ if (has_pid_permissions(ns, iter.task, 2))
|
||||
+ __filldir = filldir;
|
||||
+ else
|
||||
+ __filldir = fake_filldir;
|
||||
+
|
||||
filp->f_pos = iter.tgid + TGID_OFFSET;
|
||||
- if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) {
|
||||
+ if (proc_pid_fill_cache(filp, dirent, __filldir, iter) < 0) {
|
||||
put_task_struct(iter.task);
|
||||
goto out;
|
||||
}
|
||||
@@ -3686,6 +3752,7 @@ static const struct inode_operations proc_task_inode_operations = {
|
||||
.lookup = proc_task_lookup,
|
||||
.getattr = proc_task_getattr,
|
||||
.setattr = proc_setattr,
|
||||
+ .permission = proc_pid_permission,
|
||||
};
|
||||
|
||||
static const struct file_operations proc_task_operations = {
|
||||
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
|
||||
index 27c762f..84fd323 100644
|
||||
--- a/fs/proc/inode.c
|
||||
+++ b/fs/proc/inode.c
|
||||
@@ -106,6 +106,14 @@ void __init proc_init_inodecache(void)
|
||||
|
||||
static int proc_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||
{
|
||||
+ struct super_block *sb = vfs->mnt_sb;
|
||||
+ struct pid_namespace *pid = sb->s_fs_info;
|
||||
+
|
||||
+ if (pid->pid_gid)
|
||||
+ seq_printf(seq, ",gid=%lu", (unsigned long)pid->pid_gid);
|
||||
+ if (pid->hide_pid != 0)
|
||||
+ seq_printf(seq, ",hidepid=%u", pid->hide_pid);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/fs/proc/root.c b/fs/proc/root.c
|
||||
index 6a8ac1d..46a15d8 100644
|
||||
--- a/fs/proc/root.c
|
||||
+++ b/fs/proc/root.c
|
||||
@@ -38,10 +38,12 @@ static int proc_set_super(struct super_block *sb, void *data)
|
||||
}
|
||||
|
||||
enum {
|
||||
- Opt_err,
|
||||
+ Opt_gid, Opt_hidepid, Opt_err,
|
||||
};
|
||||
|
||||
static const match_table_t tokens = {
|
||||
+ {Opt_hidepid, "hidepid=%u"},
|
||||
+ {Opt_gid, "gid=%u"},
|
||||
{Opt_err, NULL},
|
||||
};
|
||||
|
||||
@@ -49,8 +51,7 @@ static int proc_parse_options(char *options, struct pid_namespace *pid)
|
||||
{
|
||||
char *p;
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
-
|
||||
- pr_debug("proc: options = %s\n", options);
|
||||
+ int option;
|
||||
|
||||
if (!options)
|
||||
return 1;
|
||||
@@ -63,6 +64,20 @@ static int proc_parse_options(char *options, struct pid_namespace *pid)
|
||||
args[0].to = args[0].from = 0;
|
||||
token = match_token(p, tokens, args);
|
||||
switch (token) {
|
||||
+ case Opt_gid:
|
||||
+ if (match_int(&args[0], &option))
|
||||
+ return 0;
|
||||
+ pid->pid_gid = option;
|
||||
+ break;
|
||||
+ case Opt_hidepid:
|
||||
+ if (match_int(&args[0], &option))
|
||||
+ return 0;
|
||||
+ if (option < 0 || option > 2) {
|
||||
+ pr_err("proc: hidepid value must be between 0 and 2.\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ pid->hide_pid = option;
|
||||
+ break;
|
||||
default:
|
||||
pr_err("proc: unrecognized mount option \"%s\" "
|
||||
"or missing value\n", p);
|
||||
diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
|
||||
index 38d1032..e7cf666 100644
|
||||
--- a/include/linux/pid_namespace.h
|
||||
+++ b/include/linux/pid_namespace.h
|
||||
@@ -30,6 +30,8 @@ struct pid_namespace {
|
||||
#ifdef CONFIG_BSD_PROCESS_ACCT
|
||||
struct bsd_acct_struct *bacct;
|
||||
#endif
|
||||
+ gid_t pid_gid;
|
||||
+ int hide_pid;
|
||||
};
|
||||
|
||||
extern struct pid_namespace init_pid_ns;
|
||||
--
|
||||
1.7.7.5
|
||||
|
@ -1,173 +0,0 @@
|
||||
From 97412950b10e64f347aec4a9b759395c2465adf6 Mon Sep 17 00:00:00 2001
|
||||
From: Vasiliy Kulikov <segooon@gmail.com>
|
||||
Date: Tue, 10 Jan 2012 15:11:27 -0800
|
||||
Subject: [PATCH] procfs: parse mount options
|
||||
|
||||
Add support for procfs mount options. Actual mount options are coming in
|
||||
the next patches.
|
||||
|
||||
Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
|
||||
Cc: Alexey Dobriyan <adobriyan@gmail.com>
|
||||
Cc: Al Viro <viro@zeniv.linux.org.uk>
|
||||
Cc: Randy Dunlap <rdunlap@xenotime.net>
|
||||
Cc: "H. Peter Anvin" <hpa@zytor.com>
|
||||
Cc: Greg KH <greg@kroah.com>
|
||||
Cc: Theodore Tso <tytso@MIT.EDU>
|
||||
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||
Cc: James Morris <jmorris@namei.org>
|
||||
Cc: Oleg Nesterov <oleg@redhat.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
fs/proc/inode.c | 10 +++++++++
|
||||
fs/proc/internal.h | 1 +
|
||||
fs/proc/root.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
3 files changed, 64 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
|
||||
index 51a1766..27c762f 100644
|
||||
--- a/fs/proc/inode.c
|
||||
+++ b/fs/proc/inode.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/kernel.h>
|
||||
+#include <linux/pid_namespace.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/stat.h>
|
||||
@@ -17,7 +18,9 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sysctl.h>
|
||||
+#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/mount.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
@@ -101,12 +104,19 @@ void __init proc_init_inodecache(void)
|
||||
init_once);
|
||||
}
|
||||
|
||||
+static int proc_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static const struct super_operations proc_sops = {
|
||||
.alloc_inode = proc_alloc_inode,
|
||||
.destroy_inode = proc_destroy_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.evict_inode = proc_evict_inode,
|
||||
.statfs = simple_statfs,
|
||||
+ .remount_fs = proc_remount,
|
||||
+ .show_options = proc_show_options,
|
||||
};
|
||||
|
||||
static void __pde_users_dec(struct proc_dir_entry *pde)
|
||||
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
|
||||
index 7838e5c..2925775 100644
|
||||
--- a/fs/proc/internal.h
|
||||
+++ b/fs/proc/internal.h
|
||||
@@ -117,6 +117,7 @@ void pde_put(struct proc_dir_entry *pde);
|
||||
|
||||
int proc_fill_super(struct super_block *);
|
||||
struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
|
||||
+int proc_remount(struct super_block *sb, int *flags, char *data);
|
||||
|
||||
/*
|
||||
* These are generic /proc routines that use the internal
|
||||
diff --git a/fs/proc/root.c b/fs/proc/root.c
|
||||
index 03102d9..6a8ac1d 100644
|
||||
--- a/fs/proc/root.c
|
||||
+++ b/fs/proc/root.c
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/pid_namespace.h>
|
||||
+#include <linux/parser.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
@@ -36,6 +37,48 @@ static int proc_set_super(struct super_block *sb, void *data)
|
||||
return err;
|
||||
}
|
||||
|
||||
+enum {
|
||||
+ Opt_err,
|
||||
+};
|
||||
+
|
||||
+static const match_table_t tokens = {
|
||||
+ {Opt_err, NULL},
|
||||
+};
|
||||
+
|
||||
+static int proc_parse_options(char *options, struct pid_namespace *pid)
|
||||
+{
|
||||
+ char *p;
|
||||
+ substring_t args[MAX_OPT_ARGS];
|
||||
+
|
||||
+ pr_debug("proc: options = %s\n", options);
|
||||
+
|
||||
+ if (!options)
|
||||
+ return 1;
|
||||
+
|
||||
+ while ((p = strsep(&options, ",")) != NULL) {
|
||||
+ int token;
|
||||
+ if (!*p)
|
||||
+ continue;
|
||||
+
|
||||
+ args[0].to = args[0].from = 0;
|
||||
+ token = match_token(p, tokens, args);
|
||||
+ switch (token) {
|
||||
+ default:
|
||||
+ pr_err("proc: unrecognized mount option \"%s\" "
|
||||
+ "or missing value\n", p);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+int proc_remount(struct super_block *sb, int *flags, char *data)
|
||||
+{
|
||||
+ struct pid_namespace *pid = sb->s_fs_info;
|
||||
+ return !proc_parse_options(data, pid);
|
||||
+}
|
||||
+
|
||||
static struct dentry *proc_mount(struct file_system_type *fs_type,
|
||||
int flags, const char *dev_name, void *data)
|
||||
{
|
||||
@@ -43,11 +86,15 @@ static struct dentry *proc_mount(struct file_system_type *fs_type,
|
||||
struct super_block *sb;
|
||||
struct pid_namespace *ns;
|
||||
struct proc_inode *ei;
|
||||
+ char *options;
|
||||
|
||||
- if (flags & MS_KERNMOUNT)
|
||||
+ if (flags & MS_KERNMOUNT) {
|
||||
ns = (struct pid_namespace *)data;
|
||||
- else
|
||||
+ options = NULL;
|
||||
+ } else {
|
||||
ns = current->nsproxy->pid_ns;
|
||||
+ options = data;
|
||||
+ }
|
||||
|
||||
sb = sget(fs_type, proc_test_super, proc_set_super, ns);
|
||||
if (IS_ERR(sb))
|
||||
@@ -55,6 +102,10 @@ static struct dentry *proc_mount(struct file_system_type *fs_type,
|
||||
|
||||
if (!sb->s_root) {
|
||||
sb->s_flags = flags;
|
||||
+ if (!proc_parse_options(options, ns)) {
|
||||
+ deactivate_locked_super(sb);
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+ }
|
||||
err = proc_fill_super(sb);
|
||||
if (err) {
|
||||
deactivate_locked_super(sb);
|
||||
--
|
||||
1.7.7.5
|
||||
|
@ -1,10 +0,0 @@
|
||||
* disable CONFIG_B43_BCMA_EXTRA (799657)
|
||||
|
||||
* Do not turn on CONFIG_NFS_USE_NEW_IDMAPPER in f15/f16. Steved will hunt you
|
||||
down.
|
||||
|
||||
* Turn on the amilo-rfkill driver
|
||||
|
||||
* Remove the with_backports/compat-wireless stuff
|
||||
|
||||
|
@ -1,76 +0,0 @@
|
||||
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
|
||||
index 3ae4128..e17c6d2 100644
|
||||
--- a/arch/x86/platform/efi/efi.c
|
||||
+++ b/arch/x86/platform/efi/efi.c
|
||||
@@ -89,50 +89,26 @@ early_param("add_efi_memmap", setup_add_efi_memmap);
|
||||
|
||||
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
|
||||
{
|
||||
- unsigned long flags;
|
||||
- efi_status_t status;
|
||||
-
|
||||
- spin_lock_irqsave(&rtc_lock, flags);
|
||||
- status = efi_call_virt2(get_time, tm, tc);
|
||||
- spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
- return status;
|
||||
+ return efi_call_virt2(get_time, tm, tc);
|
||||
}
|
||||
|
||||
static efi_status_t virt_efi_set_time(efi_time_t *tm)
|
||||
{
|
||||
- unsigned long flags;
|
||||
- efi_status_t status;
|
||||
-
|
||||
- spin_lock_irqsave(&rtc_lock, flags);
|
||||
- status = efi_call_virt1(set_time, tm);
|
||||
- spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
- return status;
|
||||
+ return efi_call_virt1(set_time, tm);
|
||||
}
|
||||
|
||||
static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled,
|
||||
efi_bool_t *pending,
|
||||
efi_time_t *tm)
|
||||
{
|
||||
- unsigned long flags;
|
||||
- efi_status_t status;
|
||||
-
|
||||
- spin_lock_irqsave(&rtc_lock, flags);
|
||||
- status = efi_call_virt3(get_wakeup_time,
|
||||
- enabled, pending, tm);
|
||||
- spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
- return status;
|
||||
+ return efi_call_virt3(get_wakeup_time,
|
||||
+ enabled, pending, tm);
|
||||
}
|
||||
|
||||
static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
|
||||
{
|
||||
- unsigned long flags;
|
||||
- efi_status_t status;
|
||||
-
|
||||
- spin_lock_irqsave(&rtc_lock, flags);
|
||||
- status = efi_call_virt2(set_wakeup_time,
|
||||
- enabled, tm);
|
||||
- spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
- return status;
|
||||
+ return efi_call_virt2(set_wakeup_time,
|
||||
+ enabled, tm);
|
||||
}
|
||||
|
||||
static efi_status_t virt_efi_get_variable(efi_char16_t *name,
|
||||
@@ -232,14 +208,11 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
|
||||
static efi_status_t __init phys_efi_get_time(efi_time_t *tm,
|
||||
efi_time_cap_t *tc)
|
||||
{
|
||||
- unsigned long flags;
|
||||
efi_status_t status;
|
||||
|
||||
- spin_lock_irqsave(&rtc_lock, flags);
|
||||
efi_call_phys_prelog();
|
||||
status = efi_call_phys2(efi_phys.get_time, tm, tc);
|
||||
efi_call_phys_epilog();
|
||||
- spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
return status;
|
||||
}
|
||||
|
@ -1,163 +0,0 @@
|
||||
A recent LKML thread (http://lkml.indiana.edu/hypermail/linux/kernel/1112.3/00965.html)
|
||||
discusses warnings that occur during a suspend/resume cycle. The driver
|
||||
attempts to read the firmware file before userspace is ready, leading to the
|
||||
following warning:
|
||||
|
||||
WARNING: at drivers/base/firmware_class.c:537 _request_firmware+0x3f6/0x420()
|
||||
|
||||
For rtl8192cu, the problem is fixed by storing the firmware in a global buffer
|
||||
rather than one allocated per device. The usage count is increased when
|
||||
suspending and decreased when resuming. This way, the firmware is retained
|
||||
through a suspend/resume cycle, and does not have to be reread.
|
||||
|
||||
This patch should fix the bug reported in
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=771002.
|
||||
|
||||
Note: This patch also touches rtl8192ce as the "firmware" loaded message
|
||||
is now printed in the wrong place.
|
||||
Note: This patch also touches rtl8192ce as the "firmware" loaded message
|
||||
is now printed in the wrong place.
|
||||
|
||||
Reported-by: Mohammed Arafa <bugzilla@xxxxxxxxxxxx>
|
||||
Reported-by: Dave Jones <davej@xxxxxxxxxx>
|
||||
Signed-off-by: Larry Finger <Larry.Finger@xxxxxxxxxxxx>
|
||||
Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
|
||||
Cc: Stable <stable@xxxxxxxxxxxxxxx>
|
||||
|
||||
---
|
||||
drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 1 -
|
||||
drivers/net/wireless/rtlwifi/rtl8192ce/sw.c | 1 +
|
||||
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 58 +++++++++++++++++----
|
||||
3 files changed, 49 insertions(+), 11 deletions(-)
|
||||
|
||||
--- linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c 2012-01-13 13:07:58.830625006 -0500
|
||||
+++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c 2012-01-13 13:08:06.825439927 -0500
|
||||
@@ -227,7 +227,6 @@ int rtl92c_download_fw(struct ieee80211_
|
||||
u32 fwsize;
|
||||
enum version_8192c version = rtlhal->version;
|
||||
|
||||
- pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
|
||||
if (!rtlhal->pfirmware)
|
||||
return 1;
|
||||
|
||||
--- linux-2.6/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
|
||||
+++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
|
||||
@@ -186,6 +186,7 @@ int rtl92c_init_sw_vars(struct ieee80211
|
||||
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
|
||||
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||
release_firmware(firmware);
|
||||
+ pr_info("rtl8192ce: Loaded firmware file %s\n", rtlpriv->cfg->fw_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
|
||||
+++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
|
||||
@@ -43,6 +43,8 @@
|
||||
#include "hw.h"
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/atomic.h>
|
||||
+#include <linux/types.h>
|
||||
|
||||
MODULE_AUTHOR("Georgia <georgia@realtek.com>");
|
||||
MODULE_AUTHOR("Ziv Huang <ziv_huang@realtek.com>");
|
||||
@@ -51,6 +53,10 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
|
||||
|
||||
+static char *rtl8192cu_firmware; /* pointer to firmware */
|
||||
+static int firmware_size;
|
||||
+static atomic_t usage_count;
|
||||
+
|
||||
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
@@ -62,12 +68,21 @@ static int rtl92cu_init_sw_vars(struct i
|
||||
rtlpriv->dm.disable_framebursting = false;
|
||||
rtlpriv->dm.thermalvalue = 0;
|
||||
rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
|
||||
- rtlpriv->rtlhal.pfirmware = vmalloc(0x4000);
|
||||
- if (!rtlpriv->rtlhal.pfirmware) {
|
||||
+
|
||||
+ if (rtl8192cu_firmware) {
|
||||
+ /* firmware already loaded - true for suspend/resume
|
||||
+ * and multiple instances of the device */
|
||||
+ rtlpriv->rtlhal.pfirmware = rtl8192cu_firmware;
|
||||
+ rtlpriv->rtlhal.fwsize = firmware_size;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ rtl8192cu_firmware = vzalloc(0x4000);
|
||||
+ if (!rtl8192cu_firmware) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Can't alloc buffer for fw.\n"));
|
||||
return 1;
|
||||
}
|
||||
+
|
||||
/* request fw */
|
||||
err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
|
||||
rtlpriv->io.dev);
|
||||
@@ -82,9 +97,14 @@ static int rtl92cu_init_sw_vars(struct i
|
||||
release_firmware(firmware);
|
||||
return 1;
|
||||
}
|
||||
- memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
|
||||
+ pr_info("rtl8192cu: Loaded firmware from file %s\n",
|
||||
+ rtlpriv->cfg->fw_name);
|
||||
+ memcpy(rtl8192cu_firmware, firmware->data, firmware->size);
|
||||
+ firmware_size = firmware->size;
|
||||
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||
+ rtlpriv->rtlhal.pfirmware = rtl8192cu_firmware;
|
||||
release_firmware(firmware);
|
||||
+ atomic_inc(&usage_count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -93,12 +113,30 @@ static void rtl92cu_deinit_sw_vars(struc
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
- if (rtlpriv->rtlhal.pfirmware) {
|
||||
- vfree(rtlpriv->rtlhal.pfirmware);
|
||||
+ atomic_dec(&usage_count);
|
||||
+ if (!atomic_read(&usage_count) && rtlpriv->rtlhal.pfirmware) {
|
||||
+ vfree(rtl8192cu_firmware);
|
||||
+ rtl8192cu_firmware = NULL;
|
||||
rtlpriv->rtlhal.pfirmware = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_PM_SLEEP
|
||||
+static int rtl8192cu_usb_suspend(struct usb_interface *pusb_intf,
|
||||
+ pm_message_t message)
|
||||
+{
|
||||
+ /* Increase usage_count to Save loaded fw across suspend/resume */
|
||||
+ atomic_inc(&usage_count);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rtl8192cu_usb_resume(struct usb_interface *pusb_intf)
|
||||
+{
|
||||
+ atomic_dec(&usage_count); /* after resume, decrease usage count */
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static struct rtl_hal_ops rtl8192cu_hal_ops = {
|
||||
.init_sw_vars = rtl92cu_init_sw_vars,
|
||||
.deinit_sw_vars = rtl92cu_deinit_sw_vars,
|
||||
@@ -374,11 +412,10 @@ static struct usb_driver rtl8192cu_drive
|
||||
.disconnect = rtl_usb_disconnect,
|
||||
.id_table = rtl8192c_usb_ids,
|
||||
|
||||
-#ifdef CONFIG_PM
|
||||
- /* .suspend = rtl_usb_suspend, */
|
||||
- /* .resume = rtl_usb_resume, */
|
||||
- /* .reset_resume = rtl8192c_resume, */
|
||||
-#endif /* CONFIG_PM */
|
||||
+#ifdef CONFIG_PM_SLEEP
|
||||
+ .suspend = rtl8192cu_usb_suspend,
|
||||
+ .resume = rtl8192cu_usb_resume,
|
||||
+#endif /* CONFIG_PM_SLEEP */
|
||||
#ifdef CONFIG_AUTOSUSPEND
|
||||
.supports_autosuspend = 1,
|
||||
#endif
|
@ -1,116 +0,0 @@
|
||||
--- linux-2.6.42.noarch/fs/partitions/check.c~ 2012-02-20 18:32:55.314253719 -0500
|
||||
+++ linux-2.6.42.noarch/fs/partitions/check.c 2012-02-20 18:34:46.509859745 -0500
|
||||
@@ -539,17 +539,11 @@ static bool disk_unlock_native_capacity(
|
||||
}
|
||||
}
|
||||
|
||||
-int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||
+static int drop_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||
{
|
||||
- struct parsed_partitions *state = NULL;
|
||||
struct disk_part_iter piter;
|
||||
struct hd_struct *part;
|
||||
- int p, highest, res;
|
||||
-rescan:
|
||||
- if (state && !IS_ERR(state)) {
|
||||
- kfree(state);
|
||||
- state = NULL;
|
||||
- }
|
||||
+ int res;
|
||||
|
||||
if (bdev->bd_part_count)
|
||||
return -EBUSY;
|
||||
@@ -562,6 +556,24 @@ rescan:
|
||||
delete_partition(disk, part->partno);
|
||||
disk_part_iter_exit(&piter);
|
||||
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||
+{
|
||||
+ struct parsed_partitions *state = NULL;
|
||||
+ struct hd_struct *part;
|
||||
+ int p, highest, res;
|
||||
+rescan:
|
||||
+ if (state && !IS_ERR(state)) {
|
||||
+ kfree(state);
|
||||
+ state = NULL;
|
||||
+ }
|
||||
+
|
||||
+ res = drop_partitions(disk, bdev);
|
||||
+ if (res)
|
||||
+ return res;
|
||||
+
|
||||
if (disk->fops->revalidate_disk)
|
||||
disk->fops->revalidate_disk(disk);
|
||||
check_disk_size_change(disk, bdev);
|
||||
@@ -665,6 +677,26 @@ rescan:
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int invalidate_partitions(struct gendisk *disk, struct block_device *bdev)
|
||||
+{
|
||||
+ int res;
|
||||
+
|
||||
+ if (!bdev->bd_invalidated)
|
||||
+ return 0;
|
||||
+
|
||||
+ res = drop_partitions(disk, bdev);
|
||||
+ if (res)
|
||||
+ return res;
|
||||
+
|
||||
+ set_capacity(disk, 0);
|
||||
+ check_disk_size_change(disk, bdev);
|
||||
+ bdev->bd_invalidated = 0;
|
||||
+ /* tell userspace that the media / partition table may have changed */
|
||||
+ kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
|
||||
{
|
||||
struct address_space *mapping = bdev->bd_inode->i_mapping;
|
||||
--- linux-2.6.42.noarch/include/linux/genhd.h~ 2012-02-20 18:35:02.777802107 -0500
|
||||
+++ linux-2.6.42.noarch/include/linux/genhd.h 2012-02-20 18:35:13.873762792 -0500
|
||||
@@ -596,6 +596,7 @@ extern char *disk_name (struct gendisk *
|
||||
|
||||
extern int disk_expand_part_tbl(struct gendisk *disk, int target);
|
||||
extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
|
||||
+extern int invalidate_partitions(struct gendisk *disk, struct block_device *bdev);
|
||||
extern struct hd_struct * __must_check add_partition(struct gendisk *disk,
|
||||
int partno, sector_t start,
|
||||
sector_t len, int flags,
|
||||
--- linux-2.6.42.noarch/fs/block_dev.c~ 2012-02-20 18:35:24.890723757 -0500
|
||||
+++ linux-2.6.42.noarch/fs/block_dev.c 2012-02-20 18:36:25.166510197 -0500
|
||||
@@ -1159,8 +1159,12 @@ static int __blkdev_get(struct block_dev
|
||||
* The latter is necessary to prevent ghost
|
||||
* partitions on a removed medium.
|
||||
*/
|
||||
- if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM))
|
||||
- rescan_partitions(disk, bdev);
|
||||
+ if (bdev->bd_invalidated) {
|
||||
+ if (!ret)
|
||||
+ rescan_partitions(disk, bdev);
|
||||
+ else if (ret == -ENOMEDIUM)
|
||||
+ invalidate_partitions(disk, bdev);
|
||||
+ }
|
||||
if (ret)
|
||||
goto out_clear;
|
||||
} else {
|
||||
@@ -1190,8 +1194,12 @@ static int __blkdev_get(struct block_dev
|
||||
if (bdev->bd_disk->fops->open)
|
||||
ret = bdev->bd_disk->fops->open(bdev, mode);
|
||||
/* the same as first opener case, read comment there */
|
||||
- if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM))
|
||||
- rescan_partitions(bdev->bd_disk, bdev);
|
||||
+ if (bdev->bd_invalidated) {
|
||||
+ if (!ret)
|
||||
+ rescan_partitions(bdev->bd_disk, bdev);
|
||||
+ else if (ret == -ENOMEDIUM)
|
||||
+ invalidate_partitions(bdev->bd_disk, bdev);
|
||||
+ }
|
||||
if (ret)
|
||||
goto out_unlock_bdev;
|
||||
}
|
3
sources
3
sources
@ -1,2 +1 @@
|
||||
364066fa18767ec0ae5f4e4abcf9dc51 linux-3.2.tar.xz
|
||||
7481fa09f2efda915ed19a9da33a2e59 patch-3.2.10.xz
|
||||
7133f5a2086a7d7ef97abac610c094f5 linux-3.3.tar.xz
|
||||
|
@ -1,239 +0,0 @@
|
||||
From: Neil Horman <nhorman@tuxdriver.com>
|
||||
Date: Thu, 6 Oct 2011 18:08:18 +0000 (-0400)
|
||||
Subject: PCI/sysfs: add per pci device msi[x] irq listing (v5)
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjbarnes%2Fpci.git;a=commitdiff_plain;h=933aa5c1f69aa650f59ba783307fc7ed7cc5fafa
|
||||
|
||||
PCI/sysfs: add per pci device msi[x] irq listing (v5)
|
||||
|
||||
This patch adds a per-pci-device subdirectory in sysfs called:
|
||||
/sys/bus/pci/devices/<device>/msi_irqs
|
||||
|
||||
This sub-directory exports the set of msi vectors allocated by a given
|
||||
pci device, by creating a numbered sub-directory for each vector beneath
|
||||
msi_irqs. For each vector various attributes can be exported.
|
||||
Currently the only attribute is called mode, which tracks the
|
||||
operational mode of that vector (msi vs. msix)
|
||||
|
||||
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
||||
---
|
||||
|
||||
diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci
|
||||
index 349ecf2..34f5110 100644
|
||||
--- a/Documentation/ABI/testing/sysfs-bus-pci
|
||||
+++ b/Documentation/ABI/testing/sysfs-bus-pci
|
||||
@@ -66,6 +66,24 @@ Description:
|
||||
re-discover previously removed devices.
|
||||
Depends on CONFIG_HOTPLUG.
|
||||
|
||||
+What: /sys/bus/pci/devices/.../msi_irqs/
|
||||
+Date: September, 2011
|
||||
+Contact: Neil Horman <nhorman@tuxdriver.com>
|
||||
+Description:
|
||||
+ The /sys/devices/.../msi_irqs directory contains a variable set
|
||||
+ of sub-directories, with each sub-directory being named after a
|
||||
+ corresponding msi irq vector allocated to that device. Each
|
||||
+ numbered sub-directory N contains attributes of that irq.
|
||||
+ Note that this directory is not created for device drivers which
|
||||
+ do not support msi irqs
|
||||
+
|
||||
+What: /sys/bus/pci/devices/.../msi_irqs/<N>/mode
|
||||
+Date: September 2011
|
||||
+Contact: Neil Horman <nhorman@tuxdriver.com>
|
||||
+Description:
|
||||
+ This attribute indicates the mode that the irq vector named by
|
||||
+ the parent directory is in (msi vs. msix)
|
||||
+
|
||||
What: /sys/bus/pci/devices/.../remove
|
||||
Date: January 2009
|
||||
Contact: Linux PCI developers <linux-pci@vger.kernel.org>
|
||||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
|
||||
index 2f10328..73613e2 100644
|
||||
--- a/drivers/pci/msi.c
|
||||
+++ b/drivers/pci/msi.c
|
||||
@@ -322,6 +322,8 @@ static void free_msi_irqs(struct pci_dev *dev)
|
||||
if (list_is_last(&entry->list, &dev->msi_list))
|
||||
iounmap(entry->mask_base);
|
||||
}
|
||||
+ kobject_del(&entry->kobj);
|
||||
+ kobject_put(&entry->kobj);
|
||||
list_del(&entry->list);
|
||||
kfree(entry);
|
||||
}
|
||||
@@ -402,6 +404,98 @@ void pci_restore_msi_state(struct pci_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_restore_msi_state);
|
||||
|
||||
+
|
||||
+#define to_msi_attr(obj) container_of(obj, struct msi_attribute, attr)
|
||||
+#define to_msi_desc(obj) container_of(obj, struct msi_desc, kobj)
|
||||
+
|
||||
+struct msi_attribute {
|
||||
+ struct attribute attr;
|
||||
+ ssize_t (*show)(struct msi_desc *entry, struct msi_attribute *attr,
|
||||
+ char *buf);
|
||||
+ ssize_t (*store)(struct msi_desc *entry, struct msi_attribute *attr,
|
||||
+ const char *buf, size_t count);
|
||||
+};
|
||||
+
|
||||
+static ssize_t show_msi_mode(struct msi_desc *entry, struct msi_attribute *atr,
|
||||
+ char *buf)
|
||||
+{
|
||||
+ return sprintf(buf, "%s\n", entry->msi_attrib.is_msix ? "msix" : "msi");
|
||||
+}
|
||||
+
|
||||
+static ssize_t msi_irq_attr_show(struct kobject *kobj,
|
||||
+ struct attribute *attr, char *buf)
|
||||
+{
|
||||
+ struct msi_attribute *attribute = to_msi_attr(attr);
|
||||
+ struct msi_desc *entry = to_msi_desc(kobj);
|
||||
+
|
||||
+ if (!attribute->show)
|
||||
+ return -EIO;
|
||||
+
|
||||
+ return attribute->show(entry, attribute, buf);
|
||||
+}
|
||||
+
|
||||
+static const struct sysfs_ops msi_irq_sysfs_ops = {
|
||||
+ .show = msi_irq_attr_show,
|
||||
+};
|
||||
+
|
||||
+static struct msi_attribute mode_attribute =
|
||||
+ __ATTR(mode, S_IRUGO, show_msi_mode, NULL);
|
||||
+
|
||||
+
|
||||
+struct attribute *msi_irq_default_attrs[] = {
|
||||
+ &mode_attribute.attr,
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
+void msi_kobj_release(struct kobject *kobj)
|
||||
+{
|
||||
+ struct msi_desc *entry = to_msi_desc(kobj);
|
||||
+
|
||||
+ pci_dev_put(entry->dev);
|
||||
+}
|
||||
+
|
||||
+static struct kobj_type msi_irq_ktype = {
|
||||
+ .release = msi_kobj_release,
|
||||
+ .sysfs_ops = &msi_irq_sysfs_ops,
|
||||
+ .default_attrs = msi_irq_default_attrs,
|
||||
+};
|
||||
+
|
||||
+static int populate_msi_sysfs(struct pci_dev *pdev)
|
||||
+{
|
||||
+ struct msi_desc *entry;
|
||||
+ struct kobject *kobj;
|
||||
+ int ret;
|
||||
+ int count = 0;
|
||||
+
|
||||
+ pdev->msi_kset = kset_create_and_add("msi_irqs", NULL, &pdev->dev.kobj);
|
||||
+ if (!pdev->msi_kset)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ list_for_each_entry(entry, &pdev->msi_list, list) {
|
||||
+ kobj = &entry->kobj;
|
||||
+ kobj->kset = pdev->msi_kset;
|
||||
+ pci_dev_get(pdev);
|
||||
+ ret = kobject_init_and_add(kobj, &msi_irq_ktype, NULL,
|
||||
+ "%u", entry->irq);
|
||||
+ if (ret)
|
||||
+ goto out_unroll;
|
||||
+
|
||||
+ count++;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+out_unroll:
|
||||
+ list_for_each_entry(entry, &pdev->msi_list, list) {
|
||||
+ if (!count)
|
||||
+ break;
|
||||
+ kobject_del(&entry->kobj);
|
||||
+ kobject_put(&entry->kobj);
|
||||
+ count--;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* msi_capability_init - configure device's MSI capability structure
|
||||
* @dev: pointer to the pci_dev data structure of MSI device function
|
||||
@@ -453,6 +547,13 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ ret = populate_msi_sysfs(dev);
|
||||
+ if (ret) {
|
||||
+ msi_mask_irq(entry, mask, ~mask);
|
||||
+ free_msi_irqs(dev);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
/* Set MSI enabled bits */
|
||||
pci_intx_for_msi(dev, 0);
|
||||
msi_set_enable(dev, pos, 1);
|
||||
@@ -573,6 +674,12 @@ static int msix_capability_init(struct pci_dev *dev,
|
||||
|
||||
msix_program_entries(dev, entries);
|
||||
|
||||
+ ret = populate_msi_sysfs(dev);
|
||||
+ if (ret) {
|
||||
+ ret = 0;
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
/* Set MSI-X enabled bits and unmask the function */
|
||||
pci_intx_for_msi(dev, 0);
|
||||
dev->msix_enabled = 1;
|
||||
@@ -731,6 +838,8 @@ void pci_disable_msi(struct pci_dev *dev)
|
||||
|
||||
pci_msi_shutdown(dev);
|
||||
free_msi_irqs(dev);
|
||||
+ kset_unregister(dev->msi_kset);
|
||||
+ dev->msi_kset = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_disable_msi);
|
||||
|
||||
@@ -829,6 +938,8 @@ void pci_disable_msix(struct pci_dev *dev)
|
||||
|
||||
pci_msix_shutdown(dev);
|
||||
free_msi_irqs(dev);
|
||||
+ kset_unregister(dev->msi_kset);
|
||||
+ dev->msi_kset = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_disable_msix);
|
||||
|
||||
diff --git a/include/linux/msi.h b/include/linux/msi.h
|
||||
index 05acced..ce93a34 100644
|
||||
--- a/include/linux/msi.h
|
||||
+++ b/include/linux/msi.h
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef LINUX_MSI_H
|
||||
#define LINUX_MSI_H
|
||||
|
||||
+#include <linux/kobject.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
struct msi_msg {
|
||||
@@ -44,6 +45,8 @@ struct msi_desc {
|
||||
|
||||
/* Last set MSI message */
|
||||
struct msi_msg msg;
|
||||
+
|
||||
+ struct kobject kobj;
|
||||
};
|
||||
|
||||
/*
|
||||
diff --git a/include/linux/pci.h b/include/linux/pci.h
|
||||
index 7cda65b..84225c7 100644
|
||||
--- a/include/linux/pci.h
|
||||
+++ b/include/linux/pci.h
|
||||
@@ -336,6 +336,7 @@ struct pci_dev {
|
||||
struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
struct list_head msi_list;
|
||||
+ struct kset *msi_kset;
|
||||
#endif
|
||||
struct pci_vpd *vpd;
|
||||
#ifdef CONFIG_PCI_ATS
|
4292
utrace.patch
4292
utrace.patch
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user