Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for-linus-4.7b-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

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

+14 -45
+3 -32
drivers/xen/xen-acpi-processor.c
··· 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 426 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 - 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 ··· 480 509 static int __init xen_acpi_processor_init(void) 481 510 { 482 511 unsigned int i; 483 - int rc = check_prereq(); 512 + int rc; 484 513 485 - if (rc) 486 - return rc; 514 + if (!xen_initial_domain()) 515 + return -ENODEV; 487 516 488 517 nr_acpi_bits = get_max_acpi_id() + 1; 489 518 acpi_ids_done = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL);
+8 -6
drivers/xen/xenbus/xenbus_dev_frontend.c
··· 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 } ··· 340 333 list_add(&trans->list, &u->transactions); 341 334 } 342 335 } else if (u->u.msg.type == XS_TRANSACTION_END) { 343 - list_for_each_entry(trans, &u->transactions, list) 344 - if (trans->handle.id == u->u.msg.tx_id) 345 - break; 346 - BUG_ON(&trans->list == &u->transactions); 347 336 list_del(&trans->list); 348 - 349 337 kfree(trans); 350 338 } 351 339
+3 -7
drivers/xen/xenbus/xenbus_xs.c
··· 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 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;