Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0651c7f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull powerpc fixes from Michael Ellerman:
 "Two fixes for nasty kexec/kdump crashes in certain configurations.

  A couple of minor fixes for the new TIDR code.

  A fix for an oops in a CXL error handling path.

  Thanks to: Andrew Donnellan, Christophe Lombard, David Gibson, Mahesh
  Salgaonkar, Vaibhav Jain"

* tag 'powerpc-4.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc: Do not assign thread.tidr if already assigned
  powerpc: Avoid signed to unsigned conversion in set_thread_tidr()
  powerpc/kexec: Fix kexec/kdump in P9 guest kernels
  powerpc/powernv: Fix kexec crashes caused by tlbie tracing
  cxl: Check if vphb exists before iterating over AFU devices
parents ae753ee2 7e4d4233
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -623,7 +623,9 @@ BEGIN_FTR_SECTION
	 * NOTE, we rely on r0 being 0 from above.
	 */
	mtspr	SPRN_IAMR,r0
BEGIN_FTR_SECTION_NESTED(42)
	mtspr	SPRN_AMOR,r0
END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42)
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)

	/* save regs for local vars on new stack.
+9 −3
Original line number Diff line number Diff line
@@ -1569,16 +1569,22 @@ void arch_release_task_struct(struct task_struct *t)
 */
int set_thread_tidr(struct task_struct *t)
{
	int rc;

	if (!cpu_has_feature(CPU_FTR_ARCH_300))
		return -EINVAL;

	if (t != current)
		return -EINVAL;

	t->thread.tidr = assign_thread_tidr();
	if (t->thread.tidr < 0)
		return t->thread.tidr;
	if (t->thread.tidr)
		return 0;

	rc = assign_thread_tidr();
	if (rc < 0)
		return rc;

	t->thread.tidr = rc;
	mtspr(SPRN_TIDR, t->thread.tidr);

	return 0;
+12 −3
Original line number Diff line number Diff line
@@ -47,7 +47,8 @@

DEFINE_RAW_SPINLOCK(native_tlbie_lock);

static inline void __tlbie(unsigned long vpn, int psize, int apsize, int ssize)
static inline unsigned long  ___tlbie(unsigned long vpn, int psize,
						int apsize, int ssize)
{
	unsigned long va;
	unsigned int penc;
@@ -100,7 +101,15 @@ static inline void __tlbie(unsigned long vpn, int psize, int apsize, int ssize)
			     : "memory");
		break;
	}
	trace_tlbie(0, 0, va, 0, 0, 0, 0);
	return va;
}

static inline void __tlbie(unsigned long vpn, int psize, int apsize, int ssize)
{
	unsigned long rb;

	rb = ___tlbie(vpn, psize, apsize, ssize);
	trace_tlbie(0, 0, rb, 0, 0, 0, 0);
}

static inline void __tlbiel(unsigned long vpn, int psize, int apsize, int ssize)
@@ -652,7 +661,7 @@ static void native_hpte_clear(void)
		if (hpte_v & HPTE_V_VALID) {
			hpte_decode(hptep, slot, &psize, &apsize, &ssize, &vpn);
			hptep->v = 0;
			__tlbie(vpn, psize, apsize, ssize);
			___tlbie(vpn, psize, apsize, ssize);
		}
	}

+10 −2
Original line number Diff line number Diff line
@@ -2083,6 +2083,9 @@ static pci_ers_result_t cxl_vphb_error_detected(struct cxl_afu *afu,
	/* There should only be one entry, but go through the list
	 * anyway
	 */
	if (afu->phb == NULL)
		return result;

	list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
		if (!afu_dev->driver)
			continue;
@@ -2124,7 +2127,6 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
			 * Tell the AFU drivers; but we don't care what they
			 * say, we're going away.
			 */
			if (afu->phb != NULL)
			cxl_vphb_error_detected(afu, state);
		}
		return PCI_ERS_RESULT_DISCONNECT;
@@ -2265,6 +2267,9 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev)
		if (cxl_afu_select_best_mode(afu))
			goto err;

		if (afu->phb == NULL)
			continue;

		list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
			/* Reset the device context.
			 * TODO: make this less disruptive
@@ -2327,6 +2332,9 @@ static void cxl_pci_resume(struct pci_dev *pdev)
	for (i = 0; i < adapter->slices; i++) {
		afu = adapter->afu[i];

		if (afu->phb == NULL)
			continue;

		list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
			if (afu_dev->driver && afu_dev->driver->err_handler &&
			    afu_dev->driver->err_handler->resume)