1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/export.h>
3 #include <linux/types.h>
4 #include <linux/bits.h>
8 not_visible(struct kobject
*kobj
, struct attribute
*attr
, int i
)
14 * Accepts msr[] array with non populated entries as long as either
15 * msr[i].msr is 0 or msr[i].grp is NULL. Note that the default sysfs
16 * visibility is visible when group->is_visible callback is set.
19 perf_msr_probe(struct perf_msr
*msr
, int cnt
, bool zero
, void *data
)
21 unsigned long avail
= 0;
25 if (cnt
>= BITS_PER_LONG
)
28 for (bit
= 0; bit
< cnt
; bit
++) {
29 if (!msr
[bit
].no_check
) {
30 struct attribute_group
*grp
= msr
[bit
].grp
;
33 /* skip entry with no group */
37 grp
->is_visible
= not_visible
;
39 /* skip unpopulated entry */
43 if (msr
[bit
].test
&& !msr
[bit
].test(bit
, data
))
45 /* Virt sucks; you cannot tell if a R/O MSR is present :/ */
46 if (rdmsrl_safe(msr
[bit
].msr
, &val
))
52 /* Disable zero counters if requested. */
53 if (!zero
&& !(val
& mask
))
56 grp
->is_visible
= NULL
;
63 EXPORT_SYMBOL_GPL(perf_msr_probe
);