s390 updates for 6.15-rc2

- Add IBM z17 bits:
   - Setup elf_platform for new machine types
   - Allow to compile the kernel with z17 optimizations
   - Add new performance counters
 
 - Fix mismatch between indicator bits and queue indexes in virtio CCW code
 
 - Fix double free in pmu setup error path
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEECMNfWEw3SLnmiLkZIg7DeRspbsIFAmf43kgACgkQIg7DeRsp
 bsLohA//Xrq2gP2vCHEpfrMIpcIOf0sb71uBCr9w6KIxCHtvF5fhJl/v/9pWrm1f
 XAXYBFuuzHkAou9fnTyyhW74KtgZ7hgl6rwJNAvk/ah/P5WAoQQGFxSxvm6y70xK
 frsr1Rr7EbeoyLTPVn4H50bvJNBPXMk6MCjf69gpuGSYJ4l7Y1hgc8l7qenDdlRw
 Qi8raGBCEy3RcVIxmxLqbxjsSCNjbd97lcCL4kJPRFjQJCuEvqsoEaSXta8ymXpl
 y9n4sLfMIKGTY1M1DUiIDSjvTQwukh+hSsV6BPYE2w++4BZV1RFXBV2kRkXPowvg
 9ptOWHk6qumOJlWJjHTYoMBwdzlBI04swB1IlLDCsguZuM0ibmeR09OGSTACXc8u
 vm4eAxt0DgOZVE1KIs1QlcMUeJ8pYA5PR1MdCVpyy/fv1V/1iUQoyn0CJC2jVA26
 hm/CmFavumWipw3gXIGmq7wkDZIoKHeOnmL2BGWdoScftz9PRkhCgybeeRQXtQVp
 Nx8VTopXG+1b00CHMqDGjiVXhsYaYDr4MNyWo45F09tDo8O0MoKK+EssUs+i1/fD
 eR5vBOhSlPunsv0bPKCJGb0WlSPbGA7a1g1n8bxQSBeM05WaYOTgijLfjEDxXML+
 TRsxMsJP0SoSVRpGDBMZF1LATAROMWYACutAO+6PXBbuZULgK9I=
 =HxI1
 -----END PGP SIGNATURE-----

Merge tag 's390-6.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 updates from Heiko Carstens:
 "Note that besides two bug fixes this includes three commits for IBM
  z17, which was announced this week.

   - Add IBM z17 bits:
       - Setup elf_platform for new machine types
       - Allow to compile the kernel with z17 optimizations
       - Add new performance counters

   - Fix mismatch between indicator bits and queue indexes in virtio CCW code

   - Fix double free in pmu setup error path"

* tag 's390-6.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/cpumf: Fix double free on error in cpumf_pmu_event_init()
  s390/cpumf: Update CPU Measurement facility extended counter set support
  s390: Allow to compile with z17 optimizations
  s390: Add z17 elf platform
  s390/virtio_ccw: Don't allocate/assign airqs for non-existing queues
This commit is contained in:
Linus Torvalds 2025-04-11 08:17:40 -07:00
commit 9b03fa105c
9 changed files with 210 additions and 19 deletions

View File

@ -332,6 +332,10 @@ config HAVE_MARCH_Z16_FEATURES
def_bool n
select HAVE_MARCH_Z15_FEATURES
config HAVE_MARCH_Z17_FEATURES
def_bool n
select HAVE_MARCH_Z16_FEATURES
choice
prompt "Processor type"
default MARCH_Z196
@ -397,6 +401,14 @@ config MARCH_Z16
Select this to enable optimizations for IBM z16 (3931 and
3932 series).
config MARCH_Z17
bool "IBM z17"
select HAVE_MARCH_Z17_FEATURES
depends on $(cc-option,-march=z17)
help
Select this to enable optimizations for IBM z17 (9175 and
9176 series).
endchoice
config MARCH_Z10_TUNE
@ -420,6 +432,9 @@ config MARCH_Z15_TUNE
config MARCH_Z16_TUNE
def_bool TUNE_Z16 || MARCH_Z16 && TUNE_DEFAULT
config MARCH_Z17_TUNE
def_bool TUNE_Z17 || MARCH_Z17 && TUNE_DEFAULT
choice
prompt "Tune code generation"
default TUNE_DEFAULT
@ -464,6 +479,10 @@ config TUNE_Z16
bool "IBM z16"
depends on $(cc-option,-mtune=z16)
config TUNE_Z17
bool "IBM z17"
depends on $(cc-option,-mtune=z17)
endchoice
config 64BIT

