Lines Matching refs:rmap
30 struct cpu_rmap *rmap; in alloc_cpu_rmap() local
42 rmap = kzalloc(obj_offset + size * sizeof(rmap->obj[0]), flags); in alloc_cpu_rmap()
43 if (!rmap) in alloc_cpu_rmap()
46 kref_init(&rmap->refcount); in alloc_cpu_rmap()
47 rmap->obj = (void **)((char *)rmap + obj_offset); in alloc_cpu_rmap()
56 rmap->near[cpu].index = cpu % size; in alloc_cpu_rmap()
57 rmap->near[cpu].dist = CPU_RMAP_DIST_INF; in alloc_cpu_rmap()
60 rmap->size = size; in alloc_cpu_rmap()
61 return rmap; in alloc_cpu_rmap()
71 struct cpu_rmap *rmap = container_of(ref, struct cpu_rmap, refcount); in cpu_rmap_release() local
72 kfree(rmap); in cpu_rmap_release()
79 static inline void cpu_rmap_get(struct cpu_rmap *rmap) in cpu_rmap_get() argument
81 kref_get(&rmap->refcount); in cpu_rmap_get()
88 int cpu_rmap_put(struct cpu_rmap *rmap) in cpu_rmap_put() argument
90 return kref_put(&rmap->refcount, cpu_rmap_release); in cpu_rmap_put()
97 static bool cpu_rmap_copy_neigh(struct cpu_rmap *rmap, unsigned int cpu, in cpu_rmap_copy_neigh() argument
103 if (rmap->near[cpu].dist > dist && in cpu_rmap_copy_neigh()
104 rmap->near[neigh].dist <= dist) { in cpu_rmap_copy_neigh()
105 rmap->near[cpu].index = rmap->near[neigh].index; in cpu_rmap_copy_neigh()
106 rmap->near[cpu].dist = dist; in cpu_rmap_copy_neigh()
114 static void debug_print_rmap(const struct cpu_rmap *rmap, const char *prefix) in debug_print_rmap() argument
119 pr_info("cpu_rmap %p, %s:\n", rmap, prefix); in debug_print_rmap()
122 index = rmap->near[cpu].index; in debug_print_rmap()
124 cpu, index, rmap->near[cpu].dist); in debug_print_rmap()
129 debug_print_rmap(const struct cpu_rmap *rmap, const char *prefix) in debug_print_rmap() argument
141 int cpu_rmap_add(struct cpu_rmap *rmap, void *obj) in cpu_rmap_add() argument
145 BUG_ON(rmap->used >= rmap->size); in cpu_rmap_add()
146 index = rmap->used++; in cpu_rmap_add()
147 rmap->obj[index] = obj; in cpu_rmap_add()
158 int cpu_rmap_update(struct cpu_rmap *rmap, u16 index, in cpu_rmap_update() argument
171 if (rmap->near[cpu].index == index) { in cpu_rmap_update()
172 rmap->near[cpu].dist = CPU_RMAP_DIST_INF; in cpu_rmap_update()
177 debug_print_rmap(rmap, "after invalidating old distances"); in cpu_rmap_update()
183 rmap->near[cpu].index = index; in cpu_rmap_update()
184 rmap->near[cpu].dist = 0; in cpu_rmap_update()
189 debug_print_rmap(rmap, "after updating neighbours"); in cpu_rmap_update()
193 if (cpu_rmap_copy_neigh(rmap, cpu, in cpu_rmap_update()
196 if (cpu_rmap_copy_neigh(rmap, cpu, in cpu_rmap_update()
199 if (cpu_rmap_copy_neigh(rmap, cpu, in cpu_rmap_update()
207 debug_print_rmap(rmap, "after copying neighbours"); in cpu_rmap_update()
218 struct cpu_rmap *rmap; member
228 void free_irq_cpu_rmap(struct cpu_rmap *rmap) in free_irq_cpu_rmap() argument
233 if (!rmap) in free_irq_cpu_rmap()
236 for (index = 0; index < rmap->used; index++) { in free_irq_cpu_rmap()
237 glue = rmap->obj[index]; in free_irq_cpu_rmap()
241 cpu_rmap_put(rmap); in free_irq_cpu_rmap()
259 rc = cpu_rmap_update(glue->rmap, glue->index, mask); in irq_cpu_rmap_notify()
273 cpu_rmap_put(glue->rmap); in irq_cpu_rmap_release()
288 int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq) in irq_cpu_rmap_add() argument
297 glue->rmap = rmap; in irq_cpu_rmap_add()
298 cpu_rmap_get(rmap); in irq_cpu_rmap_add()
299 glue->index = cpu_rmap_add(rmap, glue); in irq_cpu_rmap_add()
302 cpu_rmap_put(glue->rmap); in irq_cpu_rmap_add()