Skip to content

Commit 180d89f

Browse files
committed
Merge tag 'powerpc-4.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux
Pull powerpc fixes from Michael Ellerman: - build fix for SMP=n in book3s_xics.c - fix for Daniel's pci_controller_ops on powernv. - revert the TM syscall abort patch for now. - CPU affinity fix from Nathan. - two EEH fixes from Gavin. - fix for CR corruption from Sam. - selftest build fix. * tag 'powerpc-4.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux: powerpc/powernv: Restore non-volatile CRs after nap powerpc/eeh: Delay probing EEH device during hotplug powerpc/eeh: Fix race condition in pcibios_set_pcie_reset_state() powerpc/pseries: Correct cpu affinity for dlpar added cpus selftests/powerpc: Fix the pmu install rule Revert "powerpc/tm: Abort syscalls in active transactions" powerpc/powernv: Fix early pci_controller_ops loading. powerpc/kvm: Fix SMP=n build error in book3s_xics.c
2 parents 6c3c1eb + 0aab374 commit 180d89f

File tree

10 files changed

+37
-47
lines changed

10 files changed

+37
-47
lines changed

Documentation/powerpc/transactional_memory.txt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,23 +74,22 @@ Causes of transaction aborts
7474
Syscalls
7575
========
7676

77-
Syscalls made from within an active transaction will not be performed and the
78-
transaction will be doomed by the kernel with the failure code TM_CAUSE_SYSCALL
79-
| TM_CAUSE_PERSISTENT.
77+
Performing syscalls from within transaction is not recommended, and can lead
78+
to unpredictable results.
8079

81-
Syscalls made from within a suspended transaction are performed as normal and
82-
the transaction is not explicitly doomed by the kernel. However, what the
83-
kernel does to perform the syscall may result in the transaction being doomed
84-
by the hardware. The syscall is performed in suspended mode so any side
85-
effects will be persistent, independent of transaction success or failure. No
86-
guarantees are provided by the kernel about which syscalls will affect
87-
transaction success.
80+
Syscalls do not by design abort transactions, but beware: The kernel code will
81+
not be running in transactional state. The effect of syscalls will always
82+
remain visible, but depending on the call they may abort your transaction as a
83+
side-effect, read soon-to-be-aborted transactional data that should not remain
84+
invisible, etc. If you constantly retry a transaction that constantly aborts
85+
itself by calling a syscall, you'll have a livelock & make no progress.
8886

89-
Care must be taken when relying on syscalls to abort during active transactions
90-
if the calls are made via a library. Libraries may cache values (which may
91-
give the appearance of success) or perform operations that cause transaction
92-
failure before entering the kernel (which may produce different failure codes).
93-
Examples are glibc's getpid() and lazy symbol resolution.
87+
Simple syscalls (e.g. sigprocmask()) "could" be OK. Even things like write()
88+
from, say, printf() should be OK as long as the kernel does not access any
89+
memory that was accessed transactionally.
90+
91+
Consider any syscalls that happen to work as debug-only -- not recommended for
92+
production use. Best to queue them up till after the transaction is over.
9493

9594

9695
Signals
@@ -177,7 +176,8 @@ kernel aborted a transaction:
177176
TM_CAUSE_RESCHED Thread was rescheduled.
178177
TM_CAUSE_TLBI Software TLB invalid.
179178
TM_CAUSE_FAC_UNAV FP/VEC/VSX unavailable trap.
180-
TM_CAUSE_SYSCALL Syscall from active transaction.
179+
TM_CAUSE_SYSCALL Currently unused; future syscalls that must abort
180+
transactions for consistency will use this.
181181
TM_CAUSE_SIGNAL Signal delivered.
182182
TM_CAUSE_MISC Currently unused.
183183
TM_CAUSE_ALIGNMENT Alignment fault.

arch/powerpc/include/uapi/asm/tm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define TM_CAUSE_RESCHED 0xde
1212
#define TM_CAUSE_TLBI 0xdc
1313
#define TM_CAUSE_FAC_UNAV 0xda
14-
#define TM_CAUSE_SYSCALL 0xd8
14+
#define TM_CAUSE_SYSCALL 0xd8 /* future use */
1515
#define TM_CAUSE_MISC 0xd6 /* future use */
1616
#define TM_CAUSE_SIGNAL 0xd4
1717
#define TM_CAUSE_ALIGNMENT 0xd2

arch/powerpc/kernel/eeh.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,21 +749,24 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state stat
749749
eeh_unfreeze_pe(pe, false);
750750
eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED);
751751
eeh_pe_dev_traverse(pe, eeh_restore_dev_state, dev);
752+
eeh_pe_state_clear(pe, EEH_PE_ISOLATED);
752753
break;
753754
case pcie_hot_reset:
755+
eeh_pe_state_mark(pe, EEH_PE_ISOLATED);
754756
eeh_ops->set_option(pe, EEH_OPT_FREEZE_PE);
755757
eeh_pe_dev_traverse(pe, eeh_disable_and_save_dev_state, dev);
756758
eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED);
757759
eeh_ops->reset(pe, EEH_RESET_HOT);
758760
break;
759761
case pcie_warm_reset:
762+
eeh_pe_state_mark(pe, EEH_PE_ISOLATED);
760763
eeh_ops->set_option(pe, EEH_OPT_FREEZE_PE);
761764
eeh_pe_dev_traverse(pe, eeh_disable_and_save_dev_state, dev);
762765
eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED);
763766
eeh_ops->reset(pe, EEH_RESET_FUNDAMENTAL);
764767
break;
765768
default:
766-
eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED);
769+
eeh_pe_state_clear(pe, EEH_PE_ISOLATED | EEH_PE_CFG_BLOCKED);
767770
return -EINVAL;
768771
};
769772

