tools/perf/util/lock-contention.c
Source file repositories/reference/linux-study-clean/tools/perf/util/lock-contention.c
File Facts
- System
- Linux kernel
- Corpus path
tools/perf/util/lock-contention.c- Extension
.c- Size
- 3239 bytes
- Lines
- 144
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
debug.henv.hlock-contention.hmachine.hsymbol.hlimits.hstring.hlinux/hash.hlinux/zalloc.h
Detected Declarations
struct callstack_filterfunction parse_call_stackfunction needs_callstackfunction hlist_for_each_entryfunction hlist_for_each_entryfunction match_callstack_filterfunction list_for_each_entry
Annotated Snippet
struct callstack_filter {
struct list_head list;
char name[];
};
static LIST_HEAD(callstack_filters);
struct hlist_head *lockhash_table;
int parse_call_stack(const struct option *opt __maybe_unused, const char *str,
int unset __maybe_unused)
{
char *s, *tmp, *tok;
int ret = 0;
s = strdup(str);
if (s == NULL)
return -1;
for (tok = strtok_r(s, ", ", &tmp); tok; tok = strtok_r(NULL, ", ", &tmp)) {
struct callstack_filter *entry;
entry = malloc(sizeof(*entry) + strlen(tok) + 1);
if (entry == NULL) {
pr_err("Memory allocation failure\n");
free(s);
return -1;
}
strcpy(entry->name, tok);
list_add_tail(&entry->list, &callstack_filters);
}
free(s);
return ret;
}
bool needs_callstack(void)
{
return !list_empty(&callstack_filters);
}
struct lock_stat *lock_stat_find(u64 addr)
{
struct hlist_head *entry = lockhashentry(addr);
struct lock_stat *ret;
hlist_for_each_entry(ret, entry, hash_entry) {
if (ret->addr == addr)
return ret;
}
return NULL;
}
struct lock_stat *lock_stat_findnew(u64 addr, const char *name, int flags)
{
struct hlist_head *entry = lockhashentry(addr);
struct lock_stat *ret, *new;
hlist_for_each_entry(ret, entry, hash_entry) {
if (ret->addr == addr)
return ret;
}
new = zalloc(sizeof(struct lock_stat));
if (!new)
goto alloc_failed;
new->addr = addr;
new->name = strdup(name);
if (!new->name) {
free(new);
goto alloc_failed;
}
new->flags = flags;
new->wait_time_min = ULLONG_MAX;
hlist_add_head(&new->hash_entry, entry);
return new;
alloc_failed:
pr_err("memory allocation failed\n");
return NULL;
}
bool match_callstack_filter(struct machine *machine, u64 *callstack, int max_stack_depth)
{
struct map *kmap;
struct symbol *sym;
u64 ip;
Annotation
- Immediate include surface: `debug.h`, `env.h`, `lock-contention.h`, `machine.h`, `symbol.h`, `limits.h`, `string.h`, `linux/hash.h`.
- Detected declarations: `struct callstack_filter`, `function parse_call_stack`, `function needs_callstack`, `function hlist_for_each_entry`, `function hlist_for_each_entry`, `function match_callstack_filter`, `function list_for_each_entry`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.