View File

@ -48,6 +48,7 @@ mflags-$(CONFIG_MARCH_Z13) := -march=z13
mflags-$(CONFIG_MARCH_Z14) := -march=z14
mflags-$(CONFIG_MARCH_Z15) := -march=z15
mflags-$(CONFIG_MARCH_Z16) := -march=z16
mflags-$(CONFIG_MARCH_Z17) := -march=z17
export CC_FLAGS_MARCH := $(mflags-y)
@ -61,6 +62,7 @@ cflags-$(CONFIG_MARCH_Z13_TUNE) += -mtune=z13
cflags-$(CONFIG_MARCH_Z14_TUNE) += -mtune=z14
cflags-$(CONFIG_MARCH_Z15_TUNE) += -mtune=z15
cflags-$(CONFIG_MARCH_Z16_TUNE) += -mtune=z16
cflags-$(CONFIG_MARCH_Z17_TUNE) += -mtune=z17
cflags-y += -Wa,-I$(srctree)/arch/$(ARCH)/include

View File

@ -33,6 +33,10 @@
#define MARCH_HAS_Z16_FEATURES 1
#endif
#ifdef CONFIG_HAVE_MARCH_Z17_FEATURES
#define MARCH_HAS_Z17_FEATURES 1
#endif
#endif /* __DECOMPRESSOR */
#endif /* __ASM_S390_MARCH_H */

View File

@ -442,7 +442,7 @@ static void cpum_cf_make_setsize(enum cpumf_ctr_set ctrset)
ctrset_size = 48;
else if (cpumf_ctr_info.csvn >= 3 && cpumf_ctr_info.csvn <= 5)
ctrset_size = 128;
else if (cpumf_ctr_info.csvn == 6 || cpumf_ctr_info.csvn == 7)
else if (cpumf_ctr_info.csvn >= 6 && cpumf_ctr_info.csvn <= 8)
ctrset_size = 160;
break;
case CPUMF_CTR_SET_MT_DIAG:
@ -858,18 +858,13 @@ static int cpumf_pmu_event_type(struct perf_event *event)
static int cpumf_pmu_event_init(struct perf_event *event)
{
unsigned int type = event->attr.type;
int err;
int err = -ENOENT;
if (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_RAW)
err = __hw_perf_event_init(event, type);
else if (event->pmu->type == type)
/* Registered as unknown PMU */
err = __hw_perf_event_init(event, cpumf_pmu_event_type(event));
else
return -ENOENT;
if (unlikely(err) && event->destroy)
event->destroy(event);
return err;
}
@ -1819,8 +1814,6 @@ static int cfdiag_event_init(struct perf_event *event)
event->destroy = hw_perf_event_destroy;
err = cfdiag_event_init2(event);
if (unlikely(err))
event->destroy(event);
out:
return err;
}

View File

