static ssize_t dlpar_cpu_release(const char *buf, size_t count) { struct device_node *dn; const u32 *drc_index; int rc; dn = of_find_node_by_path(buf); if (!dn) return -EINVAL; drc_index = of_get_property(dn, "ibm,my-drc-index", NULL); if (!drc_index) { of_node_put(dn); return -EINVAL; } cpu_hotplug_driver_lock(); rc = dlpar_offline_cpu(dn); if (rc) { of_node_put(dn); rc = -EINVAL; goto out; } rc = dlpar_release_drc(*drc_index); if (rc) { of_node_put(dn); goto out; } rc = dlpar_detach_node(dn); if (rc) { dlpar_acquire_drc(*drc_index); goto out; } of_node_put(dn); out: cpu_hotplug_driver_unlock(); return rc ? rc : count; }
static ssize_t dlpar_cpu_release(const char *buf, size_t count) { struct device_node *dn; u32 drc_index; int rc; dn = of_find_node_by_path(buf); if (!dn) return -EINVAL; rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index); if (rc) { of_node_put(dn); return -EINVAL; } rc = dlpar_offline_cpu(dn); if (rc) { of_node_put(dn); return -EINVAL; } rc = dlpar_release_drc(drc_index); if (rc) { of_node_put(dn); return rc; } rc = dlpar_detach_node(dn); if (rc) { dlpar_acquire_drc(drc_index); return rc; } of_node_put(dn); return count; }