@@ -1058,6 +1061,9 @@ void eeh_add_device_early(struct pci_dn *pdn)
10581061
if (!edev || !eeh_enabled())
10591062
return;
10601063

1064+
if (!eeh_has_flag(EEH_PROBE_MODE_DEVTREE))
1065+
return;
1066+
10611067
/* USB Bus children of PCI devices will not have BUID's */
10621068
phb = edev->phb;
10631069
if (NULL == phb ||
@@ -1112,6 +1118,9 @@ void eeh_add_device_late(struct pci_dev *dev)
11121118
return;
11131119
}
11141120

1121+
if (eeh_has_flag(EEH_PROBE_MODE_DEV))
1122+
eeh_ops->probe(pdn, NULL);
1123+
11151124
/*
11161125
* The EEH cache might not be removed correctly because of
11171126
* unbalanced kref to the device during unplug time, which

arch/powerpc/kernel/entry_64.S

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include <asm/ftrace.h>
3535
#include <asm/hw_irq.h>
3636
#include <asm/context_tracking.h>
37-
#include <asm/tm.h>
3837

3938
/*
4039
* System calls.
@@ -146,24 +145,6 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
146145
andi. r11,r10,_TIF_SYSCALL_DOTRACE
147146
bne syscall_dotrace
148147
.Lsyscall_dotrace_cont:
149-
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
150-
BEGIN_FTR_SECTION
151-
b 1f
152-
END_FTR_SECTION_IFCLR(CPU_FTR_TM)
153-
extrdi. r11, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */
154-
beq+ 1f
155-
156-
/* Doom the transaction and don't perform the syscall: */
157-
mfmsr r11
158-
li r12, 1
159-
rldimi r11, r12, MSR_TM_LG, 63-MSR_TM_LG
160-
mtmsrd r11, 0
161-
li r11, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
162-
TABORT(R11)
163-
164-
b .Lsyscall_exit
165-
1:
166-
#endif
167148
cmpldi 0,r0,NR_syscalls
168149
bge- syscall_enosys
169150

arch/powerpc/kernel/idle_power7.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,9 +501,11 @@ BEGIN_FTR_SECTION
501501
CHECK_HMI_INTERRUPT
502502
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
503503
ld r1,PACAR1(r13)
504+
ld r6,_CCR(r1)
504505
ld r4,_MSR(r1)
505506
ld r5,_NIP(r1)
506507
addi r1,r1,INT_FRAME_SIZE
508+
mtcr r6
507509
mtspr SPRN_SRR1,r4
508510
mtspr SPRN_SRR0,r5
509511
rfid

arch/powerpc/kvm/book3s_xics.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <linux/err.h>
1313
#include <linux/gfp.h>
1414
#include <linux/anon_inodes.h>
15+
#include <linux/spinlock.h>
1516

1617
#include <asm/uaccess.h>
1718
#include <asm/kvm_book3s.h>
@@ -20,7 +21,6 @@
2021
#include <asm/xics.h>
2122
#include <asm/debug.h>
2223
#include <asm/time.h>
23-
#include <asm/spinlock.h>
2424

2525
#include <linux/debugfs.h>
2626
#include <linux/seq_file.h>

arch/powerpc/platforms/powernv/pci-ioda.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2693,7 +2693,6 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
26932693
hose->last_busno = 0xff;
26942694
}
26952695
hose->private_data = phb;
2696-
hose->controller_ops = pnv_pci_controller_ops;
26972696
phb->hub_id = hub_id;
26982697
phb->opal_id = phb_id;
26992698
phb->type = ioda_type;
@@ -2812,6 +2811,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
28122811
pnv_pci_controller_ops.enable_device_hook = pnv_pci_enable_device_hook;
28132812
pnv_pci_controller_ops.window_alignment = pnv_pci_window_alignment;
28142813
pnv_pci_controller_ops.reset_secondary_bus = pnv_pci_reset_secondary_bus;
2814+
hose->controller_ops = pnv_pci_controller_ops;
28152815

28162816
#ifdef CONFIG_PCI_IOV
28172817
ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources;

arch/powerpc/platforms/pseries/dlpar.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,10 @@ static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
412412
if (rc)
413413
return -EINVAL;
414414

415+
rc = dlpar_acquire_drc(drc_index);
416+
if (rc)
417+
return -EINVAL;
418+
415419
parent = of_find_node_by_path("/cpus");
416420
if (!parent)
417421
return -ENODEV;
@@ -422,12 +426,6 @@ static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
422426

423427
of_node_put(parent);
424428

425-
rc = dlpar_acquire_drc(drc_index);
426-
if (rc) {
427-
dlpar_free_cc_nodes(dn);
428-
return -EINVAL;
429-
}
430-
431429
rc = dlpar_attach_node(dn);
432430
if (rc) {
433431
dlpar_release_drc(drc_index);

tools/testing/selftests/powerpc/pmu/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ override define EMIT_TESTS
2626
$(MAKE) -s -C ebb emit_tests
2727
endef
2828

29-
DEFAULT_INSTALL := $(INSTALL_RULE)
29+
DEFAULT_INSTALL_RULE := $(INSTALL_RULE)
3030
override define INSTALL_RULE
3131
$(DEFAULT_INSTALL_RULE)
3232
$(MAKE) -C ebb install

tools/testing/selftests/powerpc/tm/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
TEST_PROGS := tm-resched-dscr tm-syscall
1+
TEST_PROGS := tm-resched-dscr
22

33
all: $(TEST_PROGS)
44

0 commit comments

Comments
 (0)