@ -237,7 +237,6 @@ CPUMF_EVENT_ATTR(cf_z14, TX_C_TABORT_NO_SPECIAL, 0x00f4);
CPUMF_EVENT_ATTR(cf_z14, TX_C_TABORT_SPECIAL, 0x00f5);
CPUMF_EVENT_ATTR(cf_z14, MT_DIAG_CYCLES_ONE_THR_ACTIVE, 0x01c0);
CPUMF_EVENT_ATTR(cf_z14, MT_DIAG_CYCLES_TWO_THR_ACTIVE, 0x01c1);
CPUMF_EVENT_ATTR(cf_z15, L1D_RO_EXCL_WRITES, 0x0080);
CPUMF_EVENT_ATTR(cf_z15, DTLB2_WRITES, 0x0081);
CPUMF_EVENT_ATTR(cf_z15, DTLB2_MISSES, 0x0082);
@ -365,6 +364,83 @@ CPUMF_EVENT_ATTR(cf_z16, NNPA_WAIT_LOCK, 0x010d);
CPUMF_EVENT_ATTR(cf_z16, NNPA_HOLD_LOCK, 0x010e);
CPUMF_EVENT_ATTR(cf_z16, MT_DIAG_CYCLES_ONE_THR_ACTIVE, 0x01c0);
CPUMF_EVENT_ATTR(cf_z16, MT_DIAG_CYCLES_TWO_THR_ACTIVE, 0x01c1);
CPUMF_EVENT_ATTR(cf_z17, L1D_RO_EXCL_WRITES, 0x0080);
CPUMF_EVENT_ATTR(cf_z17, DTLB2_WRITES, 0x0081);
CPUMF_EVENT_ATTR(cf_z17, DTLB2_MISSES, 0x0082);
CPUMF_EVENT_ATTR(cf_z17, CRSTE_1MB_WRITES, 0x0083);
CPUMF_EVENT_ATTR(cf_z17, DTLB2_GPAGE_WRITES, 0x0084);
CPUMF_EVENT_ATTR(cf_z17, ITLB2_WRITES, 0x0086);
CPUMF_EVENT_ATTR(cf_z17, ITLB2_MISSES, 0x0087);
CPUMF_EVENT_ATTR(cf_z17, TLB2_PTE_WRITES, 0x0089);
CPUMF_EVENT_ATTR(cf_z17, TLB2_CRSTE_WRITES, 0x008a);
CPUMF_EVENT_ATTR(cf_z17, TLB2_ENGINES_BUSY, 0x008b);
CPUMF_EVENT_ATTR(cf_z17, TX_C_TEND, 0x008c);
CPUMF_EVENT_ATTR(cf_z17, TX_NC_TEND, 0x008d);
CPUMF_EVENT_ATTR(cf_z17, L1C_TLB2_MISSES, 0x008f);
CPUMF_EVENT_ATTR(cf_z17, DCW_REQ, 0x0091);
CPUMF_EVENT_ATTR(cf_z17, DCW_REQ_IV, 0x0092);
CPUMF_EVENT_ATTR(cf_z17, DCW_REQ_CHIP_HIT, 0x0093);
CPUMF_EVENT_ATTR(cf_z17, DCW_REQ_DRAWER_HIT, 0x0094);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_CHIP, 0x0095);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_CHIP_IV, 0x0096);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_CHIP_CHIP_HIT, 0x0097);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_CHIP_DRAWER_HIT, 0x0098);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_MODULE, 0x0099);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_DRAWER, 0x009a);
CPUMF_EVENT_ATTR(cf_z17, DCW_OFF_DRAWER, 0x009b);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_CHIP_MEMORY, 0x009c);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_MODULE_MEMORY, 0x009d);
CPUMF_EVENT_ATTR(cf_z17, DCW_ON_DRAWER_MEMORY, 0x009e);
CPUMF_EVENT_ATTR(cf_z17, DCW_OFF_DRAWER_MEMORY, 0x009f);
CPUMF_EVENT_ATTR(cf_z17, IDCW_ON_MODULE_IV, 0x00a0);
CPUMF_EVENT_ATTR(cf_z17, IDCW_ON_MODULE_CHIP_HIT, 0x00a1);
CPUMF_EVENT_ATTR(cf_z17, IDCW_ON_MODULE_DRAWER_HIT, 0x00a2);
CPUMF_EVENT_ATTR(cf_z17, IDCW_ON_DRAWER_IV, 0x00a3);
CPUMF_EVENT_ATTR(cf_z17, IDCW_ON_DRAWER_CHIP_HIT, 0x00a4);
CPUMF_EVENT_ATTR(cf_z17, IDCW_ON_DRAWER_DRAWER_HIT, 0x00a5);
CPUMF_EVENT_ATTR(cf_z17, IDCW_OFF_DRAWER_IV, 0x00a6);
CPUMF_EVENT_ATTR(cf_z17, IDCW_OFF_DRAWER_CHIP_HIT, 0x00a7);
CPUMF_EVENT_ATTR(cf_z17, IDCW_OFF_DRAWER_DRAWER_HIT, 0x00a8);
CPUMF_EVENT_ATTR(cf_z17, ICW_REQ, 0x00a9);
CPUMF_EVENT_ATTR(cf_z17, ICW_REQ_IV, 0x00aa);
CPUMF_EVENT_ATTR(cf_z17, ICW_REQ_CHIP_HIT, 0x00ab);
CPUMF_EVENT_ATTR(cf_z17, ICW_REQ_DRAWER_HIT, 0x00ac);
CPUMF_EVENT_ATTR(cf_z17, ICW_ON_CHIP, 0x00ad);
CPUMF_EVENT_ATTR(cf_z17, ICW_ON_CHIP_IV, 0x00ae);
CPUMF_EVENT_ATTR(cf_z17, ICW_ON_CHIP_CHIP_HIT, 0x00af);
CPUMF_EVENT_ATTR(cf_z17, ICW_ON_CHIP_DRAWER_HIT, 0x00b0);
CPUMF_EVENT_ATTR(cf_z17, ICW_ON_MODULE, 0x00b1);
CPUMF_EVENT_ATTR(cf_z17, ICW_ON_DRAWER, 0x00b2);
CPUMF_EVENT_ATTR(cf_z17, ICW_OFF_DRAWER, 0x00b3);
CPUMF_EVENT_ATTR(cf_z17, CYCLES_SAMETHRD, 0x00ca);
CPUMF_EVENT_ATTR(cf_z17, CYCLES_DIFFTHRD, 0x00cb);
CPUMF_EVENT_ATTR(cf_z17, INST_SAMETHRD, 0x00cc);
CPUMF_EVENT_ATTR(cf_z17, INST_DIFFTHRD, 0x00cd);
CPUMF_EVENT_ATTR(cf_z17, WRONG_BRANCH_PREDICTION, 0x00ce);
CPUMF_EVENT_ATTR(cf_z17, VX_BCD_EXECUTION_SLOTS, 0x00e1);
CPUMF_EVENT_ATTR(cf_z17, DECIMAL_INSTRUCTIONS, 0x00e2);
CPUMF_EVENT_ATTR(cf_z17, LAST_HOST_TRANSLATIONS, 0x00e8);
CPUMF_EVENT_ATTR(cf_z17, TX_NC_TABORT, 0x00f4);
CPUMF_EVENT_ATTR(cf_z17, TX_C_TABORT_NO_SPECIAL, 0x00f5);
CPUMF_EVENT_ATTR(cf_z17, TX_C_TABORT_SPECIAL, 0x00f6);
CPUMF_EVENT_ATTR(cf_z17, DFLT_ACCESS, 0x00f8);
CPUMF_EVENT_ATTR(cf_z17, DFLT_CYCLES, 0x00fd);
CPUMF_EVENT_ATTR(cf_z17, SORTL, 0x0100);
CPUMF_EVENT_ATTR(cf_z17, DFLT_CC, 0x0109);
CPUMF_EVENT_ATTR(cf_z17, DFLT_CCFINISH, 0x010a);
CPUMF_EVENT_ATTR(cf_z17, NNPA_INVOCATIONS, 0x010b);
CPUMF_EVENT_ATTR(cf_z17, NNPA_COMPLETIONS, 0x010c);
CPUMF_EVENT_ATTR(cf_z17, NNPA_WAIT_LOCK, 0x010d);
CPUMF_EVENT_ATTR(cf_z17, NNPA_HOLD_LOCK, 0x010e);
CPUMF_EVENT_ATTR(cf_z17, NNPA_INST_ONCHIP, 0x0110);
CPUMF_EVENT_ATTR(cf_z17, NNPA_INST_OFFCHIP, 0x0111);
CPUMF_EVENT_ATTR(cf_z17, NNPA_INST_DIFF, 0x0112);
CPUMF_EVENT_ATTR(cf_z17, NNPA_4K_PREFETCH, 0x0114);
CPUMF_EVENT_ATTR(cf_z17, NNPA_COMPL_LOCK, 0x0115);
CPUMF_EVENT_ATTR(cf_z17, NNPA_RETRY_LOCK, 0x0116);
CPUMF_EVENT_ATTR(cf_z17, NNPA_RETRY_LOCK_WITH_PLO, 0x0117);
CPUMF_EVENT_ATTR(cf_z17, MT_DIAG_CYCLES_ONE_THR_ACTIVE, 0x01c0);
CPUMF_EVENT_ATTR(cf_z17, MT_DIAG_CYCLES_TWO_THR_ACTIVE, 0x01c1);
static struct attribute *cpumcf_fvn1_pmu_event_attr[] __initdata = {
CPUMF_EVENT_PTR(cf_fvn1, CPU_CYCLES),
@ -414,7 +490,7 @@ static struct attribute *cpumcf_svn_12345_pmu_event_attr[] __initdata = {
NULL,
};
static struct attribute *cpumcf_svn_67_pmu_event_attr[] __initdata = {
static struct attribute *cpumcf_svn_678_pmu_event_attr[] __initdata = {
CPUMF_EVENT_PTR(cf_svn_12345, PRNG_FUNCTIONS),
CPUMF_EVENT_PTR(cf_svn_12345, PRNG_CYCLES),
CPUMF_EVENT_PTR(cf_svn_12345, PRNG_BLOCKED_FUNCTIONS),
@ -779,6 +855,87 @@ static struct attribute *cpumcf_z16_pmu_event_attr[] __initdata = {
NULL,
};
static struct attribute *cpumcf_z17_pmu_event_attr[] __initdata = {
CPUMF_EVENT_PTR(cf_z17, L1D_RO_EXCL_WRITES),
CPUMF_EVENT_PTR(cf_z17, DTLB2_WRITES),
CPUMF_EVENT_PTR(cf_z17, DTLB2_MISSES),
CPUMF_EVENT_PTR(cf_z17, CRSTE_1MB_WRITES),
CPUMF_EVENT_PTR(cf_z17, DTLB2_GPAGE_WRITES),
CPUMF_EVENT_PTR(cf_z17, ITLB2_WRITES),
CPUMF_EVENT_PTR(cf_z17, ITLB2_MISSES),
CPUMF_EVENT_PTR(cf_z17, TLB2_PTE_WRITES),
CPUMF_EVENT_PTR(cf_z17, TLB2_CRSTE_WRITES),
CPUMF_EVENT_PTR(cf_z17, TLB2_ENGINES_BUSY),
CPUMF_EVENT_PTR(cf_z17, TX_C_TEND),
CPUMF_EVENT_PTR(cf_z17, TX_NC_TEND),
CPUMF_EVENT_PTR(cf_z17, L1C_TLB2_MISSES),
CPUMF_EVENT_PTR(cf_z17, DCW_REQ),
CPUMF_EVENT_PTR(cf_z17, DCW_REQ_IV),
CPUMF_EVENT_PTR(cf_z17, DCW_REQ_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, DCW_REQ_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_CHIP),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_CHIP_IV),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_CHIP_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_CHIP_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_MODULE),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_DRAWER),
CPUMF_EVENT_PTR(cf_z17, DCW_OFF_DRAWER),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_CHIP_MEMORY),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_MODULE_MEMORY),
CPUMF_EVENT_PTR(cf_z17, DCW_ON_DRAWER_MEMORY),
CPUMF_EVENT_PTR(cf_z17, DCW_OFF_DRAWER_MEMORY),
CPUMF_EVENT_PTR(cf_z17, IDCW_ON_MODULE_IV),
CPUMF_EVENT_PTR(cf_z17, IDCW_ON_MODULE_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, IDCW_ON_MODULE_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, IDCW_ON_DRAWER_IV),
CPUMF_EVENT_PTR(cf_z17, IDCW_ON_DRAWER_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, IDCW_ON_DRAWER_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, IDCW_OFF_DRAWER_IV),
CPUMF_EVENT_PTR(cf_z17, IDCW_OFF_DRAWER_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, IDCW_OFF_DRAWER_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, ICW_REQ),
CPUMF_EVENT_PTR(cf_z17, ICW_REQ_IV),
CPUMF_EVENT_PTR(cf_z17, ICW_REQ_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, ICW_REQ_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, ICW_ON_CHIP),
CPUMF_EVENT_PTR(cf_z17, ICW_ON_CHIP_IV),
CPUMF_EVENT_PTR(cf_z17, ICW_ON_CHIP_CHIP_HIT),
CPUMF_EVENT_PTR(cf_z17, ICW_ON_CHIP_DRAWER_HIT),
CPUMF_EVENT_PTR(cf_z17, ICW_ON_MODULE),
CPUMF_EVENT_PTR(cf_z17, ICW_ON_DRAWER),
CPUMF_EVENT_PTR(cf_z17, ICW_OFF_DRAWER),
CPUMF_EVENT_PTR(cf_z17, CYCLES_SAMETHRD),
CPUMF_EVENT_PTR(cf_z17, CYCLES_DIFFTHRD),
CPUMF_EVENT_PTR(cf_z17, INST_SAMETHRD),
CPUMF_EVENT_PTR(cf_z17, INST_DIFFTHRD),
CPUMF_EVENT_PTR(cf_z17, WRONG_BRANCH_PREDICTION),
CPUMF_EVENT_PTR(cf_z17, VX_BCD_EXECUTION_SLOTS),
CPUMF_EVENT_PTR(cf_z17, DECIMAL_INSTRUCTIONS),
CPUMF_EVENT_PTR(cf_z17, LAST_HOST_TRANSLATIONS),
CPUMF_EVENT_PTR(cf_z17, TX_NC_TABORT),
CPUMF_EVENT_PTR(cf_z17, TX_C_TABORT_NO_SPECIAL),
CPUMF_EVENT_PTR(cf_z17, TX_C_TABORT_SPECIAL),
CPUMF_EVENT_PTR(cf_z17, DFLT_ACCESS),
CPUMF_EVENT_PTR(cf_z17, DFLT_CYCLES),
CPUMF_EVENT_PTR(cf_z17, SORTL),
CPUMF_EVENT_PTR(cf_z17, DFLT_CC),
CPUMF_EVENT_PTR(cf_z17, DFLT_CCFINISH),
CPUMF_EVENT_PTR(cf_z17, NNPA_INVOCATIONS),
CPUMF_EVENT_PTR(cf_z17, NNPA_COMPLETIONS),
CPUMF_EVENT_PTR(cf_z17, NNPA_WAIT_LOCK),
CPUMF_EVENT_PTR(cf_z17, NNPA_HOLD_LOCK),
CPUMF_EVENT_PTR(cf_z17, NNPA_INST_ONCHIP),
CPUMF_EVENT_PTR(cf_z17, NNPA_INST_OFFCHIP),
CPUMF_EVENT_PTR(cf_z17, NNPA_INST_DIFF),
CPUMF_EVENT_PTR(cf_z17, NNPA_4K_PREFETCH),
CPUMF_EVENT_PTR(cf_z17, NNPA_COMPL_LOCK),
CPUMF_EVENT_PTR(cf_z17, NNPA_RETRY_LOCK),
CPUMF_EVENT_PTR(cf_z17, NNPA_RETRY_LOCK_WITH_PLO),
CPUMF_EVENT_PTR(cf_z17, MT_DIAG_CYCLES_ONE_THR_ACTIVE),
CPUMF_EVENT_PTR(cf_z17, MT_DIAG_CYCLES_TWO_THR_ACTIVE),
NULL,
};
/* END: CPUM_CF COUNTER DEFINITIONS ===================================== */
static struct attribute_group cpumcf_pmu_events_group = {
@ -859,7 +1016,7 @@ __init const struct attribute_group **cpumf_cf_event_group(void)
if (ci.csvn >= 1 && ci.csvn <= 5)
csvn = cpumcf_svn_12345_pmu_event_attr;
else if (ci.csvn >= 6)
csvn = cpumcf_svn_67_pmu_event_attr;
csvn = cpumcf_svn_678_pmu_event_attr;
/* Determine model-specific counter set(s) */
get_cpu_id(&cpu_id);
@ -892,6 +1049,10 @@ __init const struct attribute_group **cpumf_cf_event_group(void)
case 0x3932:
model = cpumcf_z16_pmu_event_attr;
break;
case 0x9175:
case 0x9176:
model = cpumcf_z17_pmu_event_attr;
break;
default:
model = none;
break;

View File

@ -885,9 +885,6 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
event->attr.exclude_idle = 0;
err = __hw_perf_event_init(event);
if (unlikely(err))
if (event->destroy)
event->destroy(event);
return err;
}

