aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-10-16 12:53:31 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-10-16 12:53:31 -0400
commitb955a910d7fde877e068f68fada5aac02e3a073d (patch)
tree277d2a7265fde3a96c0c743476efb25fe7563d80
parenta886199872db1d65e88e2a5b015016ab75b5b168 (diff)
parenta06ecbfe784ceb22e56ae3cd75fe77138e7cfa0b (diff)
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
-rw-r--r--arch/sparc/include/asm/cpudata_64.h2
-rw-r--r--arch/sparc/include/uapi/asm/unistd.h3
-rw-r--r--arch/sparc/kernel/auxio_64.c4
-rw-r--r--arch/sparc/kernel/perf_event.c26
-rw-r--r--arch/sparc/kernel/power.c4
-rw-r--r--arch/sparc/kernel/prom_32.c26
-rw-r--r--arch/sparc/kernel/prom_64.c68
-rw-r--r--arch/sparc/kernel/rtrap_64.S3
-rw-r--r--arch/sparc/kernel/systbls_32.S2
-rw-r--r--arch/sparc/kernel/systbls_64.S4
-rw-r--r--drivers/block/sunvdc.c14
11 files changed, 91 insertions, 65 deletions
diff --git a/arch/sparc/include/asm/cpudata_64.h b/arch/sparc/include/asm/cpudata_64.h
index 666d6b5c0440..9c3fc03abe9a 100644
--- a/arch/sparc/include/asm/cpudata_64.h
+++ b/arch/sparc/include/asm/cpudata_64.h
@@ -28,7 +28,7 @@ typedef struct {
28 unsigned short sock_id; /* physical package */ 28 unsigned short sock_id; /* physical package */
29 unsigned short core_id; 29 unsigned short core_id;
30 unsigned short max_cache_id; /* groupings of highest shared cache */ 30 unsigned short max_cache_id; /* groupings of highest shared cache */
31 unsigned short proc_id; /* strand (aka HW thread) id */ 31 signed short proc_id; /* strand (aka HW thread) id */
32} cpuinfo_sparc; 32} cpuinfo_sparc;
33 33
34DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); 34DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h
index 09acf0ddec10..45b4bf1875e6 100644
--- a/arch/sparc/include/uapi/asm/unistd.h
+++ b/arch/sparc/include/uapi/asm/unistd.h
@@ -427,8 +427,9 @@
427#define __NR_preadv2 358 427#define __NR_preadv2 358
428#define __NR_pwritev2 359 428#define __NR_pwritev2 359
429#define __NR_statx 360 429#define __NR_statx 360
430#define __NR_io_pgetevents 361
430 431
431#define NR_syscalls 361 432#define NR_syscalls 362
432 433
433/* Bitmask values returned from kern_features system call. */ 434/* Bitmask values returned from kern_features system call. */
434#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 435#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
diff --git a/arch/sparc/kernel/auxio_64.c b/arch/sparc/kernel/auxio_64.c
index cc42225c20f3..4e8f56c3793c 100644
--- a/arch/sparc/kernel/auxio_64.c
+++ b/arch/sparc/kernel/auxio_64.c
@@ -115,8 +115,8 @@ static int auxio_probe(struct platform_device *dev)
115 auxio_devtype = AUXIO_TYPE_SBUS; 115 auxio_devtype = AUXIO_TYPE_SBUS;
116 size = 1; 116 size = 1;
117 } else { 117 } else {
118 printk("auxio: Unknown parent bus type [%pOFn]\n", 118 printk("auxio: Unknown parent bus type [%s]\n",
119 dp->parent); 119 dp->parent->name);
120 return -ENODEV; 120 return -ENODEV;
121 } 121 }
122 auxio_register = of_ioremap(&dev->resource[0], 0, size, "auxio"); 122 auxio_register = of_ioremap(&dev->resource[0], 0, size, "auxio");
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c
index d3149baaa33c..67b3e6b3ce5d 100644
--- a/arch/sparc/kernel/perf_event.c
+++ b/arch/sparc/kernel/perf_event.c
@@ -24,6 +24,7 @@
24#include <asm/cpudata.h> 24#include <asm/cpudata.h>
25#include <linux/uaccess.h> 25#include <linux/uaccess.h>
26#include <linux/atomic.h> 26#include <linux/atomic.h>
27#include <linux/sched/clock.h>
27#include <asm/nmi.h> 28#include <asm/nmi.h>
28#include <asm/pcr.h> 29#include <asm/pcr.h>
29#include <asm/cacheflush.h> 30#include <asm/cacheflush.h>
@@ -927,6 +928,8 @@ static void read_in_all_counters(struct cpu_hw_events *cpuc)
927 sparc_perf_event_update(cp, &cp->hw, 928 sparc_perf_event_update(cp, &cp->hw,
928 cpuc->current_idx[i]); 929 cpuc->current_idx[i]);
929 cpuc->current_idx[i] = PIC_NO_INDEX; 930 cpuc->current_idx[i] = PIC_NO_INDEX;
931 if (cp->hw.state & PERF_HES_STOPPED)
932 cp->hw.state |= PERF_HES_ARCH;
930 } 933 }
931 } 934 }
932} 935}
@@ -959,10 +962,12 @@ static void calculate_single_pcr(struct cpu_hw_events *cpuc)
959 962
960 enc = perf_event_get_enc(cpuc->events[i]); 963 enc = perf_event_get_enc(cpuc->events[i]);
961 cpuc->pcr[0] &= ~mask_for_index(idx); 964 cpuc->pcr[0] &= ~mask_for_index(idx);
962 if (hwc->state & PERF_HES_STOPPED) 965 if (hwc->state & PERF_HES_ARCH) {
963 cpuc->pcr[0] |= nop_for_index(idx); 966 cpuc->pcr[0] |= nop_for_index(idx);
964 else 967 } else {
965 cpuc->pcr[0] |= event_encoding(enc, idx); 968 cpuc->pcr[0] |= event_encoding(enc, idx);
969 hwc->state = 0;
970 }
966 } 971 }
967out: 972out:
968 cpuc->pcr[0] |= cpuc->event[0]->hw.config_base; 973 cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
@@ -988,6 +993,9 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)
988 993
989 cpuc->current_idx[i] = idx; 994 cpuc->current_idx[i] = idx;
990 995
996 if (cp->hw.state & PERF_HES_ARCH)
997 continue;
998
991 sparc_pmu_start(cp, PERF_EF_RELOAD); 999 sparc_pmu_start(cp, PERF_EF_RELOAD);
992 } 1000 }
993out: 1001out:
@@ -1079,6 +1087,8 @@ static void sparc_pmu_start(struct perf_event *event, int flags)
1079 event->hw.state = 0; 1087 event->hw.state = 0;
1080 1088
1081 sparc_pmu_enable_event(cpuc, &event->hw, idx); 1089 sparc_pmu_enable_event(cpuc, &event->hw, idx);
1090
1091 perf_event_update_userpage(event);
1082} 1092}
1083 1093
1084static void sparc_pmu_stop(struct perf_event *event, int flags) 1094static 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 cpuc->events[n0] = event->hw.event_base; 1381 cpuc->events[n0] = event->hw.event_base;
1372 cpuc->current_idx[n0] = PIC_NO_INDEX; 1382 cpuc->current_idx[n0] = PIC_NO_INDEX;
1373 1383
1374 event->hw.state = PERF_HES_UPTODATE; 1384 event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
1375 if (!(ef_flags & PERF_EF_START)) 1385 if (!(ef_flags & PERF_EF_START))
1376 event->hw.state |= PERF_HES_STOPPED; 1386 event->hw.state |= PERF_HES_ARCH;
1377 1387
1378 /* 1388 /*
1379 * If group events scheduling transaction was started, 1389 * If group events scheduling transaction was started,
@@ -1603,6 +1613,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
1603 struct perf_sample_data data; 1613 struct perf_sample_data data;
1604 struct cpu_hw_events *cpuc; 1614 struct cpu_hw_events *cpuc;
1605 struct pt_regs *regs; 1615 struct pt_regs *regs;
1616 u64 finish_clock;
1617 u64 start_clock;
1606 int i; 1618 int i;
1607 1619
1608 if (!atomic_read(&active_events)) 1620 if (!atomic_read(&active_events))
@@ -1616,6 +1628,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
1616 return NOTIFY_DONE; 1628 return NOTIFY_DONE;
1617 } 1629 }
1618 1630
1631 start_clock = sched_clock();
1632
1619 regs = args->regs; 1633 regs = args->regs;
1620 1634
1621 cpuc = this_cpu_ptr(&cpu_hw_events); 1635 cpuc = this_cpu_ptr(&cpu_hw_events);
@@ -1654,6 +1668,10 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
1654 sparc_pmu_stop(event, 0); 1668 sparc_pmu_stop(event, 0);
1655 } 1669 }
1656 1670
1671 finish_clock = sched_clock();
1672
1673 perf_sample_event_took(finish_clock - start_clock);
1674
1657 return NOTIFY_STOP; 1675 return NOTIFY_STOP;
1658} 1676}
1659 1677
diff --git a/arch/sparc/kernel/power.c b/arch/sparc/kernel/power.c
index d941875dd718..92627abce311 100644
--- a/arch/sparc/kernel/power.c
+++ b/arch/sparc/kernel/power.c
@@ -41,8 +41,8 @@ static int power_probe(struct platform_device *op)
41 41
42 power_reg = of_ioremap(res, 0, 0x4, "power"); 42 power_reg = of_ioremap(res, 0, 0x4, "power");
43 43
44 printk(KERN_INFO "%pOFn: Control reg at %llx\n", 44 printk(KERN_INFO "%s: Control reg at %llx\n",
45 op->dev.of_node, res->start); 45 op->dev.of_node->name, res->start);
46 46
47 if (has_button_interrupt(irq, op->dev.of_node)) { 47 if (has_button_interrupt(irq, op->dev.of_node)) {
48 if (request_irq(irq, 48 if (request_irq(irq,
diff --git a/arch/sparc/kernel/prom_32.c b/arch/sparc/kernel/prom_32.c
index 17c87d29ff20..b51cbb9e87dc 100644
--- a/arch/sparc/kernel/prom_32.c
+++ b/arch/sparc/kernel/prom_32.c
@@ -68,8 +68,8 @@ static void __init sparc32_path_component(struct device_node *dp, char *tmp_buf)
68 return; 68 return;
69 69
70 regs = rprop->value; 70 regs = rprop->value;
71 sprintf(tmp_buf, "%pOFn@%x,%x", 71 sprintf(tmp_buf, "%s@%x,%x",
72 dp, 72 dp->name,
73 regs->which_io, regs->phys_addr); 73 regs->which_io, regs->phys_addr);
74} 74}
75 75
@@ -84,8 +84,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf)
84 return; 84 return;
85 85
86 regs = prop->value; 86 regs = prop->value;
87 sprintf(tmp_buf, "%pOFn@%x,%x", 87 sprintf(tmp_buf, "%s@%x,%x",
88 dp, 88 dp->name,
89 regs->which_io, 89 regs->which_io,
90 regs->phys_addr); 90 regs->phys_addr);
91} 91}
@@ -104,13 +104,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf)
104 regs = prop->value; 104 regs = prop->value;
105 devfn = (regs->phys_hi >> 8) & 0xff; 105 devfn = (regs->phys_hi >> 8) & 0xff;
106 if (devfn & 0x07) { 106 if (devfn & 0x07) {
107 sprintf(tmp_buf, "%pOFn@%x,%x", 107 sprintf(tmp_buf, "%s@%x,%x",
108 dp, 108 dp->name,
109 devfn >> 3, 109 devfn >> 3,
110 devfn & 0x07); 110 devfn & 0x07);
111 } else { 111 } else {
112 sprintf(tmp_buf, "%pOFn@%x", 112 sprintf(tmp_buf, "%s@%x",
113 dp, 113 dp->name,
114 devfn >> 3); 114 devfn >> 3);
115 } 115 }
116} 116}
@@ -127,8 +127,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf)
127 127
128 regs = prop->value; 128 regs = prop->value;
129 129
130 sprintf(tmp_buf, "%pOFn@%x,%x", 130 sprintf(tmp_buf, "%s@%x,%x",
131 dp, 131 dp->name,
132 regs->which_io, regs->phys_addr); 132 regs->which_io, regs->phys_addr);
133} 133}
134 134
@@ -167,8 +167,8 @@ static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf)
167 return; 167 return;
168 device = prop->value; 168 device = prop->value;
169 169
170 sprintf(tmp_buf, "%pOFn:%d:%d@%x,%x", 170 sprintf(tmp_buf, "%s:%d:%d@%x,%x",
171 dp, *vendor, *device, 171 dp->name, *vendor, *device,
172 *intr, reg0); 172 *intr, reg0);
173} 173}
174 174
@@ -201,7 +201,7 @@ char * __init build_path_component(struct device_node *dp)
201 tmp_buf[0] = '\0'; 201 tmp_buf[0] = '\0';
202 __build_path_component(dp, tmp_buf); 202 __build_path_component(dp, tmp_buf);
203 if (tmp_buf[0] == '\0') 203 if (tmp_buf[0] == '\0')
204 snprintf(tmp_buf, sizeof(tmp_buf), "%pOFn", dp); 204 strcpy(tmp_buf, dp->name);
205 205
206 n = prom_early_alloc(strlen(tmp_buf) + 1); 206 n = prom_early_alloc(strlen(tmp_buf) + 1);
207 strcpy(n, tmp_buf); 207 strcpy(n, tmp_buf);
diff --git a/arch/sparc/kernel/prom_64.c b/arch/sparc/kernel/prom_64.c
index 6220411ce8fc..baeaeed64993 100644
--- a/arch/sparc/kernel/prom_64.c
+++ b/arch/sparc/kernel/prom_64.c
@@ -82,8 +82,8 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)
82 82
83 regs = rprop->value; 83 regs = rprop->value;
84 if (!of_node_is_root(dp->parent)) { 84 if (!of_node_is_root(dp->parent)) {
85 sprintf(tmp_buf, "%pOFn@%x,%x", 85 sprintf(tmp_buf, "%s@%x,%x",
86 dp, 86 dp->name,
87 (unsigned int) (regs->phys_addr >> 32UL), 87 (unsigned int) (regs->phys_addr >> 32UL),
88 (unsigned int) (regs->phys_addr & 0xffffffffUL)); 88 (unsigned int) (regs->phys_addr & 0xffffffffUL));
89 return; 89 return;
@@ -97,17 +97,17 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)
97 const char *prefix = (type == 0) ? "m" : "i"; 97 const char *prefix = (type == 0) ? "m" : "i";
98 98
99 if (low_bits) 99 if (low_bits)
100 sprintf(tmp_buf, "%pOFn@%s%x,%x", 100 sprintf(tmp_buf, "%s@%s%x,%x",
101 dp, prefix, 101 dp->name, prefix,
102 high_bits, low_bits); 102 high_bits, low_bits);
103 else 103 else
104 sprintf(tmp_buf, "%pOFn@%s%x", 104 sprintf(tmp_buf, "%s@%s%x",
105 dp, 105 dp->name,
106 prefix, 106 prefix,
107 high_bits); 107 high_bits);
108 } else if (type == 12) { 108 } else if (type == 12) {
109 sprintf(tmp_buf, "%pOFn@%x", 109 sprintf(tmp_buf, "%s@%x",
110 dp, high_bits); 110 dp->name, high_bits);
111 } 111 }
112} 112}
113 113
@@ -122,8 +122,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)
122 122
123 regs = prop->value; 123 regs = prop->value;
124 if (!of_node_is_root(dp->parent)) { 124 if (!of_node_is_root(dp->parent)) {
125 sprintf(tmp_buf, "%pOFn@%x,%x", 125 sprintf(tmp_buf, "%s@%x,%x",
126 dp, 126 dp->name,
127 (unsigned int) (regs->phys_addr >> 32UL), 127 (unsigned int) (regs->phys_addr >> 32UL),
128 (unsigned int) (regs->phys_addr & 0xffffffffUL)); 128 (unsigned int) (regs->phys_addr & 0xffffffffUL));
129 return; 129 return;
@@ -138,8 +138,8 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)
138 if (tlb_type >= cheetah) 138 if (tlb_type >= cheetah)
139 mask = 0x7fffff; 139 mask = 0x7fffff;
140 140
141 sprintf(tmp_buf, "%pOFn@%x,%x", 141 sprintf(tmp_buf, "%s@%x,%x",
142 dp, 142 dp->name,
143 *(u32 *)prop->value, 143 *(u32 *)prop->value,
144 (unsigned int) (regs->phys_addr & mask)); 144 (unsigned int) (regs->phys_addr & mask));
145 } 145 }
@@ -156,8 +156,8 @@ static void __init sbus_path_component(struct device_node *dp, char *tmp_buf)
156 return; 156 return;
157 157
158 regs = prop->value; 158 regs = prop->value;
159 sprintf(tmp_buf, "%pOFn@%x,%x", 159 sprintf(tmp_buf, "%s@%x,%x",
160 dp, 160 dp->name,
161 regs->which_io, 161 regs->which_io,
162 regs->phys_addr); 162 regs->phys_addr);
163} 163}
@@ -176,13 +176,13 @@ static void __init pci_path_component(struct device_node *dp, char *tmp_buf)
176 regs = prop->value; 176 regs = prop->value;
177 devfn = (regs->phys_hi >> 8) & 0xff; 177 devfn = (regs->phys_hi >> 8) & 0xff;
178 if (devfn & 0x07) { 178 if (devfn & 0x07) {
179 sprintf(tmp_buf, "%pOFn@%x,%x", 179 sprintf(tmp_buf, "%s@%x,%x",
180 dp, 180 dp->name,
181 devfn >> 3, 181 devfn >> 3,
182 devfn & 0x07); 182 devfn & 0x07);
183 } else { 183 } else {
184 sprintf(tmp_buf, "%pOFn@%x", 184 sprintf(tmp_buf, "%s@%x",
185 dp, 185 dp->name,
186 devfn >> 3); 186 devfn >> 3);
187 } 187 }
188} 188}
@@ -203,8 +203,8 @@ static void __init upa_path_component(struct device_node *dp, char *tmp_buf)
203 if (!prop) 203 if (!prop)
204 return; 204 return;
205 205
206 sprintf(tmp_buf, "%pOFn@%x,%x", 206 sprintf(tmp_buf, "%s@%x,%x",
207 dp, 207 dp->name,
208 *(u32 *) prop->value, 208 *(u32 *) prop->value,
209 (unsigned int) (regs->phys_addr & 0xffffffffUL)); 209 (unsigned int) (regs->phys_addr & 0xffffffffUL));
210} 210}
@@ -221,7 +221,7 @@ static void __init vdev_path_component(struct device_node *dp, char *tmp_buf)
221 221
222 regs = prop->value; 222 regs = prop->value;
223 223
224 sprintf(tmp_buf, "%pOFn@%x", dp, *regs); 224 sprintf(tmp_buf, "%s@%x", dp->name, *regs);
225} 225}
226 226
227/* "name@addrhi,addrlo" */ 227/* "name@addrhi,addrlo" */
@@ -236,8 +236,8 @@ static void __init ebus_path_component(struct device_node *dp, char *tmp_buf)
236 236
237 regs = prop->value; 237 regs = prop->value;
238 238
239 sprintf(tmp_buf, "%pOFn@%x,%x", 239 sprintf(tmp_buf, "%s@%x,%x",
240 dp, 240 dp->name,
241 (unsigned int) (regs->phys_addr >> 32UL), 241 (unsigned int) (regs->phys_addr >> 32UL),
242 (unsigned int) (regs->phys_addr & 0xffffffffUL)); 242 (unsigned int) (regs->phys_addr & 0xffffffffUL));
243} 243}
@@ -257,8 +257,8 @@ static void __init i2c_path_component(struct device_node *dp, char *tmp_buf)
257 /* This actually isn't right... should look at the #address-cells 257 /* This actually isn't right... should look at the #address-cells
258 * property of the i2c bus node etc. etc. 258 * property of the i2c bus node etc. etc.
259 */ 259 */
260 sprintf(tmp_buf, "%pOFn@%x,%x", 260 sprintf(tmp_buf, "%s@%x,%x",
261 dp, regs[0], regs[1]); 261 dp->name, regs[0], regs[1]);
262} 262}
263 263
264/* "name@reg0[,reg1]" */ 264/* "name@reg0[,reg1]" */
@@ -274,11 +274,11 @@ static void __init usb_path_component(struct device_node *dp, char *tmp_buf)
274 regs = prop->value; 274 regs = prop->value;
275 275
276 if (prop->length == sizeof(u32) || regs[1] == 1) { 276 if (prop->length == sizeof(u32) || regs[1] == 1) {
277 sprintf(tmp_buf, "%pOFn@%x", 277 sprintf(tmp_buf, "%s@%x",
278 dp, regs[0]); 278 dp->name, regs[0]);
279 } else { 279 } else {
280 sprintf(tmp_buf, "%pOFn@%x,%x", 280 sprintf(tmp_buf, "%s@%x,%x",
281 dp, regs[0], regs[1]); 281 dp->name, regs[0], regs[1]);
282 } 282 }
283} 283}
284 284
@@ -295,11 +295,11 @@ static void __init ieee1394_path_component(struct device_node *dp, char *tmp_buf
295 regs = prop->value; 295 regs = prop->value;
296 296
297 if (regs[2] || regs[3]) { 297 if (regs[2] || regs[3]) {
298 sprintf(tmp_buf, "%pOFn@%08x%08x,%04x%08x", 298 sprintf(tmp_buf, "%s@%08x%08x,%04x%08x",
299 dp, regs[0], regs[1], regs[2], regs[3]); 299 dp->name, regs[0], regs[1], regs[2], regs[3]);
300 } else { 300 } else {
301 sprintf(tmp_buf, "%pOFn@%08x%08x", 301 sprintf(tmp_buf, "%s@%08x%08x",
302 dp, regs[0], regs[1]); 302 dp->name, regs[0], regs[1]);
303 } 303 }
304} 304}
305 305
@@ -361,7 +361,7 @@ char * __init build_path_component(struct device_node *dp)
361 tmp_buf[0] = '\0'; 361 tmp_buf[0] = '\0';
362 __build_path_component(dp, tmp_buf); 362 __build_path_component(dp, tmp_buf);
363 if (tmp_buf[0] == '\0') 363 if (tmp_buf[0] == '\0')
364 snprintf(tmp_buf, sizeof(tmp_buf), "%pOFn", dp); 364 strcpy(tmp_buf, dp->name);
365 365
366 n = prom_early_alloc(strlen(tmp_buf) + 1); 366 n = prom_early_alloc(strlen(tmp_buf) + 1);
367 strcpy(n, tmp_buf); 367 strcpy(n, tmp_buf);
diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S
index f6528884a2c8..4073e2b87dd0 100644
--- a/arch/sparc/kernel/rtrap_64.S
+++ b/arch/sparc/kernel/rtrap_64.S
@@ -84,8 +84,9 @@ __handle_signal:
84 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 84 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
85 sethi %hi(0xf << 20), %l4 85 sethi %hi(0xf << 20), %l4
86 and %l1, %l4, %l4 86 and %l1, %l4, %l4
87 andn %l1, %l4, %l1
87 ba,pt %xcc, __handle_preemption_continue 88 ba,pt %xcc, __handle_preemption_continue
88 andn %l1, %l4, %l1 89 srl %l4, 20, %l4
89 90
90 /* When returning from a NMI (%pil==15) interrupt we want to 91 /* When returning from a NMI (%pil==15) interrupt we want to
91 * avoid running softirqs, doing IRQ tracing, preempting, etc. 92 * avoid running softirqs, doing IRQ tracing, preempting, etc.
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S
index 12bee14b552c..621a363098ec 100644
--- a/arch/sparc/kernel/systbls_32.S
+++ b/arch/sparc/kernel/systbls_32.S
@@ -90,4 +90,4 @@ sys_call_table:
90/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf 90/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
91/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen 91/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
92/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2 92/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
93/*360*/ .long sys_statx 93/*360*/ .long sys_statx, sys_io_pgetevents
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S
index 387ef993880a..bb68c805b891 100644
--- a/arch/sparc/kernel/systbls_64.S
+++ b/arch/sparc/kernel/systbls_64.S
@@ -91,7 +91,7 @@ sys_call_table32:
91 .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf 91 .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
92/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen 92/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
93 .word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range, compat_sys_preadv2, compat_sys_pwritev2 93 .word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range, compat_sys_preadv2, compat_sys_pwritev2
94/*360*/ .word sys_statx 94/*360*/ .word sys_statx, compat_sys_io_pgetevents
95 95
96#endif /* CONFIG_COMPAT */ 96#endif /* CONFIG_COMPAT */
97 97
@@ -173,4 +173,4 @@ sys_call_table:
173 .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf 173 .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
174/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen 174/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
175 .word sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2 175 .word sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
176/*360*/ .word sys_statx 176/*360*/ .word sys_statx, sys_io_pgetevents
diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
index 5ca56bfae63c..f68e9baffad7 100644
--- a/drivers/block/sunvdc.c
+++ b/drivers/block/sunvdc.c
@@ -36,6 +36,10 @@ MODULE_VERSION(DRV_MODULE_VERSION);
36#define VDC_TX_RING_SIZE 512 36#define VDC_TX_RING_SIZE 512
37#define VDC_DEFAULT_BLK_SIZE 512 37#define VDC_DEFAULT_BLK_SIZE 512
38 38
39#define MAX_XFER_BLKS (128 * 1024)
40#define MAX_XFER_SIZE (MAX_XFER_BLKS / VDC_DEFAULT_BLK_SIZE)
41#define MAX_RING_COOKIES ((MAX_XFER_BLKS / PAGE_SIZE) + 2)
42
39#define WAITING_FOR_LINK_UP 0x01 43#define WAITING_FOR_LINK_UP 0x01
40#define WAITING_FOR_TX_SPACE 0x02 44#define WAITING_FOR_TX_SPACE 0x02
41#define WAITING_FOR_GEN_CMD 0x04 45#define WAITING_FOR_GEN_CMD 0x04
@@ -450,7 +454,7 @@ static int __send_request(struct request *req)
450{ 454{
451 struct vdc_port *port = req->rq_disk->private_data; 455 struct vdc_port *port = req->rq_disk->private_data;
452 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 456 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
453 struct scatterlist sg[port->ring_cookies]; 457 struct scatterlist sg[MAX_RING_COOKIES];
454 struct vdc_req_entry *rqe; 458 struct vdc_req_entry *rqe;
455 struct vio_disk_desc *desc; 459 struct vio_disk_desc *desc;
456 unsigned int map_perm; 460 unsigned int map_perm;
@@ -458,6 +462,9 @@ static int __send_request(struct request *req)
458 u64 len; 462 u64 len;
459 u8 op; 463 u8 op;
460 464
465 if (WARN_ON(port->ring_cookies > MAX_RING_COOKIES))
466 return -EINVAL;
467
461 map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO; 468 map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO;
462 469
463 if (rq_data_dir(req) == READ) { 470 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 goto err_out_free_port; 991 goto err_out_free_port;
985 992
986 port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE; 993 port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE;
987 port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size); 994 port->max_xfer_size = MAX_XFER_SIZE;
988 port->ring_cookies = ((port->max_xfer_size * 995 port->ring_cookies = MAX_RING_COOKIES;
989 port->vdisk_block_size) / PAGE_SIZE) + 2;
990 996
991 err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port); 997 err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port);
992 if (err) 998 if (err)