Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 's390-5.19-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Alexander Gordeev:

- Fix perf stat accounting for cryptography counters when multiple
events are installed concurrently.

- Prevent installation of unsupported perf events for cryptography
counters.

- Treat perf events cpum_cf/CPU_CYCLES/ and cpu_cf/INSTRUCTIONS/
identical to basic events CPU_CYCLES" and INSTRUCTIONS, since they
address the same hardware.

- Restore kcrash operation which was broken by commit 5d8de293c224
("vmcore: convert copy_oldmem_page() to take an iov_iter").

* tag 's390-5.19-4' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/pai: Fix multiple concurrent event installation
s390/pai: Prevent invalid event number for pai_crypto PMU
s390/cpumf: Handle events cycles and instructions identical
s390/crash: make copy_oldmem_page() return number of bytes copied
s390/crash: add missing iterator advance in copy_oldmem_page()

+45 -7
+9 -1
arch/s390/kernel/crash_dump.c
··· 219 219 unsigned long src; 220 220 int rc; 221 221 222 + if (!(iter_is_iovec(iter) || iov_iter_is_kvec(iter))) 223 + return -EINVAL; 224 + /* Multi-segment iterators are not supported */ 225 + if (iter->nr_segs > 1) 226 + return -EINVAL; 222 227 if (!csize) 223 228 return 0; 224 229 src = pfn_to_phys(pfn) + offset; ··· 233 228 rc = copy_oldmem_user(iter->iov->iov_base, src, csize); 234 229 else 235 230 rc = copy_oldmem_kernel(iter->kvec->iov_base, src, csize); 236 - return rc; 231 + if (rc < 0) 232 + return rc; 233 + iov_iter_advance(iter, csize); 234 + return csize; 237 235 } 238 236 239 237 /*
+21 -1
arch/s390/kernel/perf_cpum_cf.c
··· 516 516 return err; 517 517 } 518 518 519 + /* Events CPU_CYLCES and INSTRUCTIONS can be submitted with two different 520 + * attribute::type values: 521 + * - PERF_TYPE_HARDWARE: 522 + * - pmu->type: 523 + * Handle both type of invocations identical. They address the same hardware. 524 + * The result is different when event modifiers exclude_kernel and/or 525 + * exclude_user are also set. 526 + */ 527 + static int cpumf_pmu_event_type(struct perf_event *event) 528 + { 529 + u64 ev = event->attr.config; 530 + 531 + if (cpumf_generic_events_basic[PERF_COUNT_HW_CPU_CYCLES] == ev || 532 + cpumf_generic_events_basic[PERF_COUNT_HW_INSTRUCTIONS] == ev || 533 + cpumf_generic_events_user[PERF_COUNT_HW_CPU_CYCLES] == ev || 534 + cpumf_generic_events_user[PERF_COUNT_HW_INSTRUCTIONS] == ev) 535 + return PERF_TYPE_HARDWARE; 536 + return PERF_TYPE_RAW; 537 + } 538 + 519 539 static int cpumf_pmu_event_init(struct perf_event *event) 520 540 { 521 541 unsigned int type = event->attr.type; ··· 545 525 err = __hw_perf_event_init(event, type); 546 526 else if (event->pmu->type == type) 547 527 /* Registered as unknown PMU */ 548 - err = __hw_perf_event_init(event, PERF_TYPE_RAW); 528 + err = __hw_perf_event_init(event, cpumf_pmu_event_type(event)); 549 529 else 550 530 return -ENOENT; 551 531
+15 -5
arch/s390/kernel/perf_pai_crypto.c
··· 193 193 /* PAI crypto PMU registered as PERF_TYPE_RAW, check event type */ 194 194 if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type) 195 195 return -ENOENT; 196 - /* PAI crypto event must be valid */ 197 - if (a->config > PAI_CRYPTO_BASE + paicrypt_cnt) 196 + /* PAI crypto event must be in valid range */ 197 + if (a->config < PAI_CRYPTO_BASE || 198 + a->config > PAI_CRYPTO_BASE + paicrypt_cnt) 198 199 return -EINVAL; 199 200 /* Allow only CPU wide operation, no process context for now. */ 200 201 if (event->hw.target || event->cpu == -1) ··· 209 208 if (rc) 210 209 return rc; 211 210 211 + /* Event initialization sets last_tag to 0. When later on the events 212 + * are deleted and re-added, do not reset the event count value to zero. 213 + * Events are added, deleted and re-added when 2 or more events 214 + * are active at the same time. 215 + */ 216 + event->hw.last_tag = 0; 212 217 cpump->event = event; 213 218 event->destroy = paicrypt_event_destroy; 214 219 ··· 249 242 { 250 243 u64 sum; 251 244 252 - sum = paicrypt_getall(event); /* Get current value */ 253 - local64_set(&event->hw.prev_count, sum); 254 - local64_set(&event->count, 0); 245 + if (!event->hw.last_tag) { 246 + event->hw.last_tag = 1; 247 + sum = paicrypt_getall(event); /* Get current value */ 248 + local64_set(&event->count, 0); 249 + local64_set(&event->hw.prev_count, sum); 250 + } 255 251 } 256 252 257 253 static int paicrypt_add(struct perf_event *event, int flags)