View File

@ -294,6 +294,10 @@ static int __init setup_elf_platform(void)
case 0x3932:
strcpy(elf_platform, "z16");
break;
case 0x9175:
case 0x9176:
strcpy(elf_platform, "z17");
break;
}
return 0;
}

View File

@ -53,6 +53,9 @@ static struct facility_def facility_defs[] = {
#endif
#ifdef CONFIG_HAVE_MARCH_Z15_FEATURES
61, /* miscellaneous-instruction-extension 3 */
#endif
#ifdef CONFIG_HAVE_MARCH_Z17_FEATURES
84, /* miscellaneous-instruction-extension 4 */
#endif
-1 /* END */
}

View File

@ -302,11 +302,17 @@ static struct airq_info *new_airq_info(int index)
static unsigned long *get_airq_indicator(struct virtqueue *vqs[], int nvqs,
u64 *first, void **airq_info)
{
int i, j;
int i, j, queue_idx, highest_queue_idx = -1;
struct airq_info *info;
unsigned long *indicator_addr = NULL;
unsigned long bit, flags;
/* Array entries without an actual queue pointer must be ignored. */
for (i = 0; i < nvqs; i++) {
if (vqs[i])
highest_queue_idx++;
}
for (i = 0; i < MAX_AIRQ_AREAS && !indicator_addr; i++) {
mutex_lock(&airq_areas_lock);
if (!airq_areas[i])
@ -316,7 +322,7 @@ static unsigned long *get_airq_indicator(struct virtqueue *vqs[], int nvqs,
if (!info)
return NULL;
write_lock_irqsave(&info->lock, flags);
bit = airq_iv_alloc(info->aiv, nvqs);
bit = airq_iv_alloc(info->aiv, highest_queue_idx + 1);
if (bit == -1UL) {
/* Not enough vacancies. */
write_unlock_irqrestore(&info->lock, flags);
@ -325,8 +331,10 @@ static unsigned long *get_airq_indicator(struct virtqueue *vqs[], int nvqs,
*first = bit;
*airq_info = info;
indicator_addr = info->aiv->vector;
for (j = 0; j < nvqs; j++) {
airq_iv_set_ptr(info->aiv, bit + j,
for (j = 0, queue_idx = 0; j < nvqs; j++) {
if (!vqs[j])
continue;
airq_iv_set_ptr(info->aiv, bit + queue_idx++,
(unsigned long)vqs[j]);
}
write_unlock_irqrestore(&info->lock, flags);