/* *Addressesforfilteringfunctionsfromreporting.Thislistcanbeusedasa *whitelistorblacklist.
*/ staticstruct { unsignedlong *addrs; /* array of addresses */
size_t size; /* current size */ int used; /* number of elements used */ bool sorted; /* if elements are sorted */ bool whitelist; /* if list is a blacklist or whitelist */
} report_filterlist; static DEFINE_RAW_SPINLOCK(report_filterlist_lock);
/* We may have been called from an atomic region; reset context. */
memset(¤t->kcsan_ctx, 0, sizeof(current->kcsan_ctx)); /* *Disabletobenchmarkfast-pathforallaccesses,and(expected *negligible)callintoslow-path,butneversetupwatchpoints.
*/
WRITE_ONCE(kcsan_enabled, false);
pr_info("%s begin | iters: %lu\n", __func__, iters);
if (!kallsyms_lookup_size_offset(func_addr, &symbolsize, &offset)) returnfalse;
func_addr -= offset; /* Get function start */
raw_spin_lock_irqsave(&report_filterlist_lock, flags); if (report_filterlist.used == 0) goto out;
/* Sort array if it is unsorted, and then do a binary search. */ if (!report_filterlist.sorted) {
sort(report_filterlist.addrs, report_filterlist.used, sizeof(unsignedlong), cmp_filterlist_addrs, NULL);
report_filterlist.sorted = true;
}
ret = !!bsearch(&func_addr, report_filterlist.addrs,
report_filterlist.used, sizeof(unsignedlong),
cmp_filterlist_addrs); if (report_filterlist.whitelist)
ret = !ret;
raw_spin_lock_irqsave(&report_filterlist_lock, flags); if (report_filterlist.used == report_filterlist.size) { /* Check we pre-allocated enough, and retry if not. */ if (report_filterlist.used >= new_size) {
raw_spin_unlock_irqrestore(&report_filterlist_lock, flags);
kfree(new_addrs); /* kfree(NULL) is safe */
delay_free = new_addrs = NULL; goto retry_alloc;
}
if (report_filterlist.used)
memcpy(new_addrs, report_filterlist.addrs, report_filterlist.used * sizeof(unsignedlong));
delay_free = report_filterlist.addrs; /* free the old list */
report_filterlist.addrs = new_addrs; /* switch to the new list */
report_filterlist.size = new_size;
}
/* Note: deduplicating should be done in userspace. */
report_filterlist.addrs[report_filterlist.used++] = addr;
report_filterlist.sorted = false;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.