Commit b955a910 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

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
parents a8861998 a06ecbfe
...@@ -28,7 +28,7 @@ typedef struct { ...@@ -28,7 +28,7 @@ typedef struct {
unsigned short sock_id; /* physical package */ unsigned short sock_id; /* physical package */
unsigned short core_id; unsigned short core_id;
unsigned short max_cache_id; /* groupings of highest shared cache */ 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; } cpuinfo_sparc;
DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
......
...@@ -427,8 +427,9 @@ ...@@ -427,8 +427,9 @@
#define __NR_preadv2 358 #define __NR_preadv2 358
#define __NR_pwritev2 359 #define __NR_pwritev2 359
#define __NR_statx 360 #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. */ /* Bitmask values returned from kern_features system call. */
#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 #define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
......
...@@ -115,8 +115,8 @@ static int auxio_probe(struct platform_device *dev) ...@@ -115,8 +115,8 @@ static int auxio_probe(struct platform_device *dev)
auxio_devtype = AUXIO_TYPE_SBUS; auxio_devtype = AUXIO_TYPE_SBUS;
size = 1; size = 1;
} else { } else {
printk("auxio: Unknown parent bus type [%pOFn]\n", printk("auxio: Unknown parent bus type [%s]\n",
dp->parent); dp->parent->name);
return -ENODEV; return -ENODEV;
} }
auxio_register = of_ioremap(&dev->resource[0], 0, size, "auxio"); auxio_register = of_ioremap(&dev->resource[0], 0, size, "auxio");
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <asm/cpudata.h> #include <asm/cpudata.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/sched/clock.h>
#include <asm/nmi.h> #include <asm/nmi.h>
#include <asm/pcr.h> #include <asm/pcr.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
...@@ -927,6 +928,8 @@ static void read_in_all_counters(struct cpu_hw_events *cpuc) ...@@ -927,6 +928,8 @@ static void read_in_all_counters(struct cpu_hw_events *cpuc)
sparc_perf_event_update(cp, &cp->hw, sparc_perf_event_update(cp, &cp->hw,
cpuc->current_idx[i]); cpuc->current_idx[i]);
cpuc->current_idx[i] = PIC_NO_INDEX; 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) ...@@ -959,10 +962,12 @@ static void calculate_single_pcr(struct cpu_hw_events *cpuc)
enc = perf_event_get_enc(cpuc->events[i]); enc = perf_event_get_enc(cpuc->events[i]);
cpuc->pcr[0] &= ~mask_for_index(idx); 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); cpuc->pcr[0] |= nop_for_index(idx);
else } else {
cpuc->pcr[0] |= event_encoding(enc, idx); cpuc->pcr[0] |= event_encoding(enc, idx);
hwc->state = 0;
}
} }
out: out:
cpuc->pcr[0] |= cpuc->event[0]->hw.config_base; cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
...@@ -988,6 +993,9 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc) ...@@ -988,6 +993,9 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)
cpuc->current_idx[i] = idx; cpuc->current_idx[i] = idx;
if (cp->hw.state & PERF_HES_ARCH)
continue;
sparc_pmu_start(cp, PERF_EF_RELOAD); sparc_pmu_start(cp, PERF_EF_RELOAD);
} }
out: out:
...@@ -1079,6 +1087,8 @@ static void sparc_pmu_start(struct perf_event *event, int flags) ...@@ -1079,6 +1087,8 @@ static void sparc_pmu_start(struct perf_event *event, int flags)
event->hw.state = 0; event->hw.state = 0;
sparc_pmu_enable_event(cpuc, &event->hw, idx); sparc_pmu_enable_event(cpuc, &event->hw, idx);
perf_event_update_userpage(event);
} }
static void sparc_pmu_stop(struct perf_event *event, int flags) 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) ...@@ -1371,9 +1381,9 @@ static int sparc_pmu_add(struct perf_event *event, int ef_flags)
cpuc->events[n0] = event->hw.event_base; cpuc->events[n0] = event->hw.event_base;
cpuc->current_idx[n0] = PIC_NO_INDEX; 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)) 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, * If group events scheduling transaction was started,
...@@ -1603,6 +1613,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, ...@@ -1603,6 +1613,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
struct perf_sample_data data; struct perf_sample_data data;
struct cpu_hw_events *cpuc; struct cpu_hw_events *cpuc;
struct pt_regs *regs; struct pt_regs *regs;
u64 finish_clock;
u64 start_clock;
int i; int i;
if (!atomic_read(&active_events)) if (!atomic_read(&active_events))
...@@ -1616,6 +1628,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, ...@@ -1616,6 +1628,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
return NOTIFY_DONE; return NOTIFY_DONE;
} }
start_clock = sched_clock();
regs = args->regs; regs = args->regs;
cpuc = this_cpu_ptr(&cpu_hw_events); cpuc = this_cpu_ptr(&cpu_hw_events);
...@@ -1654,6 +1668,10 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, ...@@ -1654,6 +1668,10 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
sparc_pmu_stop(event, 0); sparc_pmu_stop(event, 0);
} }
finish_clock = sched_clock();
perf_sample_event_took(finish_clock - start_clock);
return NOTIFY_STOP; return NOTIFY_STOP;
} }
......
...@@ -41,8 +41,8 @@ static int power_probe(struct platform_device *op) ...@@ -41,8 +41,8 @@ static int power_probe(struct platform_device *op)
power_reg = of_ioremap(res, 0, 0x4, "power"); power_reg = of_ioremap(res, 0, 0x4, "power");
printk(KERN_INFO "%pOFn: Control reg at %llx\n", printk(KERN_INFO "%s: Control reg at %llx\n",
op->dev.of_node, res->start); op->dev.of_node->name, res->start);
if (has_button_interrupt(irq, op->dev.of_node)) { if (has_button_interrupt(irq, op->dev.of_node)) {
if (request_irq(irq, if (request_irq(irq,
......
...@@ -68,8 +68,8 @@ static void __init sparc32_path_component(struct device_node *dp, char *tmp_buf) ...@@ -68,8 +68,8 @@ static void __init sparc32_path_component(struct device_node *dp, char *tmp_buf)
return; return;
regs = rprop->value; regs = rprop->value;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
regs->which_io, regs->phys_addr); regs->which_io, regs->phys_addr);
} }
...@@ -84,8 +84,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf) ...@@ -84,8 +84,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf)
return; return;
regs = prop->value; regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
regs->which_io, regs->which_io,
regs->phys_addr); regs->phys_addr);
} }
...@@ -104,13 +104,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf) ...@@ -104,13 +104,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
devfn = (regs->phys_hi >> 8) & 0xff; devfn = (regs->phys_hi >> 8) & 0xff;
if (devfn & 0x07) { if (devfn & 0x07) {
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
devfn >> 3, devfn >> 3,
devfn & 0x07); devfn & 0x07);
} else { } else {
sprintf(tmp_buf, "%pOFn@%x", sprintf(tmp_buf, "%s@%x",
dp, dp->name,
devfn >> 3); devfn >> 3);
} }
} }
...@@ -127,8 +127,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf) ...@@ -127,8 +127,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
regs->which_io, regs->phys_addr); regs->which_io, regs->phys_addr);
} }
...@@ -167,8 +167,8 @@ static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf) ...@@ -167,8 +167,8 @@ static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf)
return; return;
device = prop->value; device = prop->value;
sprintf(tmp_buf, "%pOFn:%d:%d@%x,%x", sprintf(tmp_buf, "%s:%d:%d@%x,%x",
dp, *vendor, *device, dp->name, *vendor, *device,
*intr, reg0); *intr, reg0);
} }
...@@ -201,7 +201,7 @@ char * __init build_path_component(struct device_node *dp) ...@@ -201,7 +201,7 @@ char * __init build_path_component(struct device_node *dp)
tmp_buf[0] = '\0'; tmp_buf[0] = '\0';
__build_path_component(dp, tmp_buf); __build_path_component(dp, tmp_buf);
if (tmp_buf[0] == '\0') 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); n = prom_early_alloc(strlen(tmp_buf) + 1);
strcpy(n, tmp_buf); strcpy(n, tmp_buf);
......
...@@ -82,8 +82,8 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf) ...@@ -82,8 +82,8 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)
regs = rprop->value; regs = rprop->value;
if (!of_node_is_root(dp->parent)) { if (!of_node_is_root(dp->parent)) {
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
(unsigned int) (regs->phys_addr >> 32UL), (unsigned int) (regs->phys_addr >> 32UL),
(unsigned int) (regs->phys_addr & 0xffffffffUL)); (unsigned int) (regs->phys_addr & 0xffffffffUL));
return; return;
...@@ -97,17 +97,17 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf) ...@@ -97,17 +97,17 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)
const char *prefix = (type == 0) ? "m" : "i"; const char *prefix = (type == 0) ? "m" : "i";
if (low_bits) if (low_bits)
sprintf(tmp_buf, "%pOFn@%s%x,%x", sprintf(tmp_buf, "%s@%s%x,%x",
dp, prefix, dp->name, prefix,
high_bits, low_bits); high_bits, low_bits);
else else
sprintf(tmp_buf, "%pOFn@%s%x", sprintf(tmp_buf, "%s@%s%x",
dp, dp->name,
prefix, prefix,
high_bits); high_bits);
} else if (type == 12) { } else if (type == 12) {
sprintf(tmp_buf, "%pOFn@%x", sprintf(tmp_buf, "%s@%x",
dp, high_bits); dp->name, high_bits);
} }
} }
...@@ -122,8 +122,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf) ...@@ -122,8 +122,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
if (!of_node_is_root(dp->parent)) { if (!of_node_is_root(dp->parent)) {
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
(unsigned int) (regs->phys_addr >> 32UL), (unsigned int) (regs->phys_addr >> 32UL),
(unsigned int) (regs->phys_addr & 0xffffffffUL)); (unsigned int) (regs->phys_addr & 0xffffffffUL));
return; return;
...@@ -138,8 +138,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf) ...@@ -138,8 +138,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)
if (tlb_type >= cheetah) if (tlb_type >= cheetah)
mask = 0x7fffff; mask = 0x7fffff;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
*(u32 *)prop->value, *(u32 *)prop->value,
(unsigned int) (regs->phys_addr & mask)); (unsigned int) (regs->phys_addr & mask));
} }
...@@ -156,8 +156,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf) ...@@ -156,8 +156,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf)
return; return;
regs = prop->value; regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
regs->which_io, regs->which_io,
regs->phys_addr); regs->phys_addr);
} }
...@@ -176,13 +176,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf) ...@@ -176,13 +176,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
devfn = (regs->phys_hi >> 8) & 0xff; devfn = (regs->phys_hi >> 8) & 0xff;
if (devfn & 0x07) { if (devfn & 0x07) {
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
devfn >> 3, devfn >> 3,
devfn & 0x07); devfn & 0x07);
} else { } else {
sprintf(tmp_buf, "%pOFn@%x", sprintf(tmp_buf, "%s@%x",
dp, dp->name,
devfn >> 3); devfn >> 3);
} }
} }
...@@ -203,8 +203,8 @@ static void __init upa_path_component(struct device_node *dp, char *tmp_buf) ...@@ -203,8 +203,8 @@ static void __init upa_path_component(struct device_node *dp, char *tmp_buf)
if (!prop) if (!prop)
return; return;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
*(u32 *) prop->value, *(u32 *) prop->value,
(unsigned int) (regs->phys_addr & 0xffffffffUL)); (unsigned int) (regs->phys_addr & 0xffffffffUL));
} }
...@@ -221,7 +221,7 @@ static void __init vdev_path_component(struct device_node *dp, char *tmp_buf) ...@@ -221,7 +221,7 @@ static void __init vdev_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x", dp, *regs); sprintf(tmp_buf, "%s@%x", dp->name, *regs);
} }
/* "name@addrhi,addrlo" */ /* "name@addrhi,addrlo" */
...@@ -236,8 +236,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf) ...@@ -236,8 +236,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, dp->name,
(unsigned int) (regs->phys_addr >> 32UL), (unsigned int) (regs->phys_addr >> 32UL),
(unsigned int) (regs->phys_addr & 0xffffffffUL)); (unsigned int) (regs->phys_addr & 0xffffffffUL));
} }
...@@ -257,8 +257,8 @@ static void __init i2c_path_component(struct device_node *dp, char *tmp_buf) ...@@ -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 /* This actually isn't right... should look at the #address-cells
* property of the i2c bus node etc. etc. * property of the i2c bus node etc. etc.
*/ */
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, regs[0], regs[1]); dp->name, regs[0], regs[1]);
} }
/* "name@reg0[,reg1]" */ /* "name@reg0[,reg1]" */
...@@ -274,11 +274,11 @@ static void __init usb_path_component(struct device_node *dp, char *tmp_buf) ...@@ -274,11 +274,11 @@ static void __init usb_path_component(struct device_node *dp, char *tmp_buf)
regs = prop->value; regs = prop->value;
if (prop->length == sizeof(u32) || regs[1] == 1) { if (prop->length == sizeof(u32) || regs[1] == 1) {
sprintf(tmp_buf, "%pOFn@%x", sprintf(tmp_buf, "%s@%x",
dp, regs[0]); dp->name, regs[0]);
} else { } else {
sprintf(tmp_buf, "%pOFn@%x,%x", sprintf(tmp_buf, "%s@%x,%x",
dp, regs[0], regs[1]); dp->name, regs[0], regs[1]);
} }
} }
...@@ -295,11 +295,11 @@ static void __init ieee1394_path_component(struct device_node *dp, char *tmp_buf ...@@ -295,11 +295,11 @@ static void __init ieee1394_path_component(struct device_node *dp, char *tmp_buf
regs = prop->value; regs = prop->value;
if (regs[2] || regs[3]) { if (regs[2] || regs[3]) {
sprintf(tmp_buf, "%pOFn@%08x%08x,%04x%08x", sprintf(tmp_buf, "%s@%08x%08x,%04x%08x",
dp, regs[0], regs[1], regs[2], regs[3]); dp->name, regs[0], regs[1], regs[2], regs[3]);
} else { } else {
sprintf(tmp_buf, "%pOFn@%08x%08x", sprintf(tmp_buf, "%s@%08x%08x",
dp, regs[0], regs[1]); dp->name, regs[0], regs[1]);
} }
} }
...@@ -361,7 +361,7 @@ char * __init build_path_component(struct device_node *dp) ...@@ -361,7 +361,7 @@ char * __init build_path_component(struct device_node *dp)
tmp_buf[0] = '\0'; tmp_buf[0] = '\0';
__build_path_component(dp, tmp_buf); __build_path_component(dp, tmp_buf);
if (tmp_buf[0] == '\0') 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); n = prom_early_alloc(strlen(tmp_buf) + 1);
strcpy(n, tmp_buf); strcpy(n, tmp_buf);
......
...@@ -84,8 +84,9 @@ __handle_signal: ...@@ -84,8 +84,9 @@ __handle_signal:
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
sethi %hi(0xf << 20), %l4 sethi %hi(0xf << 20), %l4
and %l1, %l4, %l4 and %l1, %l4, %l4
andn %l1, %l4, %l1
ba,pt %xcc, __handle_preemption_continue 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 /* When returning from a NMI (%pil==15) interrupt we want to
* avoid running softirqs, doing IRQ tracing, preempting, etc. * avoid running softirqs, doing IRQ tracing, preempting, etc.
......
...@@ -90,4 +90,4 @@ sys_call_table: ...@@ -90,4 +90,4 @@ sys_call_table:
/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf /*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 /*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 /*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: ...@@ -91,7 +91,7 @@ sys_call_table32:
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen /*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 .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 */ #endif /* CONFIG_COMPAT */
...@@ -173,4 +173,4 @@ sys_call_table: ...@@ -173,4 +173,4 @@ sys_call_table:
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen /*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 .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); ...@@ -36,6 +36,10 @@ MODULE_VERSION(DRV_MODULE_VERSION);
#define VDC_TX_RING_SIZE 512 #define VDC_TX_RING_SIZE 512
#define VDC_DEFAULT_BLK_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_LINK_UP 0x01
#define WAITING_FOR_TX_SPACE 0x02 #define WAITING_FOR_TX_SPACE 0x02
#define WAITING_FOR_GEN_CMD 0x04 #define WAITING_FOR_GEN_CMD 0x04
...@@ -450,7 +454,7 @@ static int __send_request(struct request *req) ...@@ -450,7 +454,7 @@ static int __send_request(struct request *req)
{ {
struct vdc_port *port = req->rq_disk->private_data; struct vdc_port *port = req->rq_disk->private_data;
struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 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 vdc_req_entry *rqe;
struct vio_disk_desc *desc; struct vio_disk_desc *desc;
unsigned int map_perm; unsigned int map_perm;
...@@ -458,6 +462,9 @@ static int __send_request(struct request *req) ...@@ -458,6 +462,9 @@ static int __send_request(struct request *req)
u64 len; u64 len;
u8 op; u8 op;
if (WARN_ON(port->ring_cookies > MAX_RING_COOKIES))
return -EINVAL;
map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO; map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO;
if (rq_data_dir(req) == READ) { 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) ...@@ -984,9 +991,8 @@ static int vdc_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)
goto err_out_free_port; goto err_out_free_port;
port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE; port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE;
port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size); port->max_xfer_size = MAX_XFER_SIZE;
port->ring_cookies = ((port->max_xfer_size * port->ring_cookies = MAX_RING_COOKIES;
port->vdisk_block_size) / PAGE_SIZE) + 2;
err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port); err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port);
if (err) if (err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment