Lines Matching defs:pcpu
2 * pcpu.c
3 * Management physical cpu in dom0, get pcpu info and provide sys interface
57 struct pcpu {
100 struct pcpu *cpu = container_of(dev, struct pcpu, dev);
109 struct pcpu *pcpu = container_of(dev, struct pcpu, dev);
121 ret = xen_pcpu_down(pcpu->cpu_id);
124 ret = xen_pcpu_up(pcpu->cpu_id);
169 struct pcpu *pcpu)
172 !xen_pcpu_online(pcpu->flags)) {
173 /* the pcpu is onlined */
174 pcpu->flags |= XEN_PCPU_FLAGS_ONLINE;
175 kobject_uevent(&pcpu->dev.kobj, KOBJ_ONLINE);
177 xen_pcpu_online(pcpu->flags)) {
178 /* The pcpu is offlined */
179 pcpu->flags &= ~XEN_PCPU_FLAGS_ONLINE;
180 kobject_uevent(&pcpu->dev.kobj, KOBJ_OFFLINE);
184 static struct pcpu *get_pcpu(uint32_t cpu_id)
186 struct pcpu *pcpu;
188 list_for_each_entry(pcpu, &xen_pcpus, list) {
189 if (pcpu->cpu_id == cpu_id)
190 return pcpu;
198 struct pcpu *pcpu = container_of(dev, struct pcpu, dev);
200 list_del(&pcpu->list);
201 kfree(pcpu);
204 static void unregister_and_remove_pcpu(struct pcpu *pcpu)
208 if (!pcpu)
211 dev = &pcpu->dev;
212 /* pcpu remove would be implicitly done */
216 static int register_pcpu(struct pcpu *pcpu)
221 if (!pcpu)
224 dev = &pcpu->dev;
226 dev->id = pcpu->cpu_id;
239 static struct pcpu *create_and_register_pcpu(struct xenpf_pcpuinfo *info)
241 struct pcpu *pcpu;
247 pcpu = kzalloc(sizeof(struct pcpu), GFP_KERNEL);
248 if (!pcpu)
251 INIT_LIST_HEAD(&pcpu->list);
252 pcpu->cpu_id = info->xen_cpuid;
253 pcpu->acpi_id = info->acpi_id;
254 pcpu->flags = info->flags;
256 /* Need hold on xen_pcpu_lock before pcpu list manipulations */
257 list_add_tail(&pcpu->list, &xen_pcpus);
259 err = register_pcpu(pcpu);
261 pr_warn("Failed to register pcpu%u\n", info->xen_cpuid);
265 return pcpu;
274 struct pcpu *pcpu = NULL;
290 pcpu = get_pcpu(cpu);
296 unregister_and_remove_pcpu(pcpu);
300 if (!pcpu) {
301 pcpu = create_and_register_pcpu(info);
302 if (IS_ERR_OR_NULL(pcpu))
305 pcpu_online_status(info, pcpu);
311 * Sync dom0's pcpu information with xen hypervisor's
320 struct pcpu *pcpu, *tmp;
330 list_for_each_entry_safe(pcpu, tmp, &xen_pcpus, list)
331 unregister_and_remove_pcpu(pcpu);
394 "xen-pcpu", NULL);
396 pr_warn("Failed to bind pcpu virq\n");
402 pr_warn("Failed to register pcpu subsys\n");
408 pr_warn("Failed to sync pcpu info\n");
425 const struct pcpu *pcpu;
429 list_for_each_entry(pcpu, &xen_pcpus, list)
430 if (pcpu->acpi_id == acpi_id) {
431 online = pcpu->flags & XEN_PCPU_FLAGS_ONLINE;