Skip to content

Commit

Permalink
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Greg Kroah-Hartman committed Oct 16, 2018
2 parents a886199 + a06ecbf commit b955a91
Show file tree
Hide file tree
Showing 11 changed files with 91 additions and 65 deletions.
2 changes: 1 addition & 1 deletion arch/sparc/include/asm/cpudata_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion arch/sparc/include/uapi/asm/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions arch/sparc/kernel/auxio_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
26 changes: 22 additions & 4 deletions arch/sparc/kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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;
}
}
}
Expand Down Expand Up @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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))
Expand All @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions arch/sparc/kernel/power.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
26 changes: 13 additions & 13 deletions arch/sparc/kernel/prom_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ static void __init sparc32_path_component(struct device_node *dp, char *tmp_buf)
return;

regs = rprop->value;
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
regs->which_io, regs->phys_addr);
}

Expand All @@ -84,8 +84,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf)
return;

regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
regs->which_io,
regs->phys_addr);
}
Expand All @@ -104,13 +104,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value;
devfn = (regs->phys_hi >> 8) & 0xff;
if (devfn & 0x07) {
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
devfn >> 3,
devfn & 0x07);
} else {
sprintf(tmp_buf, "%pOFn@%x",
dp,
sprintf(tmp_buf, "%s@%x",
dp->name,
devfn >> 3);
}
}
Expand All @@ -127,8 +127,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf)

regs = prop->value;

sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
regs->which_io, regs->phys_addr);
}

Expand Down Expand Up @@ -167,8 +167,8 @@ static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf)
return;
device = prop->value;

sprintf(tmp_buf, "%pOFn:%d:%d@%x,%x",
dp, *vendor, *device,
sprintf(tmp_buf, "%s:%d:%d@%x,%x",
dp->name, *vendor, *device,
*intr, reg0);
}

Expand Down Expand Up @@ -201,7 +201,7 @@ char * __init build_path_component(struct device_node *dp)
tmp_buf[0] = '\0';
__build_path_component(dp, tmp_buf);
if (tmp_buf[0] == '\0')
snprintf(tmp_buf, sizeof(tmp_buf), "%pOFn", dp);
strcpy(tmp_buf, dp->name);

n = prom_early_alloc(strlen(tmp_buf) + 1);
strcpy(n, tmp_buf);
Expand Down
68 changes: 34 additions & 34 deletions arch/sparc/kernel/prom_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)

regs = rprop->value;
if (!of_node_is_root(dp->parent)) {
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
(unsigned int) (regs->phys_addr >> 32UL),
(unsigned int) (regs->phys_addr & 0xffffffffUL));
return;
Expand All @@ -97,17 +97,17 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)
const char *prefix = (type == 0) ? "m" : "i";

if (low_bits)
sprintf(tmp_buf, "%pOFn@%s%x,%x",
dp, prefix,
sprintf(tmp_buf, "%s@%s%x,%x",
dp->name, prefix,
high_bits, low_bits);
else
sprintf(tmp_buf, "%pOFn@%s%x",
dp,
sprintf(tmp_buf, "%s@%s%x",
dp->name,
prefix,
high_bits);
} else if (type == 12) {
sprintf(tmp_buf, "%pOFn@%x",
dp, high_bits);
sprintf(tmp_buf, "%s@%x",
dp->name, high_bits);
}
}

Expand All @@ -122,8 +122,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)

regs = prop->value;
if (!of_node_is_root(dp->parent)) {
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
(unsigned int) (regs->phys_addr >> 32UL),
(unsigned int) (regs->phys_addr & 0xffffffffUL));
return;
Expand All @@ -138,8 +138,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)
if (tlb_type >= cheetah)
mask = 0x7fffff;

sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
*(u32 *)prop->value,
(unsigned int) (regs->phys_addr & mask));
}
Expand All @@ -156,8 +156,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf)
return;

regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
regs->which_io,
regs->phys_addr);
}
Expand All @@ -176,13 +176,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value;
devfn = (regs->phys_hi >> 8) & 0xff;
if (devfn & 0x07) {
sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
devfn >> 3,
devfn & 0x07);
} else {
sprintf(tmp_buf, "%pOFn@%x",
dp,
sprintf(tmp_buf, "%s@%x",
dp->name,
devfn >> 3);
}
}
Expand All @@ -203,8 +203,8 @@ static void __init upa_path_component(struct device_node *dp, char *tmp_buf)
if (!prop)
return;

sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
*(u32 *) prop->value,
(unsigned int) (regs->phys_addr & 0xffffffffUL));
}
Expand All @@ -221,7 +221,7 @@ static void __init vdev_path_component(struct device_node *dp, char *tmp_buf)

regs = prop->value;

sprintf(tmp_buf, "%pOFn@%x", dp, *regs);
sprintf(tmp_buf, "%s@%x", dp->name, *regs);
}

/* "name@addrhi,addrlo" */
Expand All @@ -236,8 +236,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf)

regs = prop->value;

sprintf(tmp_buf, "%pOFn@%x,%x",
dp,
sprintf(tmp_buf, "%s@%x,%x",
dp->name,
(unsigned int) (regs->phys_addr >> 32UL),
(unsigned int) (regs->phys_addr & 0xffffffffUL));
}
Expand All @@ -257,8 +257,8 @@ static void __init i2c_path_component(struct device_node *dp, char *tmp_buf)
/* This actually isn't right... should look at the #address-cells
* property of the i2c bus node etc. etc.
*/
sprintf(tmp_buf, "%pOFn@%x,%x",
dp, regs[0], regs[1]);
sprintf(tmp_buf, "%s@%x,%x",
dp->name, regs[0], regs[1]);
}

/* "name@reg0[,reg1]" */
Expand All @@ -274,11 +274,11 @@ static void __init usb_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value;

if (prop->length == sizeof(u32) || regs[1] == 1) {
sprintf(tmp_buf, "%pOFn@%x",
dp, regs[0]);
sprintf(tmp_buf, "%s@%x",
dp->name, regs[0]);
} else {
sprintf(tmp_buf, "%pOFn@%x,%x",
dp, regs[0], regs[1]);
sprintf(tmp_buf, "%s@%x,%x",
dp->name, regs[0], regs[1]);
}
}

Expand All @@ -295,11 +295,11 @@ static void __init ieee1394_path_component(struct device_node *dp, char *tmp_buf
regs = prop->value;

if (regs[2] || regs[3]) {
sprintf(tmp_buf, "%pOFn@%08x%08x,%04x%08x",
dp, regs[0], regs[1], regs[2], regs[3]);
sprintf(tmp_buf, "%s@%08x%08x,%04x%08x",
dp->name, regs[0], regs[1], regs[2], regs[3]);
} else {
sprintf(tmp_buf, "%pOFn@%08x%08x",
dp, regs[0], regs[1]);
sprintf(tmp_buf, "%s@%08x%08x",
dp->name, regs[0], regs[1]);
}
}

Expand Down Expand Up @@ -361,7 +361,7 @@ char * __init build_path_component(struct device_node *dp)
tmp_buf[0] = '\0';
__build_path_component(dp, tmp_buf);
if (tmp_buf[0] == '\0')
snprintf(tmp_buf, sizeof(tmp_buf), "%pOFn", dp);
strcpy(tmp_buf, dp->name);

n = prom_early_alloc(strlen(tmp_buf) + 1);
strcpy(n, tmp_buf);
Expand Down
3 changes: 2 additions & 1 deletion arch/sparc/kernel/rtrap_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,9 @@ __handle_signal:
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
sethi %hi(0xf << 20), %l4
and %l1, %l4, %l4
andn %l1, %l4, %l1
ba,pt %xcc, __handle_preemption_continue
andn %l1, %l4, %l1
srl %l4, 20, %l4

/* When returning from a NMI (%pil==15) interrupt we want to
* avoid running softirqs, doing IRQ tracing, preempting, etc.
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/kernel/systbls_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,4 @@ sys_call_table:
/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
/*360*/ .long sys_statx
/*360*/ .long sys_statx, sys_io_pgetevents
Loading

0 comments on commit b955a91

Please sign in to comment.