Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
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
This commit is contained in:
commit
b955a910d7
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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" */
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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]" */
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
|
|
@ -84,8 +84,9 @@ __handle_signal:
|
|||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||
sethi %hi(0xf << 20), %l4
|
||||
and %l1, %l4, %l4
|
||||
ba,pt %xcc, __handle_preemption_continue
|
||||
andn %l1, %l4, %l1
|
||||
ba,pt %xcc, __handle_preemption_continue
|
||||
srl %l4, 20, %l4
|
||||
|
||||
/* When returning from a NMI (%pil==15) interrupt we want to
|
||||
* avoid running softirqs, doing IRQ tracing, preempting, etc.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -91,7 +91,7 @@ sys_call_table32:
|
|||
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
||||
/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
||||
.word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range, compat_sys_preadv2, compat_sys_pwritev2
|
||||
/*360*/ .word sys_statx
|
||||
/*360*/ .word sys_statx, compat_sys_io_pgetevents
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
|
@ -173,4 +173,4 @@ sys_call_table:
|
|||
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
||||
/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
||||
.word sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
|
||||
/*360*/ .word sys_statx
|
||||
/*360*/ .word sys_statx, sys_io_pgetevents
|
||||
|
|
|
@ -36,6 +36,10 @@ MODULE_VERSION(DRV_MODULE_VERSION);
|
|||
#define VDC_TX_RING_SIZE 512
|
||||
#define VDC_DEFAULT_BLK_SIZE 512
|
||||
|
||||
#define MAX_XFER_BLKS (128 * 1024)
|
||||
#define MAX_XFER_SIZE (MAX_XFER_BLKS / VDC_DEFAULT_BLK_SIZE)
|
||||
#define MAX_RING_COOKIES ((MAX_XFER_BLKS / PAGE_SIZE) + 2)
|
||||
|
||||
#define WAITING_FOR_LINK_UP 0x01
|
||||
#define WAITING_FOR_TX_SPACE 0x02
|
||||
#define WAITING_FOR_GEN_CMD 0x04
|
||||
|
@ -450,7 +454,7 @@ static int __send_request(struct request *req)
|
|||
{
|
||||
struct vdc_port *port = req->rq_disk->private_data;
|
||||
struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
|
||||
struct scatterlist sg[port->ring_cookies];
|
||||
struct scatterlist sg[MAX_RING_COOKIES];
|
||||
struct vdc_req_entry *rqe;
|
||||
struct vio_disk_desc *desc;
|
||||
unsigned int map_perm;
|
||||
|
@ -458,6 +462,9 @@ static int __send_request(struct request *req)
|
|||
u64 len;
|
||||
u8 op;
|
||||
|
||||
if (WARN_ON(port->ring_cookies > MAX_RING_COOKIES))
|
||||
return -EINVAL;
|
||||
|
||||
map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO;
|
||||
|
||||
if (rq_data_dir(req) == READ) {
|
||||
|
@ -984,9 +991,8 @@ static int vdc_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)
|
|||
goto err_out_free_port;
|
||||
|
||||
port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE;
|
||||
port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size);
|
||||
port->ring_cookies = ((port->max_xfer_size *
|
||||
port->vdisk_block_size) / PAGE_SIZE) + 2;
|
||||
port->max_xfer_size = MAX_XFER_SIZE;
|
||||
port->ring_cookies = MAX_RING_COOKIES;
|
||||
|
||||
err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port);
|
||||
if (err)
|
||||
|
|
Loading…
Reference in New Issue