Pull xen bug fixes from David Vrabel: - Fix two bugs in the handling of xenbus transactions. - Make the xen acpi driver compatible with Xen 4.7. * tag 'for-linus-4.7b-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: xen/acpi: allow xen-acpi-processor driver to load on Xen 4.7 xenbus: simplify xenbus_dev_request_and_reply() xenbus: don't bail early from xenbus_dev_request_and_reply() xenbus: don't BUG() on user mode induced condition
Unified · Split
| @@ -423,36 +423,7 @@ upload: · 422 unmodified lines | ||
| 423 | 423 | |
| 424 | 424 | return 0; |
| 425 | 425 | } |
| 426 | −static int __init check_prereq(void) | |
| 427 | −{ | |
| 428 | − struct cpuinfo_x86 *c = &cpu_data(0); | |
| 429 | − | |
| 430 | − if (!xen_initial_domain()) | |
| 431 | − return -ENODEV; | |
| 432 | − | |
| 433 | − if (!acpi_gbl_FADT.smi_command) | |
| 434 | − return -ENODEV; | |
| 435 | − | |
| 436 | − if (c->x86_vendor == X86_VENDOR_INTEL) { | |
| 437 | − if (!cpu_has(c, X86_FEATURE_EST)) | |
| 438 | − return -ENODEV; | |
| 439 | 426 | |
| 440 | − return 0; | |
| 441 | − } | |
| 442 | − if (c->x86_vendor == X86_VENDOR_AMD) { | |
| 443 | − /* Copied from powernow-k8.h, can't include ../cpufreq/powernow | |
| 444 | − * as we get compile warnings for the static functions. | |
| 445 | − */ | |
| 446 | −#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 | |
| 447 | −#define USE_HW_PSTATE 0x00000080 | |
| 448 | − u32 eax, ebx, ecx, edx; | |
| 449 | − cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); | |
| 450 | − if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE) | |
| 451 | − return -ENODEV; | |
| 452 | − return 0; | |
| 453 | − } | |
| 454 | − return -ENODEV; | |
| 455 | −} | |
| 456 | 427 | /* acpi_perf_data is a pointer to percpu data. */ |
| 457 | 428 | static struct acpi_processor_performance __percpu *acpi_perf_data; |
| 458 | 429 | |
| @@ -509,10 +480,10 @@ struct notifier_block xen_acpi_processor_resume_nb = { · 50 unmodified lines | ||
| 509 | 480 | static int __init xen_acpi_processor_init(void) |
| 510 | 481 | { |
| 511 | 482 | unsigned int i; |
| 512 | − int rc = check_prereq(); | |
| 483 | + int rc; | |
| 513 | 484 | |
| 514 | − if (rc) | |
| 515 | − return rc; | |
| 485 | + if (!xen_initial_domain()) | |
| 486 | + return -ENODEV; | |
| 516 | 487 | |
| 517 | 488 | nr_acpi_bits = get_max_acpi_id() + 1; |
| 518 | 489 | acpi_ids_done = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL); |
| @@ -316,11 +316,18 @@ static int xenbus_write_transaction(unsigned msg_type, · 315 unmodified lines | ||
| 316 | 316 | rc = -ENOMEM; |
| 317 | 317 | goto out; |
| 318 | 318 | } |
| 319 | + } else { | |
| 320 | + list_for_each_entry(trans, &u->transactions, list) | |
| 321 | + if (trans->handle.id == u->u.msg.tx_id) | |
| 322 | + break; | |
| 323 | + if (&trans->list == &u->transactions) | |
| 324 | + return -ESRCH; | |
| 319 | 325 | } |
| 320 | 326 | |
| 321 | 327 | reply = xenbus_dev_request_and_reply(&u->u.msg); |
| 322 | 328 | if (IS_ERR(reply)) { |
| 323 | − kfree(trans); | |
| 329 | + if (msg_type == XS_TRANSACTION_START) | |
| 330 | + kfree(trans); | |
| 324 | 331 | rc = PTR_ERR(reply); |
| 325 | 332 | goto out; |
| 326 | 333 | } |
| @@ -333,12 +340,7 @@ static int xenbus_write_transaction(unsigned msg_type, · 6 unmodified lines | ||
| 333 | 340 | list_add(&trans->list, &u->transactions); |
| 334 | 341 | } |
| 335 | 342 | } else if (u->u.msg.type == XS_TRANSACTION_END) { |
| 336 | − list_for_each_entry(trans, &u->transactions, list) | |
| 337 | − if (trans->handle.id == u->u.msg.tx_id) | |
| 338 | − break; | |
| 339 | − BUG_ON(&trans->list == &u->transactions); | |
| 340 | 343 | list_del(&trans->list); |
| 341 | − | |
| 342 | 344 | kfree(trans); |
| 343 | 345 | } |
| 344 | 346 | |
| @@ -232,10 +232,10 @@ static void transaction_resume(void) · 231 unmodified lines | ||
| 232 | 232 | void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg) |
| 233 | 233 | { |
| 234 | 234 | void *ret; |
| 235 | − struct xsd_sockmsg req_msg = *msg; | |
| 235 | + enum xsd_sockmsg_type type = msg->type; | |
| 236 | 236 | int err; |
| 237 | 237 | |
| 238 | − if (req_msg.type == XS_TRANSACTION_START) | |
| 238 | + if (type == XS_TRANSACTION_START) | |
| 239 | 239 | transaction_start(); |
| 240 | 240 | |
| 241 | 241 | mutex_lock(&xs_state.request_mutex); |
| @@ -249,12 +249,8 @@ void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg) · 7 unmodified lines | ||
| 249 | 249 | |
| 250 | 250 | mutex_unlock(&xs_state.request_mutex); |
| 251 | 251 | |
| 252 | − if (IS_ERR(ret)) | |
| 253 | − return ret; | |
| 254 | − | |
| 255 | 252 | if ((msg->type == XS_TRANSACTION_END) || |
| 256 | − ((req_msg.type == XS_TRANSACTION_START) && | |
| 257 | − (msg->type == XS_ERROR))) | |
| 253 | + ((type == XS_TRANSACTION_START) && (msg->type == XS_ERROR))) | |
| 258 | 254 | transaction_end(); |
| 259 | 255 | |
| 260 | 256 | return ret; |