affinity.h (2165B)
1/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2/* 3 * Copyright(c) 2015 - 2020 Intel Corporation. 4 */ 5 6#ifndef _HFI1_AFFINITY_H 7#define _HFI1_AFFINITY_H 8 9#include "hfi.h" 10 11enum irq_type { 12 IRQ_SDMA, 13 IRQ_RCVCTXT, 14 IRQ_NETDEVCTXT, 15 IRQ_GENERAL, 16 IRQ_OTHER 17}; 18 19/* Can be used for both memory and cpu */ 20enum affinity_flags { 21 AFF_AUTO, 22 AFF_NUMA_LOCAL, 23 AFF_DEV_LOCAL, 24 AFF_IRQ_LOCAL 25}; 26 27struct cpu_mask_set { 28 struct cpumask mask; 29 struct cpumask used; 30 uint gen; 31}; 32 33struct hfi1_msix_entry; 34 35/* Initialize non-HT cpu cores mask */ 36void init_real_cpu_mask(void); 37/* Initialize driver affinity data */ 38int hfi1_dev_affinity_init(struct hfi1_devdata *dd); 39/* 40 * Set IRQ affinity to a CPU. The function will determine the 41 * CPU and set the affinity to it. 42 */ 43int hfi1_get_irq_affinity(struct hfi1_devdata *dd, 44 struct hfi1_msix_entry *msix); 45/* 46 * Remove the IRQ's CPU affinity. This function also updates 47 * any internal CPU tracking data 48 */ 49void hfi1_put_irq_affinity(struct hfi1_devdata *dd, 50 struct hfi1_msix_entry *msix); 51/* 52 * Determine a CPU affinity for a user process, if the process does not 53 * have an affinity set yet. 54 */ 55int hfi1_get_proc_affinity(int node); 56/* Release a CPU used by a user process. */ 57void hfi1_put_proc_affinity(int cpu); 58 59struct hfi1_affinity_node { 60 int node; 61 u16 __percpu *comp_vect_affinity; 62 struct cpu_mask_set def_intr; 63 struct cpu_mask_set rcv_intr; 64 struct cpumask general_intr_mask; 65 struct cpumask comp_vect_mask; 66 struct list_head list; 67}; 68 69struct hfi1_affinity_node_list { 70 struct list_head list; 71 struct cpumask real_cpu_mask; 72 struct cpu_mask_set proc; 73 int num_core_siblings; 74 int num_possible_nodes; 75 int num_online_nodes; 76 int num_online_cpus; 77 struct mutex lock; /* protects affinity nodes */ 78}; 79 80int node_affinity_init(void); 81void node_affinity_destroy_all(void); 82extern struct hfi1_affinity_node_list node_affinity; 83void hfi1_dev_affinity_clean_up(struct hfi1_devdata *dd); 84int hfi1_comp_vect_mappings_lookup(struct rvt_dev_info *rdi, int comp_vect); 85int hfi1_comp_vectors_set_up(struct hfi1_devdata *dd); 86void hfi1_comp_vectors_clean_up(struct hfi1_devdata *dd); 87 88#endif /* _HFI1_AFFINITY_H */