diff options
| -rw-r--r-- | drivers/acpi/acpi_lpss.c | 3 | ||||
| -rw-r--r-- | drivers/acpi/acpica/exstore.c | 166 | ||||
| -rw-r--r-- | drivers/acpi/glue.c | 35 | ||||
| -rw-r--r-- | drivers/acpi/scan.c | 15 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 152 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 2 | ||||
| -rw-r--r-- | drivers/cpufreq/intel_pstate.c | 5 | ||||
| -rw-r--r-- | drivers/cpuidle/driver.c | 3 | ||||
| -rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 61 | ||||
| -rw-r--r-- | include/linux/cpufreq.h | 1 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 45 | ||||
| -rw-r--r-- | kernel/power/user.c | 24 | ||||
| -rw-r--r-- | mm/memory_hotplug.c | 4 |
13 files changed, 328 insertions, 188 deletions
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 6a382188fa20..fb78bb9ad8f6 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
| @@ -257,12 +257,13 @@ static int acpi_lpss_create_device(struct acpi_device *adev, | |||
| 257 | pdata->mmio_size = resource_size(&rentry->res); | 257 | pdata->mmio_size = resource_size(&rentry->res); |
| 258 | pdata->mmio_base = ioremap(rentry->res.start, | 258 | pdata->mmio_base = ioremap(rentry->res.start, |
| 259 | pdata->mmio_size); | 259 | pdata->mmio_size); |
| 260 | pdata->dev_desc = dev_desc; | ||
| 261 | break; | 260 | break; |
| 262 | } | 261 | } |
| 263 | 262 | ||
| 264 | acpi_dev_free_resource_list(&resource_list); | 263 | acpi_dev_free_resource_list(&resource_list); |
| 265 | 264 | ||
| 265 | pdata->dev_desc = dev_desc; | ||
| 266 | |||
| 266 | if (dev_desc->clk_required) { | 267 | if (dev_desc->clk_required) { |
| 267 | ret = register_device_clock(adev, pdata); | 268 | ret = register_device_clock(adev, pdata); |
| 268 | if (ret) { | 269 | if (ret) { |
diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c index 2bdba6f7d762..f0b09bf9887d 100644 --- a/drivers/acpi/acpica/exstore.c +++ b/drivers/acpi/acpica/exstore.c | |||
| @@ -57,6 +57,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, | |||
| 57 | union acpi_operand_object *dest_desc, | 57 | union acpi_operand_object *dest_desc, |
| 58 | struct acpi_walk_state *walk_state); | 58 | struct acpi_walk_state *walk_state); |
| 59 | 59 | ||
| 60 | static acpi_status | ||
| 61 | acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, | ||
| 62 | struct acpi_namespace_node *node, | ||
| 63 | struct acpi_walk_state *walk_state); | ||
| 64 | |||
| 60 | /******************************************************************************* | 65 | /******************************************************************************* |
| 61 | * | 66 | * |
| 62 | * FUNCTION: acpi_ex_store | 67 | * FUNCTION: acpi_ex_store |
| @@ -375,7 +380,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, | |||
| 375 | * When storing into an object the data is converted to the | 380 | * When storing into an object the data is converted to the |
| 376 | * target object type then stored in the object. This means | 381 | * target object type then stored in the object. This means |
| 377 | * that the target object type (for an initialized target) will | 382 | * that the target object type (for an initialized target) will |
| 378 | * not be changed by a store operation. | 383 | * not be changed by a store operation. A copy_object can change |
| 384 | * the target type, however. | ||
| 385 | * | ||
| 386 | * The implicit_conversion flag is set to NO/FALSE only when | ||
| 387 | * storing to an arg_x -- as per the rules of the ACPI spec. | ||
| 379 | * | 388 | * |
| 380 | * Assumes parameters are already validated. | 389 | * Assumes parameters are already validated. |
| 381 | * | 390 | * |
| @@ -399,7 +408,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | |||
| 399 | target_type = acpi_ns_get_type(node); | 408 | target_type = acpi_ns_get_type(node); |
| 400 | target_desc = acpi_ns_get_attached_object(node); | 409 | target_desc = acpi_ns_get_attached_object(node); |
| 401 | 410 | ||
| 402 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n", | 411 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n", |
| 403 | source_desc, | 412 | source_desc, |
| 404 | acpi_ut_get_object_type_name(source_desc), node, | 413 | acpi_ut_get_object_type_name(source_desc), node, |
| 405 | acpi_ut_get_type_name(target_type))); | 414 | acpi_ut_get_type_name(target_type))); |
| @@ -413,45 +422,30 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | |||
| 413 | return_ACPI_STATUS(status); | 422 | return_ACPI_STATUS(status); |
| 414 | } | 423 | } |
| 415 | 424 | ||
| 416 | /* If no implicit conversion, drop into the default case below */ | ||
| 417 | |||
| 418 | if ((!implicit_conversion) || | ||
| 419 | ((walk_state->opcode == AML_COPY_OP) && | ||
| 420 | (target_type != ACPI_TYPE_LOCAL_REGION_FIELD) && | ||
| 421 | (target_type != ACPI_TYPE_LOCAL_BANK_FIELD) && | ||
| 422 | (target_type != ACPI_TYPE_LOCAL_INDEX_FIELD))) { | ||
| 423 | /* | ||
| 424 | * Force execution of default (no implicit conversion). Note: | ||
| 425 | * copy_object does not perform an implicit conversion, as per the ACPI | ||
| 426 | * spec -- except in case of region/bank/index fields -- because these | ||
| 427 | * objects must retain their original type permanently. | ||
| 428 | */ | ||
| 429 | target_type = ACPI_TYPE_ANY; | ||
| 430 | } | ||
| 431 | |||
| 432 | /* Do the actual store operation */ | 425 | /* Do the actual store operation */ |
| 433 | 426 | ||
| 434 | switch (target_type) { | 427 | switch (target_type) { |
| 435 | case ACPI_TYPE_BUFFER_FIELD: | ||
| 436 | case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
| 437 | case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
| 438 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
| 439 | |||
| 440 | /* For fields, copy the source data to the target field. */ | ||
| 441 | |||
| 442 | status = acpi_ex_write_data_to_field(source_desc, target_desc, | ||
| 443 | &walk_state->result_obj); | ||
| 444 | break; | ||
| 445 | |||
| 446 | case ACPI_TYPE_INTEGER: | 428 | case ACPI_TYPE_INTEGER: |
| 447 | case ACPI_TYPE_STRING: | 429 | case ACPI_TYPE_STRING: |
| 448 | case ACPI_TYPE_BUFFER: | 430 | case ACPI_TYPE_BUFFER: |
| 449 | /* | 431 | /* |
| 450 | * These target types are all of type Integer/String/Buffer, and | 432 | * The simple data types all support implicit source operand |
| 451 | * therefore support implicit conversion before the store. | 433 | * conversion before the store. |
| 452 | * | ||
| 453 | * Copy and/or convert the source object to a new target object | ||
| 454 | */ | 434 | */ |
| 435 | |||
| 436 | if ((walk_state->opcode == AML_COPY_OP) || !implicit_conversion) { | ||
| 437 | /* | ||
| 438 | * However, copy_object and Stores to arg_x do not perform | ||
| 439 | * an implicit conversion, as per the ACPI specification. | ||
| 440 | * A direct store is performed instead. | ||
| 441 | */ | ||
| 442 | status = acpi_ex_store_direct_to_node(source_desc, node, | ||
| 443 | walk_state); | ||
| 444 | break; | ||
| 445 | } | ||
| 446 | |||
| 447 | /* Store with implicit source operand conversion support */ | ||
| 448 | |||
| 455 | status = | 449 | status = |
| 456 | acpi_ex_store_object_to_object(source_desc, target_desc, | 450 | acpi_ex_store_object_to_object(source_desc, target_desc, |
| 457 | &new_desc, walk_state); | 451 | &new_desc, walk_state); |
| @@ -465,13 +459,12 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | |||
| 465 | * the Name's type to that of the value being stored in it. | 459 | * the Name's type to that of the value being stored in it. |
| 466 | * source_desc reference count is incremented by attach_object. | 460 | * source_desc reference count is incremented by attach_object. |
| 467 | * | 461 | * |
| 468 | * Note: This may change the type of the node if an explicit store | 462 | * Note: This may change the type of the node if an explicit |
| 469 | * has been performed such that the node/object type has been | 463 | * store has been performed such that the node/object type |
| 470 | * changed. | 464 | * has been changed. |
| 471 | */ | 465 | */ |
| 472 | status = | 466 | status = acpi_ns_attach_object(node, new_desc, |
| 473 | acpi_ns_attach_object(node, new_desc, | 467 | new_desc->common.type); |
| 474 | new_desc->common.type); | ||
| 475 | 468 | ||
| 476 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 469 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
| 477 | "Store %s into %s via Convert/Attach\n", | 470 | "Store %s into %s via Convert/Attach\n", |
| @@ -482,38 +475,83 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | |||
| 482 | } | 475 | } |
| 483 | break; | 476 | break; |
| 484 | 477 | ||
| 485 | default: | 478 | case ACPI_TYPE_BUFFER_FIELD: |
| 486 | 479 | case ACPI_TYPE_LOCAL_REGION_FIELD: | |
| 487 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 480 | case ACPI_TYPE_LOCAL_BANK_FIELD: |
| 488 | "Storing [%s] (%p) directly into node [%s] (%p)" | 481 | case ACPI_TYPE_LOCAL_INDEX_FIELD: |
| 489 | " with no implicit conversion\n", | 482 | /* |
| 490 | acpi_ut_get_object_type_name(source_desc), | 483 | * For all fields, always write the source data to the target |
| 491 | source_desc, | 484 | * field. Any required implicit source operand conversion is |
| 492 | acpi_ut_get_object_type_name(target_desc), | 485 | * performed in the function below as necessary. Note, field |
| 493 | node)); | 486 | * objects must retain their original type permanently. |
| 487 | */ | ||
| 488 | status = acpi_ex_write_data_to_field(source_desc, target_desc, | ||
| 489 | &walk_state->result_obj); | ||
| 490 | break; | ||
| 494 | 491 | ||
| 492 | default: | ||
| 495 | /* | 493 | /* |
| 496 | * No conversions for all other types. Directly store a copy of | 494 | * No conversions for all other types. Directly store a copy of |
| 497 | * the source object. NOTE: This is a departure from the ACPI | 495 | * the source object. This is the ACPI spec-defined behavior for |
| 498 | * spec, which states "If conversion is impossible, abort the | 496 | * the copy_object operator. |
| 499 | * running control method". | ||
| 500 | * | 497 | * |
| 501 | * This code implements "If conversion is impossible, treat the | 498 | * NOTE: For the Store operator, this is a departure from the |
| 502 | * Store operation as a CopyObject". | 499 | * ACPI spec, which states "If conversion is impossible, abort |
| 500 | * the running control method". Instead, this code implements | ||
| 501 | * "If conversion is impossible, treat the Store operation as | ||
| 502 | * a CopyObject". | ||
| 503 | */ | 503 | */ |
| 504 | status = | 504 | status = acpi_ex_store_direct_to_node(source_desc, node, |
| 505 | acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, | 505 | walk_state); |
| 506 | walk_state); | ||
| 507 | if (ACPI_FAILURE(status)) { | ||
| 508 | return_ACPI_STATUS(status); | ||
| 509 | } | ||
| 510 | |||
| 511 | status = | ||
| 512 | acpi_ns_attach_object(node, new_desc, | ||
| 513 | new_desc->common.type); | ||
| 514 | acpi_ut_remove_reference(new_desc); | ||
| 515 | break; | 506 | break; |
| 516 | } | 507 | } |
| 517 | 508 | ||
| 518 | return_ACPI_STATUS(status); | 509 | return_ACPI_STATUS(status); |
| 519 | } | 510 | } |
| 511 | |||
| 512 | /******************************************************************************* | ||
| 513 | * | ||
| 514 | * FUNCTION: acpi_ex_store_direct_to_node | ||
| 515 | * | ||
| 516 | * PARAMETERS: source_desc - Value to be stored | ||
| 517 | * node - Named object to receive the value | ||
| 518 | * walk_state - Current walk state | ||
| 519 | * | ||
| 520 | * RETURN: Status | ||
| 521 | * | ||
| 522 | * DESCRIPTION: "Store" an object directly to a node. This involves a copy | ||
| 523 | * and an attach. | ||
| 524 | * | ||
| 525 | ******************************************************************************/ | ||
| 526 | |||
| 527 | static acpi_status | ||
| 528 | acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, | ||
| 529 | struct acpi_namespace_node *node, | ||
| 530 | struct acpi_walk_state *walk_state) | ||
| 531 | { | ||
| 532 | acpi_status status; | ||
| 533 | union acpi_operand_object *new_desc; | ||
| 534 | |||
| 535 | ACPI_FUNCTION_TRACE(ex_store_direct_to_node); | ||
| 536 | |||
| 537 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
| 538 | "Storing [%s] (%p) directly into node [%s] (%p)" | ||
| 539 | " with no implicit conversion\n", | ||
| 540 | acpi_ut_get_object_type_name(source_desc), | ||
| 541 | source_desc, acpi_ut_get_type_name(node->type), | ||
| 542 | node)); | ||
| 543 | |||
| 544 | /* Copy the source object to a new object */ | ||
| 545 | |||
| 546 | status = | ||
| 547 | acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, walk_state); | ||
| 548 | if (ACPI_FAILURE(status)) { | ||
| 549 | return_ACPI_STATUS(status); | ||
| 550 | } | ||
| 551 | |||
| 552 | /* Attach the new object to the node */ | ||
| 553 | |||
| 554 | status = acpi_ns_attach_object(node, new_desc, new_desc->common.type); | ||
| 555 | acpi_ut_remove_reference(new_desc); | ||
| 556 | return_ACPI_STATUS(status); | ||
| 557 | } | ||
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 94672297e1b1..10f0f40587bb 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -79,6 +79,9 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev) | |||
| 79 | return ret; | 79 | return ret; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | #define FIND_CHILD_MIN_SCORE 1 | ||
| 83 | #define FIND_CHILD_MAX_SCORE 2 | ||
| 84 | |||
| 82 | static acpi_status acpi_dev_present(acpi_handle handle, u32 lvl_not_used, | 85 | static acpi_status acpi_dev_present(acpi_handle handle, u32 lvl_not_used, |
| 83 | void *not_used, void **ret_p) | 86 | void *not_used, void **ret_p) |
| 84 | { | 87 | { |
| @@ -92,14 +95,17 @@ static acpi_status acpi_dev_present(acpi_handle handle, u32 lvl_not_used, | |||
| 92 | return AE_OK; | 95 | return AE_OK; |
| 93 | } | 96 | } |
| 94 | 97 | ||
| 95 | static bool acpi_extra_checks_passed(acpi_handle handle, bool is_bridge) | 98 | static int do_find_child_checks(acpi_handle handle, bool is_bridge) |
| 96 | { | 99 | { |
| 100 | bool sta_present = true; | ||
| 97 | unsigned long long sta; | 101 | unsigned long long sta; |
| 98 | acpi_status status; | 102 | acpi_status status; |
| 99 | 103 | ||
| 100 | status = acpi_bus_get_status_handle(handle, &sta); | 104 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); |
| 101 | if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_ENABLED)) | 105 | if (status == AE_NOT_FOUND) |
| 102 | return false; | 106 | sta_present = false; |
| 107 | else if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_ENABLED)) | ||
| 108 | return -ENODEV; | ||
| 103 | 109 | ||
| 104 | if (is_bridge) { | 110 | if (is_bridge) { |
| 105 | void *test = NULL; | 111 | void *test = NULL; |
| @@ -107,16 +113,17 @@ static bool acpi_extra_checks_passed(acpi_handle handle, bool is_bridge) | |||
| 107 | /* Check if this object has at least one child device. */ | 113 | /* Check if this object has at least one child device. */ |
| 108 | acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, | 114 | acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, |
| 109 | acpi_dev_present, NULL, NULL, &test); | 115 | acpi_dev_present, NULL, NULL, &test); |
| 110 | return !!test; | 116 | if (!test) |
| 117 | return -ENODEV; | ||
| 111 | } | 118 | } |
| 112 | return true; | 119 | return sta_present ? FIND_CHILD_MAX_SCORE : FIND_CHILD_MIN_SCORE; |
| 113 | } | 120 | } |
| 114 | 121 | ||
| 115 | struct find_child_context { | 122 | struct find_child_context { |
| 116 | u64 addr; | 123 | u64 addr; |
| 117 | bool is_bridge; | 124 | bool is_bridge; |
| 118 | acpi_handle ret; | 125 | acpi_handle ret; |
| 119 | bool ret_checked; | 126 | int ret_score; |
| 120 | }; | 127 | }; |
| 121 | 128 | ||
| 122 | static acpi_status do_find_child(acpi_handle handle, u32 lvl_not_used, | 129 | static acpi_status do_find_child(acpi_handle handle, u32 lvl_not_used, |
| @@ -125,6 +132,7 @@ static acpi_status do_find_child(acpi_handle handle, u32 lvl_not_used, | |||
| 125 | struct find_child_context *context = data; | 132 | struct find_child_context *context = data; |
| 126 | unsigned long long addr; | 133 | unsigned long long addr; |
| 127 | acpi_status status; | 134 | acpi_status status; |
| 135 | int score; | ||
| 128 | 136 | ||
| 129 | status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &addr); | 137 | status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &addr); |
| 130 | if (ACPI_FAILURE(status) || addr != context->addr) | 138 | if (ACPI_FAILURE(status) || addr != context->addr) |
| @@ -144,15 +152,20 @@ static acpi_status do_find_child(acpi_handle handle, u32 lvl_not_used, | |||
| 144 | * its handle if so. Second, check the same for the object that we've | 152 | * its handle if so. Second, check the same for the object that we've |
| 145 | * just found. | 153 | * just found. |
| 146 | */ | 154 | */ |
| 147 | if (!context->ret_checked) { | 155 | if (!context->ret_score) { |
| 148 | if (acpi_extra_checks_passed(context->ret, context->is_bridge)) | 156 | score = do_find_child_checks(context->ret, context->is_bridge); |
| 157 | if (score == FIND_CHILD_MAX_SCORE) | ||
| 149 | return AE_CTRL_TERMINATE; | 158 | return AE_CTRL_TERMINATE; |
| 150 | else | 159 | else |
| 151 | context->ret_checked = true; | 160 | context->ret_score = score; |
| 152 | } | 161 | } |
| 153 | if (acpi_extra_checks_passed(handle, context->is_bridge)) { | 162 | score = do_find_child_checks(handle, context->is_bridge); |
| 163 | if (score == FIND_CHILD_MAX_SCORE) { | ||
| 154 | context->ret = handle; | 164 | context->ret = handle; |
| 155 | return AE_CTRL_TERMINATE; | 165 | return AE_CTRL_TERMINATE; |
| 166 | } else if (score > context->ret_score) { | ||
| 167 | context->ret = handle; | ||
| 168 | context->ret_score = score; | ||
| 156 | } | 169 | } |
| 157 | return AE_OK; | 170 | return AE_OK; |
| 158 | } | 171 | } |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 61d090b6ce25..fbdb82e70d10 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -204,8 +204,6 @@ static int acpi_scan_hot_remove(struct acpi_device *device) | |||
| 204 | return -EINVAL; | 204 | return -EINVAL; |
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | lock_device_hotplug(); | ||
| 208 | |||
| 209 | /* | 207 | /* |
| 210 | * Carry out two passes here and ignore errors in the first pass, | 208 | * Carry out two passes here and ignore errors in the first pass, |
| 211 | * because if the devices in question are memory blocks and | 209 | * because if the devices in question are memory blocks and |
| @@ -236,9 +234,6 @@ static int acpi_scan_hot_remove(struct acpi_device *device) | |||
| 236 | ACPI_UINT32_MAX, | 234 | ACPI_UINT32_MAX, |
| 237 | acpi_bus_online_companions, NULL, | 235 | acpi_bus_online_companions, NULL, |
| 238 | NULL, NULL); | 236 | NULL, NULL); |
| 239 | |||
| 240 | unlock_device_hotplug(); | ||
| 241 | |||
| 242 | put_device(&device->dev); | 237 | put_device(&device->dev); |
| 243 | return -EBUSY; | 238 | return -EBUSY; |
| 244 | } | 239 | } |
| @@ -249,8 +244,6 @@ static int acpi_scan_hot_remove(struct acpi_device *device) | |||
| 249 | 244 | ||
| 250 | acpi_bus_trim(device); | 245 | acpi_bus_trim(device); |
| 251 | 246 | ||
| 252 | unlock_device_hotplug(); | ||
| 253 | |||
| 254 | /* Device node has been unregistered. */ | 247 | /* Device node has been unregistered. */ |
| 255 | put_device(&device->dev); | 248 | put_device(&device->dev); |
| 256 | device = NULL; | 249 | device = NULL; |
| @@ -289,6 +282,7 @@ static void acpi_bus_device_eject(void *context) | |||
| 289 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; | 282 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; |
| 290 | int error; | 283 | int error; |
| 291 | 284 | ||
| 285 | lock_device_hotplug(); | ||
| 292 | mutex_lock(&acpi_scan_lock); | 286 | mutex_lock(&acpi_scan_lock); |
| 293 | 287 | ||
| 294 | acpi_bus_get_device(handle, &device); | 288 | acpi_bus_get_device(handle, &device); |
| @@ -312,6 +306,7 @@ static void acpi_bus_device_eject(void *context) | |||
| 312 | 306 | ||
| 313 | out: | 307 | out: |
| 314 | mutex_unlock(&acpi_scan_lock); | 308 | mutex_unlock(&acpi_scan_lock); |
| 309 | unlock_device_hotplug(); | ||
| 315 | return; | 310 | return; |
| 316 | 311 | ||
| 317 | err_out: | 312 | err_out: |
| @@ -326,8 +321,8 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) | |||
| 326 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; | 321 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; |
| 327 | int error; | 322 | int error; |
| 328 | 323 | ||
| 329 | mutex_lock(&acpi_scan_lock); | ||
| 330 | lock_device_hotplug(); | 324 | lock_device_hotplug(); |
| 325 | mutex_lock(&acpi_scan_lock); | ||
| 331 | 326 | ||
| 332 | if (ost_source != ACPI_NOTIFY_BUS_CHECK) { | 327 | if (ost_source != ACPI_NOTIFY_BUS_CHECK) { |
| 333 | acpi_bus_get_device(handle, &device); | 328 | acpi_bus_get_device(handle, &device); |
| @@ -353,9 +348,9 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) | |||
| 353 | kobject_uevent(&device->dev.kobj, KOBJ_ONLINE); | 348 | kobject_uevent(&device->dev.kobj, KOBJ_ONLINE); |
| 354 | 349 | ||
| 355 | out: | 350 | out: |
| 356 | unlock_device_hotplug(); | ||
| 357 | acpi_evaluate_hotplug_ost(handle, ost_source, ost_code, NULL); | 351 | acpi_evaluate_hotplug_ost(handle, ost_source, ost_code, NULL); |
| 358 | mutex_unlock(&acpi_scan_lock); | 352 | mutex_unlock(&acpi_scan_lock); |
| 353 | unlock_device_hotplug(); | ||
| 359 | } | 354 | } |
| 360 | 355 | ||
| 361 | static void acpi_scan_bus_check(void *context) | 356 | static void acpi_scan_bus_check(void *context) |
| @@ -446,6 +441,7 @@ void acpi_bus_hot_remove_device(void *context) | |||
| 446 | acpi_handle handle = device->handle; | 441 | acpi_handle handle = device->handle; |
| 447 | int error; | 442 | int error; |
| 448 | 443 | ||
| 444 | lock_device_hotplug(); | ||
| 449 | mutex_lock(&acpi_scan_lock); | 445 | mutex_lock(&acpi_scan_lock); |
| 450 | 446 | ||
| 451 | error = acpi_scan_hot_remove(device); | 447 | error = acpi_scan_hot_remove(device); |
| @@ -455,6 +451,7 @@ void acpi_bus_hot_remove_device(void *context) | |||
| 455 | NULL); | 451 | NULL); |
| 456 | 452 | ||
| 457 | mutex_unlock(&acpi_scan_lock); | 453 | mutex_unlock(&acpi_scan_lock); |
| 454 | unlock_device_hotplug(); | ||
| 458 | kfree(context); | 455 | kfree(context); |
| 459 | } | 456 | } |
| 460 | EXPORT_SYMBOL(acpi_bus_hot_remove_device); | 457 | EXPORT_SYMBOL(acpi_bus_hot_remove_device); |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 5c75e3147a60..43c24aa756f6 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -280,13 +280,6 @@ static void __cpufreq_notify_transition(struct cpufreq_policy *policy, | |||
| 280 | switch (state) { | 280 | switch (state) { |
| 281 | 281 | ||
| 282 | case CPUFREQ_PRECHANGE: | 282 | case CPUFREQ_PRECHANGE: |
| 283 | if (WARN(policy->transition_ongoing == | ||
| 284 | cpumask_weight(policy->cpus), | ||
| 285 | "In middle of another frequency transition\n")) | ||
| 286 | return; | ||
| 287 | |||
| 288 | policy->transition_ongoing++; | ||
| 289 | |||
| 290 | /* detect if the driver reported a value as "old frequency" | 283 | /* detect if the driver reported a value as "old frequency" |
| 291 | * which is not equal to what the cpufreq core thinks is | 284 | * which is not equal to what the cpufreq core thinks is |
| 292 | * "old frequency". | 285 | * "old frequency". |
| @@ -306,12 +299,6 @@ static void __cpufreq_notify_transition(struct cpufreq_policy *policy, | |||
| 306 | break; | 299 | break; |
| 307 | 300 | ||
| 308 | case CPUFREQ_POSTCHANGE: | 301 | case CPUFREQ_POSTCHANGE: |
| 309 | if (WARN(!policy->transition_ongoing, | ||
| 310 | "No frequency transition in progress\n")) | ||
| 311 | return; | ||
| 312 | |||
| 313 | policy->transition_ongoing--; | ||
| 314 | |||
| 315 | adjust_jiffies(CPUFREQ_POSTCHANGE, freqs); | 302 | adjust_jiffies(CPUFREQ_POSTCHANGE, freqs); |
| 316 | pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new, | 303 | pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new, |
| 317 | (unsigned long)freqs->cpu); | 304 | (unsigned long)freqs->cpu); |
| @@ -437,7 +424,7 @@ static int __cpufreq_set_policy(struct cpufreq_policy *policy, | |||
| 437 | static ssize_t store_##file_name \ | 424 | static ssize_t store_##file_name \ |
| 438 | (struct cpufreq_policy *policy, const char *buf, size_t count) \ | 425 | (struct cpufreq_policy *policy, const char *buf, size_t count) \ |
| 439 | { \ | 426 | { \ |
| 440 | unsigned int ret; \ | 427 | int ret; \ |
| 441 | struct cpufreq_policy new_policy; \ | 428 | struct cpufreq_policy new_policy; \ |
| 442 | \ | 429 | \ |
| 443 | ret = cpufreq_get_policy(&new_policy, policy->cpu); \ | 430 | ret = cpufreq_get_policy(&new_policy, policy->cpu); \ |
| @@ -490,7 +477,7 @@ static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf) | |||
| 490 | static ssize_t store_scaling_governor(struct cpufreq_policy *policy, | 477 | static ssize_t store_scaling_governor(struct cpufreq_policy *policy, |
| 491 | const char *buf, size_t count) | 478 | const char *buf, size_t count) |
| 492 | { | 479 | { |
| 493 | unsigned int ret; | 480 | int ret; |
| 494 | char str_governor[16]; | 481 | char str_governor[16]; |
| 495 | struct cpufreq_policy new_policy; | 482 | struct cpufreq_policy new_policy; |
| 496 | 483 | ||
| @@ -694,8 +681,13 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr, | |||
| 694 | struct freq_attr *fattr = to_attr(attr); | 681 | struct freq_attr *fattr = to_attr(attr); |
| 695 | ssize_t ret = -EINVAL; | 682 | ssize_t ret = -EINVAL; |
| 696 | 683 | ||
| 684 | get_online_cpus(); | ||
| 685 | |||
| 686 | if (!cpu_online(policy->cpu)) | ||
| 687 | goto unlock; | ||
| 688 | |||
| 697 | if (!down_read_trylock(&cpufreq_rwsem)) | 689 | if (!down_read_trylock(&cpufreq_rwsem)) |
| 698 | goto exit; | 690 | goto unlock; |
| 699 | 691 | ||
| 700 | if (lock_policy_rwsem_write(policy->cpu) < 0) | 692 | if (lock_policy_rwsem_write(policy->cpu) < 0) |
| 701 | goto up_read; | 693 | goto up_read; |
| @@ -709,7 +701,9 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr, | |||
| 709 | 701 | ||
| 710 | up_read: | 702 | up_read: |
| 711 | up_read(&cpufreq_rwsem); | 703 | up_read(&cpufreq_rwsem); |
| 712 | exit: | 704 | unlock: |
| 705 | put_online_cpus(); | ||
| 706 | |||
| 713 | return ret; | 707 | return ret; |
| 714 | } | 708 | } |
| 715 | 709 | ||
| @@ -912,11 +906,11 @@ static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu) | |||
| 912 | struct cpufreq_policy *policy; | 906 | struct cpufreq_policy *policy; |
| 913 | unsigned long flags; | 907 | unsigned long flags; |
| 914 | 908 | ||
| 915 | write_lock_irqsave(&cpufreq_driver_lock, flags); | 909 | read_lock_irqsave(&cpufreq_driver_lock, flags); |
| 916 | 910 | ||
| 917 | policy = per_cpu(cpufreq_cpu_data_fallback, cpu); | 911 | policy = per_cpu(cpufreq_cpu_data_fallback, cpu); |
| 918 | 912 | ||
| 919 | write_unlock_irqrestore(&cpufreq_driver_lock, flags); | 913 | read_unlock_irqrestore(&cpufreq_driver_lock, flags); |
| 920 | 914 | ||
| 921 | return policy; | 915 | return policy; |
| 922 | } | 916 | } |
| @@ -953,6 +947,21 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy) | |||
| 953 | kfree(policy); | 947 | kfree(policy); |
| 954 | } | 948 | } |
| 955 | 949 | ||
| 950 | static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) | ||
| 951 | { | ||
| 952 | if (cpu == policy->cpu) | ||
| 953 | return; | ||
| 954 | |||
| 955 | policy->last_cpu = policy->cpu; | ||
| 956 | policy->cpu = cpu; | ||
| 957 | |||
| 958 | #ifdef CONFIG_CPU_FREQ_TABLE | ||
| 959 | cpufreq_frequency_table_update_policy_cpu(policy); | ||
| 960 | #endif | ||
| 961 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | ||
| 962 | CPUFREQ_UPDATE_POLICY_CPU, policy); | ||
| 963 | } | ||
| 964 | |||
| 956 | static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | 965 | static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, |
| 957 | bool frozen) | 966 | bool frozen) |
| 958 | { | 967 | { |
| @@ -1006,7 +1015,18 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1006 | if (!policy) | 1015 | if (!policy) |
| 1007 | goto nomem_out; | 1016 | goto nomem_out; |
| 1008 | 1017 | ||
| 1009 | policy->cpu = cpu; | 1018 | |
| 1019 | /* | ||
| 1020 | * In the resume path, since we restore a saved policy, the assignment | ||
| 1021 | * to policy->cpu is like an update of the existing policy, rather than | ||
| 1022 | * the creation of a brand new one. So we need to perform this update | ||
| 1023 | * by invoking update_policy_cpu(). | ||
| 1024 | */ | ||
| 1025 | if (frozen && cpu != policy->cpu) | ||
| 1026 | update_policy_cpu(policy, cpu); | ||
| 1027 | else | ||
| 1028 | policy->cpu = cpu; | ||
| 1029 | |||
| 1010 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; | 1030 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; |
| 1011 | cpumask_copy(policy->cpus, cpumask_of(cpu)); | 1031 | cpumask_copy(policy->cpus, cpumask_of(cpu)); |
| 1012 | 1032 | ||
| @@ -1098,18 +1118,6 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif) | |||
| 1098 | return __cpufreq_add_dev(dev, sif, false); | 1118 | return __cpufreq_add_dev(dev, sif, false); |
| 1099 | } | 1119 | } |
| 1100 | 1120 | ||
| 1101 | static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) | ||
| 1102 | { | ||
| 1103 | policy->last_cpu = policy->cpu; | ||
| 1104 | policy->cpu = cpu; | ||
| 1105 | |||
| 1106 | #ifdef CONFIG_CPU_FREQ_TABLE | ||
| 1107 | cpufreq_frequency_table_update_policy_cpu(policy); | ||
| 1108 | #endif | ||
| 1109 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | ||
| 1110 | CPUFREQ_UPDATE_POLICY_CPU, policy); | ||
| 1111 | } | ||
| 1112 | |||
| 1113 | static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy, | 1121 | static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy, |
| 1114 | unsigned int old_cpu, bool frozen) | 1122 | unsigned int old_cpu, bool frozen) |
| 1115 | { | 1123 | { |
| @@ -1141,22 +1149,14 @@ static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy, | |||
| 1141 | return cpu_dev->id; | 1149 | return cpu_dev->id; |
| 1142 | } | 1150 | } |
| 1143 | 1151 | ||
| 1144 | /** | 1152 | static int __cpufreq_remove_dev_prepare(struct device *dev, |
| 1145 | * __cpufreq_remove_dev - remove a CPU device | 1153 | struct subsys_interface *sif, |
| 1146 | * | 1154 | bool frozen) |
| 1147 | * Removes the cpufreq interface for a CPU device. | ||
| 1148 | * Caller should already have policy_rwsem in write mode for this CPU. | ||
| 1149 | * This routine frees the rwsem before returning. | ||
| 1150 | */ | ||
| 1151 | static int __cpufreq_remove_dev(struct device *dev, | ||
| 1152 | struct subsys_interface *sif, bool frozen) | ||
| 1153 | { | 1155 | { |
| 1154 | unsigned int cpu = dev->id, cpus; | 1156 | unsigned int cpu = dev->id, cpus; |
| 1155 | int new_cpu, ret; | 1157 | int new_cpu, ret; |
| 1156 | unsigned long flags; | 1158 | unsigned long flags; |
| 1157 | struct cpufreq_policy *policy; | 1159 | struct cpufreq_policy *policy; |
| 1158 | struct kobject *kobj; | ||
| 1159 | struct completion *cmp; | ||
| 1160 | 1160 | ||
| 1161 | pr_debug("%s: unregistering CPU %u\n", __func__, cpu); | 1161 | pr_debug("%s: unregistering CPU %u\n", __func__, cpu); |
| 1162 | 1162 | ||
| @@ -1196,8 +1196,9 @@ static int __cpufreq_remove_dev(struct device *dev, | |||
| 1196 | cpumask_clear_cpu(cpu, policy->cpus); | 1196 | cpumask_clear_cpu(cpu, policy->cpus); |
| 1197 | unlock_policy_rwsem_write(cpu); | 1197 | unlock_policy_rwsem_write(cpu); |
| 1198 | 1198 | ||
| 1199 | if (cpu != policy->cpu && !frozen) { | 1199 | if (cpu != policy->cpu) { |
| 1200 | sysfs_remove_link(&dev->kobj, "cpufreq"); | 1200 | if (!frozen) |
| 1201 | sysfs_remove_link(&dev->kobj, "cpufreq"); | ||
| 1201 | } else if (cpus > 1) { | 1202 | } else if (cpus > 1) { |
| 1202 | 1203 | ||
| 1203 | new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu, frozen); | 1204 | new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu, frozen); |
| @@ -1213,6 +1214,33 @@ static int __cpufreq_remove_dev(struct device *dev, | |||
| 1213 | } | 1214 | } |
| 1214 | } | 1215 | } |
| 1215 | 1216 | ||
| 1217 | return 0; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | static int __cpufreq_remove_dev_finish(struct device *dev, | ||
| 1221 | struct subsys_interface *sif, | ||
| 1222 | bool frozen) | ||
| 1223 | { | ||
| 1224 | unsigned int cpu = dev->id, cpus; | ||
| 1225 | int ret; | ||
| 1226 | unsigned long flags; | ||
| 1227 | struct cpufreq_policy *policy; | ||
| 1228 | struct kobject *kobj; | ||
| 1229 | struct completion *cmp; | ||
| 1230 | |||
| 1231 | read_lock_irqsave(&cpufreq_driver_lock, flags); | ||
| 1232 | policy = per_cpu(cpufreq_cpu_data, cpu); | ||
| 1233 | read_unlock_irqrestore(&cpufreq_driver_lock, flags); | ||
| 1234 | |||
| 1235 | if (!policy) { | ||
| 1236 | pr_debug("%s: No cpu_data found\n", __func__); | ||
| 1237 | return -EINVAL; | ||
| 1238 | } | ||
| 1239 | |||
| 1240 | lock_policy_rwsem_read(cpu); | ||
| 1241 | cpus = cpumask_weight(policy->cpus); | ||
| 1242 | unlock_policy_rwsem_read(cpu); | ||
| 1243 | |||
| 1216 | /* If cpu is last user of policy, free policy */ | 1244 | /* If cpu is last user of policy, free policy */ |
| 1217 | if (cpus == 1) { | 1245 | if (cpus == 1) { |
| 1218 | if (cpufreq_driver->target) { | 1246 | if (cpufreq_driver->target) { |
| @@ -1272,6 +1300,27 @@ static int __cpufreq_remove_dev(struct device *dev, | |||
| 1272 | return 0; | 1300 | return 0; |
| 1273 | } | 1301 | } |
| 1274 | 1302 | ||
| 1303 | /** | ||
| 1304 | * __cpufreq_remove_dev - remove a CPU device | ||
| 1305 | * | ||
| 1306 | * Removes the cpufreq interface for a CPU device. | ||
| 1307 | * Caller should already have policy_rwsem in write mode for this CPU. | ||
| 1308 | * This routine frees the rwsem before returning. | ||
| 1309 | */ | ||
| 1310 | static inline int __cpufreq_remove_dev(struct device *dev, | ||
| 1311 | struct subsys_interface *sif, | ||
| 1312 | bool frozen) | ||
| 1313 | { | ||
| 1314 | int ret; | ||
| 1315 | |||
| 1316 | ret = __cpufreq_remove_dev_prepare(dev, sif, frozen); | ||
| 1317 | |||
| 1318 | if (!ret) | ||
| 1319 | ret = __cpufreq_remove_dev_finish(dev, sif, frozen); | ||
| 1320 | |||
| 1321 | return ret; | ||
| 1322 | } | ||
| 1323 | |||
| 1275 | static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) | 1324 | static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) |
| 1276 | { | 1325 | { |
| 1277 | unsigned int cpu = dev->id; | 1326 | unsigned int cpu = dev->id; |
| @@ -1610,8 +1659,6 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
| 1610 | 1659 | ||
| 1611 | if (cpufreq_disabled()) | 1660 | if (cpufreq_disabled()) |
| 1612 | return -ENODEV; | 1661 | return -ENODEV; |
| 1613 | if (policy->transition_ongoing) | ||
| 1614 | return -EBUSY; | ||
| 1615 | 1662 | ||
| 1616 | /* Make sure that target_freq is within supported range */ | 1663 | /* Make sure that target_freq is within supported range */ |
| 1617 | if (target_freq > policy->max) | 1664 | if (target_freq > policy->max) |
| @@ -1692,8 +1739,9 @@ static int __cpufreq_governor(struct cpufreq_policy *policy, | |||
| 1692 | policy->cpu, event); | 1739 | policy->cpu, event); |
| 1693 | 1740 | ||
| 1694 | mutex_lock(&cpufreq_governor_lock); | 1741 | mutex_lock(&cpufreq_governor_lock); |
| 1695 | if ((!policy->governor_enabled && (event == CPUFREQ_GOV_STOP)) || | 1742 | if ((policy->governor_enabled && event == CPUFREQ_GOV_START) |
| 1696 | (policy->governor_enabled && (event == CPUFREQ_GOV_START))) { | 1743 | || (!policy->governor_enabled |
| 1744 | && (event == CPUFREQ_GOV_LIMITS || event == CPUFREQ_GOV_STOP))) { | ||
| 1697 | mutex_unlock(&cpufreq_governor_lock); | 1745 | mutex_unlock(&cpufreq_governor_lock); |
| 1698 | return -EBUSY; | 1746 | return -EBUSY; |
| 1699 | } | 1747 | } |
| @@ -1994,7 +2042,11 @@ static int cpufreq_cpu_callback(struct notifier_block *nfb, | |||
| 1994 | break; | 2042 | break; |
| 1995 | 2043 | ||
| 1996 | case CPU_DOWN_PREPARE: | 2044 | case CPU_DOWN_PREPARE: |
| 1997 | __cpufreq_remove_dev(dev, NULL, frozen); | 2045 | __cpufreq_remove_dev_prepare(dev, NULL, frozen); |
| 2046 | break; | ||
| 2047 | |||
| 2048 | case CPU_POST_DEAD: | ||
| 2049 | __cpufreq_remove_dev_finish(dev, NULL, frozen); | ||
| 1998 | break; | 2050 | break; |
| 1999 | 2051 | ||
| 2000 | case CPU_DOWN_FAILED: | 2052 | case CPU_DOWN_FAILED: |
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 04452f026ed0..4cf0d2805cb2 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
| @@ -74,7 +74,7 @@ static ssize_t show_time_in_state(struct cpufreq_policy *policy, char *buf) | |||
| 74 | for (i = 0; i < stat->state_num; i++) { | 74 | for (i = 0; i < stat->state_num; i++) { |
| 75 | len += sprintf(buf + len, "%u %llu\n", stat->freq_table[i], | 75 | len += sprintf(buf + len, "%u %llu\n", stat->freq_table[i], |
| 76 | (unsigned long long) | 76 | (unsigned long long) |
| 77 | cputime64_to_clock_t(stat->time_in_state[i])); | 77 | jiffies_64_to_clock_t(stat->time_in_state[i])); |
| 78 | } | 78 | } |
| 79 | return len; | 79 | return len; |
| 80 | } | 80 | } |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 6efd96c196b2..9733f29ed148 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
| @@ -522,6 +522,11 @@ static const struct x86_cpu_id intel_pstate_cpu_ids[] = { | |||
| 522 | ICPU(0x2a, default_policy), | 522 | ICPU(0x2a, default_policy), |
| 523 | ICPU(0x2d, default_policy), | 523 | ICPU(0x2d, default_policy), |
| 524 | ICPU(0x3a, default_policy), | 524 | ICPU(0x3a, default_policy), |
| 525 | ICPU(0x3c, default_policy), | ||
| 526 | ICPU(0x3e, default_policy), | ||
| 527 | ICPU(0x3f, default_policy), | ||
| 528 | ICPU(0x45, default_policy), | ||
| 529 | ICPU(0x46, default_policy), | ||
| 525 | {} | 530 | {} |
| 526 | }; | 531 | }; |
| 527 | MODULE_DEVICE_TABLE(x86cpu, intel_pstate_cpu_ids); | 532 | MODULE_DEVICE_TABLE(x86cpu, intel_pstate_cpu_ids); |
diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 3ac499d5a207..6e11701f0fca 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c | |||
| @@ -331,7 +331,8 @@ struct cpuidle_driver *cpuidle_driver_ref(void) | |||
| 331 | spin_lock(&cpuidle_driver_lock); | 331 | spin_lock(&cpuidle_driver_lock); |
| 332 | 332 | ||
| 333 | drv = cpuidle_get_driver(); | 333 | drv = cpuidle_get_driver(); |
| 334 | drv->refcnt++; | 334 | if (drv) |
| 335 | drv->refcnt++; | ||
| 335 | 336 | ||
| 336 | spin_unlock(&cpuidle_driver_lock); | 337 | spin_unlock(&cpuidle_driver_lock); |
| 337 | return drv; | 338 | return drv; |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index f6488adf3af1..0b7d23b4ad95 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -487,7 +487,6 @@ static void acpiphp_bus_add(acpi_handle handle) | |||
| 487 | { | 487 | { |
| 488 | struct acpi_device *adev = NULL; | 488 | struct acpi_device *adev = NULL; |
| 489 | 489 | ||
| 490 | acpiphp_bus_trim(handle); | ||
| 491 | acpi_bus_scan(handle); | 490 | acpi_bus_scan(handle); |
| 492 | acpi_bus_get_device(handle, &adev); | 491 | acpi_bus_get_device(handle, &adev); |
| 493 | if (adev) | 492 | if (adev) |
| @@ -529,6 +528,16 @@ static void check_hotplug_bridge(struct acpiphp_slot *slot, struct pci_dev *dev) | |||
| 529 | } | 528 | } |
| 530 | } | 529 | } |
| 531 | 530 | ||
| 531 | static int acpiphp_rescan_slot(struct acpiphp_slot *slot) | ||
| 532 | { | ||
| 533 | struct acpiphp_func *func; | ||
| 534 | |||
| 535 | list_for_each_entry(func, &slot->funcs, sibling) | ||
| 536 | acpiphp_bus_add(func_to_handle(func)); | ||
| 537 | |||
| 538 | return pci_scan_slot(slot->bus, PCI_DEVFN(slot->device, 0)); | ||
| 539 | } | ||
| 540 | |||
| 532 | /** | 541 | /** |
| 533 | * enable_slot - enable, configure a slot | 542 | * enable_slot - enable, configure a slot |
| 534 | * @slot: slot to be enabled | 543 | * @slot: slot to be enabled |
| @@ -543,12 +552,9 @@ static void __ref enable_slot(struct acpiphp_slot *slot) | |||
| 543 | struct acpiphp_func *func; | 552 | struct acpiphp_func *func; |
| 544 | int max, pass; | 553 | int max, pass; |
| 545 | LIST_HEAD(add_list); | 554 | LIST_HEAD(add_list); |
| 555 | int nr_found; | ||
| 546 | 556 | ||
| 547 | list_for_each_entry(func, &slot->funcs, sibling) | 557 | nr_found = acpiphp_rescan_slot(slot); |
| 548 | acpiphp_bus_add(func_to_handle(func)); | ||
| 549 | |||
| 550 | pci_scan_slot(bus, PCI_DEVFN(slot->device, 0)); | ||
| 551 | |||
| 552 | max = acpiphp_max_busnr(bus); | 558 | max = acpiphp_max_busnr(bus); |
| 553 | for (pass = 0; pass < 2; pass++) { | 559 | for (pass = 0; pass < 2; pass++) { |
| 554 | list_for_each_entry(dev, &bus->devices, bus_list) { | 560 | list_for_each_entry(dev, &bus->devices, bus_list) { |
| @@ -567,8 +573,11 @@ static void __ref enable_slot(struct acpiphp_slot *slot) | |||
| 567 | } | 573 | } |
| 568 | } | 574 | } |
| 569 | } | 575 | } |
| 570 | |||
| 571 | __pci_bus_assign_resources(bus, &add_list, NULL); | 576 | __pci_bus_assign_resources(bus, &add_list, NULL); |
| 577 | /* Nothing more to do here if there are no new devices on this bus. */ | ||
| 578 | if (!nr_found && (slot->flags & SLOT_ENABLED)) | ||
| 579 | return; | ||
| 580 | |||
| 572 | acpiphp_sanitize_bus(bus); | 581 | acpiphp_sanitize_bus(bus); |
| 573 | acpiphp_set_hpp_values(bus); | 582 | acpiphp_set_hpp_values(bus); |
| 574 | acpiphp_set_acpi_region(slot); | 583 | acpiphp_set_acpi_region(slot); |
| @@ -837,11 +846,22 @@ static void hotplug_event(acpi_handle handle, u32 type, void *data) | |||
| 837 | case ACPI_NOTIFY_DEVICE_CHECK: | 846 | case ACPI_NOTIFY_DEVICE_CHECK: |
| 838 | /* device check */ | 847 | /* device check */ |
| 839 | dbg("%s: Device check notify on %s\n", __func__, objname); | 848 | dbg("%s: Device check notify on %s\n", __func__, objname); |
| 840 | if (bridge) | 849 | if (bridge) { |
| 841 | acpiphp_check_bridge(bridge); | 850 | acpiphp_check_bridge(bridge); |
| 842 | else | 851 | } else { |
| 843 | acpiphp_check_bridge(func->parent); | 852 | struct acpiphp_slot *slot = func->slot; |
| 853 | int ret; | ||
| 844 | 854 | ||
| 855 | /* | ||
| 856 | * Check if anything has changed in the slot and rescan | ||
| 857 | * from the parent if that's the case. | ||
| 858 | */ | ||
| 859 | mutex_lock(&slot->crit_sect); | ||
| 860 | ret = acpiphp_rescan_slot(slot); | ||
| 861 | mutex_unlock(&slot->crit_sect); | ||
| 862 | if (ret) | ||
| 863 | acpiphp_check_bridge(func->parent); | ||
| 864 | } | ||
| 845 | break; | 865 | break; |
| 846 | 866 | ||
| 847 | case ACPI_NOTIFY_EJECT_REQUEST: | 867 | case ACPI_NOTIFY_EJECT_REQUEST: |
| @@ -867,6 +887,8 @@ static void hotplug_event_work(struct work_struct *work) | |||
| 867 | hotplug_event(hp_work->handle, hp_work->type, context); | 887 | hotplug_event(hp_work->handle, hp_work->type, context); |
| 868 | 888 | ||
| 869 | acpi_scan_lock_release(); | 889 | acpi_scan_lock_release(); |
| 890 | acpi_evaluate_hotplug_ost(hp_work->handle, hp_work->type, | ||
| 891 | ACPI_OST_SC_SUCCESS, NULL); | ||
| 870 | kfree(hp_work); /* allocated in handle_hotplug_event() */ | 892 | kfree(hp_work); /* allocated in handle_hotplug_event() */ |
| 871 | put_bridge(context->func.parent); | 893 | put_bridge(context->func.parent); |
| 872 | } | 894 | } |
| @@ -882,11 +904,15 @@ static void hotplug_event_work(struct work_struct *work) | |||
| 882 | static void handle_hotplug_event(acpi_handle handle, u32 type, void *data) | 904 | static void handle_hotplug_event(acpi_handle handle, u32 type, void *data) |
| 883 | { | 905 | { |
| 884 | struct acpiphp_context *context; | 906 | struct acpiphp_context *context; |
| 907 | u32 ost_code = ACPI_OST_SC_SUCCESS; | ||
| 885 | 908 | ||
| 886 | switch (type) { | 909 | switch (type) { |
| 887 | case ACPI_NOTIFY_BUS_CHECK: | 910 | case ACPI_NOTIFY_BUS_CHECK: |
| 888 | case ACPI_NOTIFY_DEVICE_CHECK: | 911 | case ACPI_NOTIFY_DEVICE_CHECK: |
| 912 | break; | ||
| 889 | case ACPI_NOTIFY_EJECT_REQUEST: | 913 | case ACPI_NOTIFY_EJECT_REQUEST: |
| 914 | ost_code = ACPI_OST_SC_EJECT_IN_PROGRESS; | ||
| 915 | acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL); | ||
| 890 | break; | 916 | break; |
| 891 | 917 | ||
| 892 | case ACPI_NOTIFY_DEVICE_WAKE: | 918 | case ACPI_NOTIFY_DEVICE_WAKE: |
| @@ -895,20 +921,21 @@ static void handle_hotplug_event(acpi_handle handle, u32 type, void *data) | |||
| 895 | case ACPI_NOTIFY_FREQUENCY_MISMATCH: | 921 | case ACPI_NOTIFY_FREQUENCY_MISMATCH: |
| 896 | acpi_handle_err(handle, "Device cannot be configured due " | 922 | acpi_handle_err(handle, "Device cannot be configured due " |
| 897 | "to a frequency mismatch\n"); | 923 | "to a frequency mismatch\n"); |
| 898 | return; | 924 | goto out; |
| 899 | 925 | ||
| 900 | case ACPI_NOTIFY_BUS_MODE_MISMATCH: | 926 | case ACPI_NOTIFY_BUS_MODE_MISMATCH: |
| 901 | acpi_handle_err(handle, "Device cannot be configured due " | 927 | acpi_handle_err(handle, "Device cannot be configured due " |
| 902 | "to a bus mode mismatch\n"); | 928 | "to a bus mode mismatch\n"); |
| 903 | return; | 929 | goto out; |
| 904 | 930 | ||
| 905 | case ACPI_NOTIFY_POWER_FAULT: | 931 | case ACPI_NOTIFY_POWER_FAULT: |
| 906 | acpi_handle_err(handle, "Device has suffered a power fault\n"); | 932 | acpi_handle_err(handle, "Device has suffered a power fault\n"); |
| 907 | return; | 933 | goto out; |
| 908 | 934 | ||
| 909 | default: | 935 | default: |
| 910 | acpi_handle_warn(handle, "Unsupported event type 0x%x\n", type); | 936 | acpi_handle_warn(handle, "Unsupported event type 0x%x\n", type); |
| 911 | return; | 937 | ost_code = ACPI_OST_SC_UNRECOGNIZED_NOTIFY; |
| 938 | goto out; | ||
| 912 | } | 939 | } |
| 913 | 940 | ||
| 914 | mutex_lock(&acpiphp_context_lock); | 941 | mutex_lock(&acpiphp_context_lock); |
| @@ -917,8 +944,14 @@ static void handle_hotplug_event(acpi_handle handle, u32 type, void *data) | |||
| 917 | get_bridge(context->func.parent); | 944 | get_bridge(context->func.parent); |
| 918 | acpiphp_put_context(context); | 945 | acpiphp_put_context(context); |
| 919 | alloc_acpi_hp_work(handle, type, context, hotplug_event_work); | 946 | alloc_acpi_hp_work(handle, type, context, hotplug_event_work); |
| 947 | mutex_unlock(&acpiphp_context_lock); | ||
| 948 | return; | ||
| 920 | } | 949 | } |
| 921 | mutex_unlock(&acpiphp_context_lock); | 950 | mutex_unlock(&acpiphp_context_lock); |
| 951 | ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; | ||
| 952 | |||
| 953 | out: | ||
| 954 | acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL); | ||
| 922 | } | 955 | } |
| 923 | 956 | ||
| 924 | /* | 957 | /* |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index d568f3975eeb..fcabc42d66ab 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -85,7 +85,6 @@ struct cpufreq_policy { | |||
| 85 | struct list_head policy_list; | 85 | struct list_head policy_list; |
| 86 | struct kobject kobj; | 86 | struct kobject kobj; |
| 87 | struct completion kobj_unregister; | 87 | struct completion kobj_unregister; |
| 88 | int transition_ongoing; /* Tracks transition status */ | ||
| 89 | }; | 88 | }; |
| 90 | 89 | ||
| 91 | /* Only for ACPI */ | 90 | /* Only for ACPI */ |
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 3085e62a80a5..c9c759d5a15c 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
| @@ -644,22 +644,23 @@ int hibernate(void) | |||
| 644 | if (error) | 644 | if (error) |
| 645 | goto Exit; | 645 | goto Exit; |
| 646 | 646 | ||
| 647 | /* Allocate memory management structures */ | ||
| 648 | error = create_basic_memory_bitmaps(); | ||
| 649 | if (error) | ||
| 650 | goto Exit; | ||
| 651 | |||
| 652 | printk(KERN_INFO "PM: Syncing filesystems ... "); | 647 | printk(KERN_INFO "PM: Syncing filesystems ... "); |
| 653 | sys_sync(); | 648 | sys_sync(); |
| 654 | printk("done.\n"); | 649 | printk("done.\n"); |
| 655 | 650 | ||
| 656 | error = freeze_processes(); | 651 | error = freeze_processes(); |
| 657 | if (error) | 652 | if (error) |
| 658 | goto Free_bitmaps; | 653 | goto Exit; |
| 654 | |||
| 655 | lock_device_hotplug(); | ||
| 656 | /* Allocate memory management structures */ | ||
| 657 | error = create_basic_memory_bitmaps(); | ||
| 658 | if (error) | ||
| 659 | goto Thaw; | ||
| 659 | 660 | ||
| 660 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); | 661 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); |
| 661 | if (error || freezer_test_done) | 662 | if (error || freezer_test_done) |
| 662 | goto Thaw; | 663 | goto Free_bitmaps; |
| 663 | 664 | ||
| 664 | if (in_suspend) { | 665 | if (in_suspend) { |
| 665 | unsigned int flags = 0; | 666 | unsigned int flags = 0; |
| @@ -682,14 +683,14 @@ int hibernate(void) | |||
| 682 | pr_debug("PM: Image restored successfully.\n"); | 683 | pr_debug("PM: Image restored successfully.\n"); |
| 683 | } | 684 | } |
| 684 | 685 | ||
| 686 | Free_bitmaps: | ||
| 687 | free_basic_memory_bitmaps(); | ||
| 685 | Thaw: | 688 | Thaw: |
| 689 | unlock_device_hotplug(); | ||
| 686 | thaw_processes(); | 690 | thaw_processes(); |
| 687 | 691 | ||
| 688 | /* Don't bother checking whether freezer_test_done is true */ | 692 | /* Don't bother checking whether freezer_test_done is true */ |
| 689 | freezer_test_done = false; | 693 | freezer_test_done = false; |
| 690 | |||
| 691 | Free_bitmaps: | ||
| 692 | free_basic_memory_bitmaps(); | ||
| 693 | Exit: | 694 | Exit: |
| 694 | pm_notifier_call_chain(PM_POST_HIBERNATION); | 695 | pm_notifier_call_chain(PM_POST_HIBERNATION); |
| 695 | pm_restore_console(); | 696 | pm_restore_console(); |
| @@ -806,21 +807,20 @@ static int software_resume(void) | |||
| 806 | pm_prepare_console(); | 807 | pm_prepare_console(); |
| 807 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); | 808 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); |
| 808 | if (error) | 809 | if (error) |
| 809 | goto close_finish; | 810 | goto Close_Finish; |
| 810 | |||
| 811 | error = create_basic_memory_bitmaps(); | ||
| 812 | if (error) | ||
| 813 | goto close_finish; | ||
| 814 | 811 | ||
| 815 | pr_debug("PM: Preparing processes for restore.\n"); | 812 | pr_debug("PM: Preparing processes for restore.\n"); |
| 816 | error = freeze_processes(); | 813 | error = freeze_processes(); |
| 817 | if (error) { | 814 | if (error) |
| 818 | swsusp_close(FMODE_READ); | 815 | goto Close_Finish; |
| 819 | goto Done; | ||
| 820 | } | ||
| 821 | 816 | ||
| 822 | pr_debug("PM: Loading hibernation image.\n"); | 817 | pr_debug("PM: Loading hibernation image.\n"); |
| 823 | 818 | ||
| 819 | lock_device_hotplug(); | ||
| 820 | error = create_basic_memory_bitmaps(); | ||
| 821 | if (error) | ||
| 822 | goto Thaw; | ||
| 823 | |||
| 824 | error = swsusp_read(&flags); | 824 | error = swsusp_read(&flags); |
| 825 | swsusp_close(FMODE_READ); | 825 | swsusp_close(FMODE_READ); |
| 826 | if (!error) | 826 | if (!error) |
| @@ -828,9 +828,10 @@ static int software_resume(void) | |||
| 828 | 828 | ||
| 829 | printk(KERN_ERR "PM: Failed to load hibernation image, recovering.\n"); | 829 | printk(KERN_ERR "PM: Failed to load hibernation image, recovering.\n"); |
| 830 | swsusp_free(); | 830 | swsusp_free(); |
| 831 | thaw_processes(); | ||
| 832 | Done: | ||
| 833 | free_basic_memory_bitmaps(); | 831 | free_basic_memory_bitmaps(); |
| 832 | Thaw: | ||
| 833 | unlock_device_hotplug(); | ||
| 834 | thaw_processes(); | ||
| 834 | Finish: | 835 | Finish: |
| 835 | pm_notifier_call_chain(PM_POST_RESTORE); | 836 | pm_notifier_call_chain(PM_POST_RESTORE); |
| 836 | pm_restore_console(); | 837 | pm_restore_console(); |
| @@ -840,7 +841,7 @@ static int software_resume(void) | |||
| 840 | mutex_unlock(&pm_mutex); | 841 | mutex_unlock(&pm_mutex); |
| 841 | pr_debug("PM: Hibernation image not present or could not be loaded.\n"); | 842 | pr_debug("PM: Hibernation image not present or could not be loaded.\n"); |
| 842 | return error; | 843 | return error; |
| 843 | close_finish: | 844 | Close_Finish: |
| 844 | swsusp_close(FMODE_READ); | 845 | swsusp_close(FMODE_READ); |
| 845 | goto Finish; | 846 | goto Finish; |
| 846 | } | 847 | } |
diff --git a/kernel/power/user.c b/kernel/power/user.c index 4ed81e74f86f..72e8f4fd616d 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -60,11 +60,6 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
| 60 | error = -ENOSYS; | 60 | error = -ENOSYS; |
| 61 | goto Unlock; | 61 | goto Unlock; |
| 62 | } | 62 | } |
| 63 | if(create_basic_memory_bitmaps()) { | ||
| 64 | atomic_inc(&snapshot_device_available); | ||
| 65 | error = -ENOMEM; | ||
| 66 | goto Unlock; | ||
| 67 | } | ||
| 68 | nonseekable_open(inode, filp); | 63 | nonseekable_open(inode, filp); |
| 69 | data = &snapshot_state; | 64 | data = &snapshot_state; |
| 70 | filp->private_data = data; | 65 | filp->private_data = data; |
| @@ -90,10 +85,9 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
| 90 | if (error) | 85 | if (error) |
| 91 | pm_notifier_call_chain(PM_POST_RESTORE); | 86 | pm_notifier_call_chain(PM_POST_RESTORE); |
| 92 | } | 87 | } |
| 93 | if (error) { | 88 | if (error) |
| 94 | free_basic_memory_bitmaps(); | ||
| 95 | atomic_inc(&snapshot_device_available); | 89 | atomic_inc(&snapshot_device_available); |
| 96 | } | 90 | |
| 97 | data->frozen = 0; | 91 | data->frozen = 0; |
| 98 | data->ready = 0; | 92 | data->ready = 0; |
| 99 | data->platform_support = 0; | 93 | data->platform_support = 0; |
| @@ -111,11 +105,11 @@ static int snapshot_release(struct inode *inode, struct file *filp) | |||
| 111 | lock_system_sleep(); | 105 | lock_system_sleep(); |
| 112 | 106 | ||
| 113 | swsusp_free(); | 107 | swsusp_free(); |
| 114 | free_basic_memory_bitmaps(); | ||
| 115 | data = filp->private_data; | 108 | data = filp->private_data; |
| 116 | free_all_swap_pages(data->swap); | 109 | free_all_swap_pages(data->swap); |
| 117 | if (data->frozen) { | 110 | if (data->frozen) { |
| 118 | pm_restore_gfp_mask(); | 111 | pm_restore_gfp_mask(); |
| 112 | free_basic_memory_bitmaps(); | ||
| 119 | thaw_processes(); | 113 | thaw_processes(); |
| 120 | } | 114 | } |
| 121 | pm_notifier_call_chain(data->mode == O_RDONLY ? | 115 | pm_notifier_call_chain(data->mode == O_RDONLY ? |
| @@ -207,6 +201,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 207 | if (!mutex_trylock(&pm_mutex)) | 201 | if (!mutex_trylock(&pm_mutex)) |
| 208 | return -EBUSY; | 202 | return -EBUSY; |
| 209 | 203 | ||
| 204 | lock_device_hotplug(); | ||
| 210 | data = filp->private_data; | 205 | data = filp->private_data; |
| 211 | 206 | ||
| 212 | switch (cmd) { | 207 | switch (cmd) { |
| @@ -220,14 +215,22 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 220 | printk("done.\n"); | 215 | printk("done.\n"); |
| 221 | 216 | ||
| 222 | error = freeze_processes(); | 217 | error = freeze_processes(); |
| 223 | if (!error) | 218 | if (error) |
| 219 | break; | ||
| 220 | |||
| 221 | error = create_basic_memory_bitmaps(); | ||
| 222 | if (error) | ||
| 223 | thaw_processes(); | ||
| 224 | else | ||
| 224 | data->frozen = 1; | 225 | data->frozen = 1; |
| 226 | |||
| 225 | break; | 227 | break; |
| 226 | 228 | ||
| 227 | case SNAPSHOT_UNFREEZE: | 229 | case SNAPSHOT_UNFREEZE: |
| 228 | if (!data->frozen || data->ready) | 230 | if (!data->frozen || data->ready) |
| 229 | break; | 231 | break; |
| 230 | pm_restore_gfp_mask(); | 232 | pm_restore_gfp_mask(); |
| 233 | free_basic_memory_bitmaps(); | ||
| 231 | thaw_processes(); | 234 | thaw_processes(); |
| 232 | data->frozen = 0; | 235 | data->frozen = 0; |
| 233 | break; | 236 | break; |
| @@ -371,6 +374,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 371 | 374 | ||
| 372 | } | 375 | } |
| 373 | 376 | ||
| 377 | unlock_device_hotplug(); | ||
| 374 | mutex_unlock(&pm_mutex); | 378 | mutex_unlock(&pm_mutex); |
| 375 | 379 | ||
| 376 | return error; | 380 | return error; |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 0eb1a1df649d..ed85fe3870e2 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -52,14 +52,10 @@ DEFINE_MUTEX(mem_hotplug_mutex); | |||
| 52 | void lock_memory_hotplug(void) | 52 | void lock_memory_hotplug(void) |
| 53 | { | 53 | { |
| 54 | mutex_lock(&mem_hotplug_mutex); | 54 | mutex_lock(&mem_hotplug_mutex); |
| 55 | |||
| 56 | /* for exclusive hibernation if CONFIG_HIBERNATION=y */ | ||
| 57 | lock_system_sleep(); | ||
| 58 | } | 55 | } |
| 59 | 56 | ||
| 60 | void unlock_memory_hotplug(void) | 57 | void unlock_memory_hotplug(void) |
| 61 | { | 58 | { |
| 62 | unlock_system_sleep(); | ||
| 63 | mutex_unlock(&mem_hotplug_mutex); | 59 | mutex_unlock(&mem_hotplug_mutex); |
| 64 | } | 60 | } |
| 65 | 61 | ||
