hfi_instance
struct hfi_instance *hfi_instance;
static struct hfi_instance *hfi_instances;
static void get_hfi_caps(struct hfi_instance *hfi_instance,
raw_spin_lock_irq(&hfi_instance->table_lock);
for_each_cpu(cpu, hfi_instance->cpus) {
caps = hfi_instance->data + index * hfi_features.cpu_stride;
raw_spin_unlock_irq(&hfi_instance->table_lock);
static void update_capabilities(struct hfi_instance *hfi_instance)
cpu_count = cpumask_weight(hfi_instance->cpus);
get_hfi_caps(hfi_instance, cpu_caps);
struct hfi_instance *hfi_instance;
hfi_instance = container_of(to_delayed_work(work), struct hfi_instance,
update_capabilities(hfi_instance);
struct hfi_instance *hfi_instance;
hfi_instance = info->hfi_instance;
if (unlikely(!hfi_instance)) {
if (!raw_spin_trylock(&hfi_instance->event_lock))
raw_spin_unlock(&hfi_instance->event_lock);
new_timestamp = *(u64 *)hfi_instance->hw_table;
if (*hfi_instance->timestamp == new_timestamp) {
raw_spin_unlock(&hfi_instance->event_lock);
raw_spin_lock(&hfi_instance->table_lock);
memcpy(hfi_instance->local_table, hfi_instance->hw_table,
raw_spin_unlock(&hfi_instance->table_lock);
raw_spin_unlock(&hfi_instance->event_lock);
queue_delayed_work(hfi_updates_wq, &hfi_instance->update_work,
static void init_hfi_instance(struct hfi_instance *hfi_instance)
hfi_instance->hdr = hfi_instance->local_table +
sizeof(*hfi_instance->timestamp);
hfi_instance->data = hfi_instance->hdr + hfi_features.hdr_size;
static void hfi_set_hw_table(struct hfi_instance *hfi_instance)
hw_table_pa = virt_to_phys(hfi_instance->hw_table);
struct hfi_instance *hfi_instance;
hfi_instance = info->hfi_instance;
if (!hfi_instance) {
hfi_instance = &hfi_instances[pkg_id];
info->hfi_instance = hfi_instance;
if (hfi_instance->hdr)
hfi_instance->hw_table = alloc_pages_exact(hfi_features.nr_table_pages,
if (!hfi_instance->hw_table)
hfi_instance->local_table = kzalloc(hfi_features.nr_table_pages << PAGE_SHIFT,
if (!hfi_instance->local_table)
init_hfi_instance(hfi_instance);
INIT_DELAYED_WORK(&hfi_instance->update_work, hfi_update_work_fn);
raw_spin_lock_init(&hfi_instance->table_lock);
raw_spin_lock_init(&hfi_instance->event_lock);
cpumask_set_cpu(cpu, hfi_instance->cpus);
if (cpumask_weight(hfi_instance->cpus) == 1 && hfi_clients_nr > 0) {
hfi_set_hw_table(hfi_instance);
free_pages_exact(hfi_instance->hw_table, hfi_features.nr_table_pages);
struct hfi_instance *hfi_instance;
hfi_instance = info->hfi_instance;
if (!hfi_instance)
if (!hfi_instance->hdr)
cpumask_clear_cpu(cpu, hfi_instance->cpus);
if (!cpumask_weight(hfi_instance->cpus))
struct hfi_instance *hfi_instance = info->hfi_instance;
hfi_enable_instance(hfi_instance);
struct hfi_instance *hfi_instance;
hfi_instance = &hfi_instances[i];
if (cpumask_empty(hfi_instance->cpus))
cpu = cpumask_any(hfi_instance->cpus);
smp_call_function_single(cpu, func, hfi_instance, true);
struct hfi_instance *hfi_instance;
hfi_instance = &hfi_instances[i];
if (!zalloc_cpumask_var(&hfi_instance->cpus, GFP_KERNEL))
hfi_instance = &hfi_instances[j];
free_cpumask_var(hfi_instance->cpus);