Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : #include <linux/export.h> 3 : : #include <linux/types.h> 4 : : #include <linux/bits.h> 5 : : #include "probe.h" 6 : : 7 : : static umode_t 8 : 189 : not_visible(struct kobject *kobj, struct attribute *attr, int i) 9 : : { 10 : 189 : return 0; 11 : : } 12 : : 13 : : unsigned long 14 : 21 : perf_msr_probe(struct perf_msr *msr, int cnt, bool zero, void *data) 15 : : { 16 : 21 : unsigned long avail = 0; 17 : 21 : unsigned int bit; 18 : 21 : u64 val; 19 : : 20 [ + - ]: 21 : if (cnt >= BITS_PER_LONG) 21 : : return 0; 22 : : 23 [ + + ]: 189 : for (bit = 0; bit < cnt; bit++) { 24 [ + + ]: 168 : if (!msr[bit].no_check) { 25 : 147 : struct attribute_group *grp = msr[bit].grp; 26 : : 27 : 147 : grp->is_visible = not_visible; 28 : : 29 [ + - + - ]: 147 : if (msr[bit].test && !msr[bit].test(bit, data)) 30 : 147 : continue; 31 : : /* Virt sucks; you cannot tell if a R/O MSR is present :/ */ 32 [ # # ]: 0 : if (rdmsrl_safe(msr[bit].msr, &val)) 33 : 0 : continue; 34 : : /* Disable zero counters if requested. */ 35 [ # # # # ]: 0 : if (!zero && !val) 36 : 0 : continue; 37 : : 38 : 0 : grp->is_visible = NULL; 39 : : } 40 : 21 : avail |= BIT(bit); 41 : : } 42 : : 43 : : return avail; 44 : : } 45 : : EXPORT_SYMBOL_GPL(perf_msr_probe);