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

Commit b955a910 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files
David writes:
  "Sparc fixes

   1) Revert the %pOF change, it causes regressions.

   2) Wire up io_pgetevents().

   3) Fix perf events on single-PCR sparc64 cpus.

   4) Do proper perf event throttling like arm and x86."

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
  Revert "sparc: Convert to using %pOFn instead of device_node.name"
  sparc64: Set %l4 properly on trap return after handling signals.
  sparc64: Make proc_id signed.
  sparc: Throttle perf events properly.
  sparc: Fix single-pcr perf event counter management.
  sparc: Wire up io_pgetevents system call.
  sunvdc: Remove VLA usage
parents a8861998 a06ecbfe
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ typedef struct {
	unsigned short	sock_id;	/* physical package */
	unsigned short	core_id;
	unsigned short  max_cache_id;	/* groupings of highest shared cache */
	unsigned short	proc_id;	/* strand (aka HW thread) id */
	signed short	proc_id;	/* strand (aka HW thread) id */
} cpuinfo_sparc;

DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
+2 −1
Original line number Diff line number Diff line
@@ -427,8 +427,9 @@
#define __NR_preadv2		358
#define __NR_pwritev2		359
#define __NR_statx		360
#define __NR_io_pgetevents	361

#define NR_syscalls		361
#define NR_syscalls		362

/* Bitmask values returned from kern_features system call.  */
#define KERN_FEATURE_MIXED_MODE_STACK	0x00000001
+2 −2
Original line number Diff line number Diff line
@@ -115,8 +115,8 @@ static int auxio_probe(struct platform_device *dev)
		auxio_devtype = AUXIO_TYPE_SBUS;
		size = 1;
	} else {
		printk("auxio: Unknown parent bus type [%pOFn]\n",
		       dp->parent);
		printk("auxio: Unknown parent bus type [%s]\n",
		       dp->parent->name);
		return -ENODEV;
	}
	auxio_register = of_ioremap(&dev->resource[0], 0, size, "auxio");
+22 −4
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <asm/cpudata.h>
#include <linux/uaccess.h>
#include <linux/atomic.h>
#include <linux/sched/clock.h>
#include <asm/nmi.h>
#include <asm/pcr.h>
#include <asm/cacheflush.h>
@@ -927,6 +928,8 @@ static void read_in_all_counters(struct cpu_hw_events *cpuc)
			sparc_perf_event_update(cp, &cp->hw,
						cpuc->current_idx[i]);
			cpuc->current_idx[i] = PIC_NO_INDEX;
			if (cp->hw.state & PERF_HES_STOPPED)
				cp->hw.state |= PERF_HES_ARCH;
		}
	}
}
@@ -959,10 +962,12 @@ static void calculate_single_pcr(struct cpu_hw_events *cpuc)

		enc = perf_event_get_enc(cpuc->events[i]);
		cpuc->pcr[0] &= ~mask_for_index(idx);
		if (hwc->state & PERF_HES_STOPPED)
		if (hwc->state & PERF_HES_ARCH) {
			cpuc->pcr[0] |= nop_for_index(idx);
		else
		} else {
			cpuc->pcr[0] |= event_encoding(enc, idx);
			hwc->state = 0;
		}
	}
out:
	cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
@@ -988,6 +993,9 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)

		cpuc->current_idx[i] = idx;

		if (cp->hw.state & PERF_HES_ARCH)
			continue;

		sparc_pmu_start(cp, PERF_EF_RELOAD);
	}
out:
@@ -1079,6 +1087,8 @@ static void sparc_pmu_start(struct perf_event *event, int flags)
	event->hw.state = 0;

	sparc_pmu_enable_event(cpuc, &event->hw, idx);

	perf_event_update_userpage(event);
}

static void sparc_pmu_stop(struct perf_event *event, int flags)
@@ -1371,9 +1381,9 @@ static int sparc_pmu_add(struct perf_event *event, int ef_flags)
	cpuc->events[n0] = event->hw.event_base;
	cpuc->current_idx[n0] = PIC_NO_INDEX;

	event->hw.state = PERF_HES_UPTODATE;
	event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
	if (!(ef_flags & PERF_EF_START))
		event->hw.state |= PERF_HES_STOPPED;
		event->hw.state |= PERF_HES_ARCH;

	/*
	 * If group events scheduling transaction was started,
@@ -1603,6 +1613,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
	struct perf_sample_data data;
	struct cpu_hw_events *cpuc;
	struct pt_regs *regs;
	u64 finish_clock;
	u64 start_clock;
	int i;

	if (!atomic_read(&active_events))
@@ -1616,6 +1628,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
		return NOTIFY_DONE;
	}

	start_clock = sched_clock();

	regs = args->regs;

	cpuc = this_cpu_ptr(&cpu_hw_events);
@@ -1654,6 +1668,10 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
			sparc_pmu_stop(event, 0);
	}

	finish_clock = sched_clock();

	perf_sample_event_took(finish_clock - start_clock);

	return NOTIFY_STOP;
}

+2 −2
Original line number Diff line number Diff line
@@ -41,8 +41,8 @@ static int power_probe(struct platform_device *op)

	power_reg = of_ioremap(res, 0, 0x4, "power");

	printk(KERN_INFO "%pOFn: Control reg at %llx\n",
	       op->dev.of_node, res->start);
	printk(KERN_INFO "%s: Control reg at %llx\n",
	       op->dev.of_node->name, res->start);

	if (has_button_interrupt(irq, op->dev.of_node)) {
		if (request_irq(irq,
Loading