1 /****************************************************************************** 2 * xenbus_xs.c 3 * 4 * This is the kernel equivalent of the "xs" library. We don't need everything 5 * and we use xenbus_comms for communication. 6 * 7 * Copyright (C) 2005 Rusty Russell, IBM Corporation 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License version 2 11 * as published by the Free Software Foundation; or, when distributed 12 * separately from the Linux kernel or incorporated into other 13 * software packages, subject to the following license: 14 * 15 * Permission is hereby granted, free of charge, to any person obtaining a copy 16 * of this source file (the "Software"), to deal in the Software without 17 * restriction, including without limitation the rights to use, copy, modify, 18 * merge, publish, distribute, sublicense, and/or sell copies of the Software, 19 * and to permit persons to whom the Software is furnished to do so, subject to 20 * the following conditions: 21 * 22 * The above copyright notice and this permission notice shall be included in 23 * all copies or substantial portions of the Software. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 30 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 31 * IN THE SOFTWARE. 32 */ 33 34 #include <linux/unistd.h> 35 #include <linux/errno.h> 36 #include <linux/types.h> 37 #include <linux/uio.h> 38 #include <linux/kernel.h> 39 #include <linux/string.h> 40 #include <linux/err.h> 41 #include <linux/slab.h> 42 #include <linux/fcntl.h> 43 #include <linux/kthread.h> 44 #include <linux/rwsem.h> 45 #include <linux/module.h> 46 #include <linux/mutex.h> 47 #include <asm/xen/hypervisor.h> 48 #include <xen/xenbus.h> 49 #include <xen/xen.h> 50 #include "xenbus_comms.h" 51 52 struct xs_stored_msg { 53 struct list_head list; 54 55 struct xsd_sockmsg hdr; 56 57 union { 58 /* Queued replies. */ 59 struct { 60 char *body; 61 } reply; 62 63 /* Queued watch events. */ 64 struct { 65 struct xenbus_watch *handle; 66 char **vec; 67 unsigned int vec_size; 68 } watch; 69 } u; 70 }; 71 72 struct xs_handle { 73 /* A list of replies. Currently only one will ever be outstanding. */ 74 struct list_head reply_list; 75 spinlock_t reply_lock; 76 wait_queue_head_t reply_waitq; 77 78 /* 79 * Mutex ordering: transaction_mutex -> watch_mutex -> request_mutex. 80 * response_mutex is never taken simultaneously with the other three. 81 * 82 * transaction_mutex must be held before incrementing 83 * transaction_count. The mutex is held when a suspend is in 84 * progress to prevent new transactions starting. 85 * 86 * When decrementing transaction_count to zero the wait queue 87 * should be woken up, the suspend code waits for count to 88 * reach zero. 89 */ 90 91 /* One request at a time. */ 92 struct mutex request_mutex; 93 94 /* Protect xenbus reader thread against save/restore. */ 95 struct mutex response_mutex; 96 97 /* Protect transactions against save/restore. */ 98 struct mutex transaction_mutex; 99 atomic_t transaction_count; 100 wait_queue_head_t transaction_wq; 101 102 /* Protect watch (de)register against save/restore. */ 103 struct rw_semaphore watch_mutex; 104 }; 105 106 static struct xs_handle xs_state; 107 108 /* List of registered watches, and a lock to protect it. */ 109 static LIST_HEAD(watches); 110 static DEFINE_SPINLOCK(watches_lock); 111 112 /* List of pending watch callback events, and a lock to protect it. */ 113 static LIST_HEAD(watch_events); 114 static DEFINE_SPINLOCK(watch_events_lock); 115 116 /* 117 * Details of the xenwatch callback kernel thread. The thread waits on the 118 * watch_events_waitq for work to do (queued on watch_events list). When it 119 * wakes up it acquires the xenwatch_mutex before reading the list and 120 * carrying out work. 121 */ 122 static pid_t xenwatch_pid; 123 static DEFINE_MUTEX(xenwatch_mutex); 124 static DECLARE_WAIT_QUEUE_HEAD(watch_events_waitq); 125 126 static int get_error(const char *errorstring) 127 { 128 unsigned int i; 129 130 for (i = 0; strcmp(errorstring, xsd_errors[i].errstring) != 0; i++) { 131 if (i == ARRAY_SIZE(xsd_errors) - 1) { 132 printk(KERN_WARNING 133 "XENBUS xen store gave: unknown error %s", 134 errorstring); 135 return EINVAL; 136 } 137 } 138 return xsd_errors[i].errnum; 139 } 140 141 static void *read_reply(enum xsd_sockmsg_type *type, unsigned int *len) 142 { 143 struct xs_stored_msg *msg; 144 char *body; 145 146 spin_lock(&xs_state.reply_lock); 147 148 while (list_empty(&xs_state.reply_list)) { 149 spin_unlock(&xs_state.reply_lock); 150 /* XXX FIXME: Avoid synchronous wait for response here. */ 151 wait_event(xs_state.reply_waitq, 152 !list_empty(&xs_state.reply_list)); 153 spin_lock(&xs_state.reply_lock); 154 } 155 156 msg = list_entry(xs_state.reply_list.next, 157 struct xs_stored_msg, list); 158 list_del(&msg->list); 159 160 spin_unlock(&xs_state.reply_lock); 161 162 *type = msg->hdr.type; 163 if (len) 164 *len = msg->hdr.len; 165 body = msg->u.reply.body; 166 167 kfree(msg); 168 169 return body; 170 } 171 172 static void transaction_start(void) 173 { 174 mutex_lock(&xs_state.transaction_mutex); 175 atomic_inc(&xs_state.transaction_count); 176 mutex_unlock(&xs_state.transaction_mutex); 177 } 178 179 static void transaction_end(void) 180 { 181 if (atomic_dec_and_test(&xs_state.transaction_count)) 182 wake_up(&xs_state.transaction_wq); 183 } 184 185 static void transaction_suspend(void) 186 { 187 mutex_lock(&xs_state.transaction_mutex); 188 wait_event(xs_state.transaction_wq, 189 atomic_read(&xs_state.transaction_count) == 0); 190 } 191 192 static void transaction_resume(void) 193 { 194 mutex_unlock(&xs_state.transaction_mutex); 195 } 196 197 void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg) 198 { 199 void *ret; 200 struct xsd_sockmsg req_msg = *msg; 201 int err; 202 203 if (req_msg.type == XS_TRANSACTION_START) 204 transaction_start(); 205 206 mutex_lock(&xs_state.request_mutex); 207 208 err = xb_write(msg, sizeof(*msg) + msg->len); 209 if (err) { 210 msg->type = XS_ERROR; 211 ret = ERR_PTR(err); 212 } else 213 ret = read_reply(&msg->type, &msg->len); 214 215 mutex_unlock(&xs_state.request_mutex); 216 217 if ((msg->type == XS_TRANSACTION_END) || 218 ((req_msg.type == XS_TRANSACTION_START) && 219 (msg->type == XS_ERROR))) 220 transaction_end(); 221 222 return ret; 223 } 224 EXPORT_SYMBOL(xenbus_dev_request_and_reply); 225 226 /* Send message to xs, get kmalloc'ed reply. ERR_PTR() on error. */ 227 static void *xs_talkv(struct xenbus_transaction t, 228 enum xsd_sockmsg_type type, 229 const struct kvec *iovec, 230 unsigned int num_vecs, 231 unsigned int *len) 232 { 233 struct xsd_sockmsg msg; 234 void *ret = NULL; 235 unsigned int i; 236 int err; 237 238 msg.tx_id = t.id; 239 msg.req_id = 0; 240 msg.type = type; 241 msg.len = 0; 242 for (i = 0; i < num_vecs; i++) 243 msg.len += iovec[i].iov_len; 244 245 mutex_lock(&xs_state.request_mutex); 246 247 err = xb_write(&msg, sizeof(msg)); 248 if (err) { 249 mutex_unlock(&xs_state.request_mutex); 250 return ERR_PTR(err); 251 } 252 253 for (i = 0; i < num_vecs; i++) { 254 err = xb_write(iovec[i].iov_base, iovec[i].iov_len); 255 if (err) { 256 mutex_unlock(&xs_state.request_mutex); 257 return ERR_PTR(err); 258 } 259 } 260 261 ret = read_reply(&msg.type, len); 262 263 mutex_unlock(&xs_state.request_mutex); 264 265 if (IS_ERR(ret)) 266 return ret; 267 268 if (msg.type == XS_ERROR) { 269 err = get_error(ret); 270 kfree(ret); 271 return ERR_PTR(-err); 272 } 273 274 if (msg.type != type) { 275 if (printk_ratelimit()) 276 printk(KERN_WARNING 277 "XENBUS unexpected type [%d], expected [%d]\n", 278 msg.type, type); 279 kfree(ret); 280 return ERR_PTR(-EINVAL); 281 } 282 return ret; 283 } 284 285 /* Simplified version of xs_talkv: single message. */ 286 static void *xs_single(struct xenbus_transaction t, 287 enum xsd_sockmsg_type type, 288 const char *string, 289 unsigned int *len) 290 { 291 struct kvec iovec; 292 293 iovec.iov_base = (void *)string; 294 iovec.iov_len = strlen(string) + 1; 295 return xs_talkv(t, type, &iovec, 1, len); 296 } 297 298 /* Many commands only need an ack, don't care what it says. */ 299 static int xs_error(char *reply) 300 { 301 if (IS_ERR(reply)) 302 return PTR_ERR(reply); 303 kfree(reply); 304 return 0; 305 } 306 307 static unsigned int count_strings(const char *strings, unsigned int len) 308 { 309 unsigned int num; 310 const char *p; 311 312 for (p = strings, num = 0; p < strings + len; p += strlen(p) + 1) 313 num++; 314 315 return num; 316 } 317 318 /* Return the path to dir with /name appended. Buffer must be kfree()'ed. */ 319 static char *join(const char *dir, const char *name) 320 { 321 char *buffer; 322 323 if (strlen(name) == 0) 324 buffer = kasprintf(GFP_NOIO | __GFP_HIGH, "%s", dir); 325 else 326 buffer = kasprintf(GFP_NOIO | __GFP_HIGH, "%s/%s", dir, name); 327 return (!buffer) ? ERR_PTR(-ENOMEM) : buffer; 328 } 329 330 static char **split(char *strings, unsigned int len, unsigned int *num) 331 { 332 char *p, **ret; 333 334 /* Count the strings. */ 335 *num = count_strings(strings, len); 336 337 /* Transfer to one big alloc for easy freeing. */ 338 ret = kmalloc(*num * sizeof(char *) + len, GFP_NOIO | __GFP_HIGH); 339 if (!ret) { 340 kfree(strings); 341 return ERR_PTR(-ENOMEM); 342 } 343 memcpy(&ret[*num], strings, len); 344 kfree(strings); 345 346 strings = (char *)&ret[*num]; 347 for (p = strings, *num = 0; p < strings + len; p += strlen(p) + 1) 348 ret[(*num)++] = p; 349 350 return ret; 351 } 352 353 char **xenbus_directory(struct xenbus_transaction t, 354 const char *dir, const char *node, unsigned int *num) 355 { 356 char *strings, *path; 357 unsigned int len; 358 359 path = join(dir, node); 360 if (IS_ERR(path)) 361 return (char **)path; 362 363 strings = xs_single(t, XS_DIRECTORY, path, &len); 364 kfree(path); 365 if (IS_ERR(strings)) 366 return (char **)strings; 367 368 return split(strings, len, num); 369 } 370 EXPORT_SYMBOL_GPL(xenbus_directory); 371 372 /* Check if a path exists. Return 1 if it does. */ 373 int xenbus_exists(struct xenbus_transaction t, 374 const char *dir, const char *node) 375 { 376 char **d; 377 int dir_n; 378 379 d = xenbus_directory(t, dir, node, &dir_n); 380 if (IS_ERR(d)) 381 return 0; 382 kfree(d); 383 return 1; 384 } 385 EXPORT_SYMBOL_GPL(xenbus_exists); 386 387 /* Get the value of a single file. 388 * Returns a kmalloced value: call free() on it after use. 389 * len indicates length in bytes. 390 */ 391 void *xenbus_read(struct xenbus_transaction t, 392 const char *dir, const char *node, unsigned int *len) 393 { 394 char *path; 395 void *ret; 396 397 path = join(dir, node); 398 if (IS_ERR(path)) 399 return (void *)path; 400 401 ret = xs_single(t, XS_READ, path, len); 402 kfree(path); 403 return ret; 404 } 405 EXPORT_SYMBOL_GPL(xenbus_read); 406 407 /* Write the value of a single file. 408 * Returns -err on failure. 409 */ 410 int xenbus_write(struct xenbus_transaction t, 411 const char *dir, const char *node, const char *string) 412 { 413 const char *path; 414 struct kvec iovec[2]; 415 int ret; 416 417 path = join(dir, node); 418 if (IS_ERR(path)) 419 return PTR_ERR(path); 420 421 iovec[0].iov_base = (void *)path; 422 iovec[0].iov_len = strlen(path) + 1; 423 iovec[1].iov_base = (void *)string; 424 iovec[1].iov_len = strlen(string); 425 426 ret = xs_error(xs_talkv(t, XS_WRITE, iovec, ARRAY_SIZE(iovec), NULL)); 427 kfree(path); 428 return ret; 429 } 430 EXPORT_SYMBOL_GPL(xenbus_write); 431 432 /* Create a new directory. */ 433 int xenbus_mkdir(struct xenbus_transaction t, 434 const char *dir, const char *node) 435 { 436 char *path; 437 int ret; 438 439 path = join(dir, node); 440 if (IS_ERR(path)) 441 return PTR_ERR(path); 442 443 ret = xs_error(xs_single(t, XS_MKDIR, path, NULL)); 444 kfree(path); 445 return ret; 446 } 447 EXPORT_SYMBOL_GPL(xenbus_mkdir); 448 449 /* Destroy a file or directory (directories must be empty). */ 450 int xenbus_rm(struct xenbus_transaction t, const char *dir, const char *node) 451 { 452 char *path; 453 int ret; 454 455 path = join(dir, node); 456 if (IS_ERR(path)) 457 return PTR_ERR(path); 458 459 ret = xs_error(xs_single(t, XS_RM, path, NULL)); 460 kfree(path); 461 return ret; 462 } 463 EXPORT_SYMBOL_GPL(xenbus_rm); 464 465 /* Start a transaction: changes by others will not be seen during this 466 * transaction, and changes will not be visible to others until end. 467 */ 468 int xenbus_transaction_start(struct xenbus_transaction *t) 469 { 470 char *id_str; 471 472 transaction_start(); 473 474 id_str = xs_single(XBT_NIL, XS_TRANSACTION_START, "", NULL); 475 if (IS_ERR(id_str)) { 476 transaction_end(); 477 return PTR_ERR(id_str); 478 } 479 480 t->id = simple_strtoul(id_str, NULL, 0); 481 kfree(id_str); 482 return 0; 483 } 484 EXPORT_SYMBOL_GPL(xenbus_transaction_start); 485 486 /* End a transaction. 487 * If abandon is true, transaction is discarded instead of committed. 488 */ 489 int xenbus_transaction_end(struct xenbus_transaction t, int abort) 490 { 491 char abortstr[2]; 492 int err; 493 494 if (abort) 495 strcpy(abortstr, "F"); 496 else 497 strcpy(abortstr, "T"); 498 499 err = xs_error(xs_single(t, XS_TRANSACTION_END, abortstr, NULL)); 500 501 transaction_end(); 502 503 return err; 504 } 505 EXPORT_SYMBOL_GPL(xenbus_transaction_end); 506 507 /* Single read and scanf: returns -errno or num scanned. */ 508 int xenbus_scanf(struct xenbus_transaction t, 509 const char *dir, const char *node, const char *fmt, ...) 510 { 511 va_list ap; 512 int ret; 513 char *val; 514 515 val = xenbus_read(t, dir, node, NULL); 516 if (IS_ERR(val)) 517 return PTR_ERR(val); 518 519 va_start(ap, fmt); 520 ret = vsscanf(val, fmt, ap); 521 va_end(ap); 522 kfree(val); 523 /* Distinctive errno. */ 524 if (ret == 0) 525 return -ERANGE; 526 return ret; 527 } 528 EXPORT_SYMBOL_GPL(xenbus_scanf); 529 530 /* Single printf and write: returns -errno or 0. */ 531 int xenbus_printf(struct xenbus_transaction t, 532 const char *dir, const char *node, const char *fmt, ...) 533 { 534 va_list ap; 535 int ret; 536 char *buf; 537 538 va_start(ap, fmt); 539 buf = kvasprintf(GFP_NOIO | __GFP_HIGH, fmt, ap); 540 va_end(ap); 541 542 if (!buf) 543 return -ENOMEM; 544 545 ret = xenbus_write(t, dir, node, buf); 546 547 kfree(buf); 548 549 return ret; 550 } 551 EXPORT_SYMBOL_GPL(xenbus_printf); 552 553 /* Takes tuples of names, scanf-style args, and void **, NULL terminated. */ 554 int xenbus_gather(struct xenbus_transaction t, const char *dir, ...) 555 { 556 va_list ap; 557 const char *name; 558 int ret = 0; 559 560 va_start(ap, dir); 561 while (ret == 0 && (name = va_arg(ap, char *)) != NULL) { 562 const char *fmt = va_arg(ap, char *); 563 void *result = va_arg(ap, void *); 564 char *p; 565 566 p = xenbus_read(t, dir, name, NULL); 567 if (IS_ERR(p)) { 568 ret = PTR_ERR(p); 569 break; 570 } 571 if (fmt) { 572 if (sscanf(p, fmt, result) == 0) 573 ret = -EINVAL; 574 kfree(p); 575 } else 576 *(char **)result = p; 577 } 578 va_end(ap); 579 return ret; 580 } 581 EXPORT_SYMBOL_GPL(xenbus_gather); 582 583 static int xs_watch(const char *path, const char *token) 584 { 585 struct kvec iov[2]; 586 587 iov[0].iov_base = (void *)path; 588 iov[0].iov_len = strlen(path) + 1; 589 iov[1].iov_base = (void *)token; 590 iov[1].iov_len = strlen(token) + 1; 591 592 return xs_error(xs_talkv(XBT_NIL, XS_WATCH, iov, 593 ARRAY_SIZE(iov), NULL)); 594 } 595 596 static int xs_unwatch(const char *path, const char *token) 597 { 598 struct kvec iov[2]; 599 600 iov[0].iov_base = (char *)path; 601 iov[0].iov_len = strlen(path) + 1; 602 iov[1].iov_base = (char *)token; 603 iov[1].iov_len = strlen(token) + 1; 604 605 return xs_error(xs_talkv(XBT_NIL, XS_UNWATCH, iov, 606 ARRAY_SIZE(iov), NULL)); 607 } 608 609 static struct xenbus_watch *find_watch(const char *token) 610 { 611 struct xenbus_watch *i, *cmp; 612 613 cmp = (void *)simple_strtoul(token, NULL, 16); 614 615 list_for_each_entry(i, &watches, list) 616 if (i == cmp) 617 return i; 618 619 return NULL; 620 } 621 /* 622 * Certain older XenBus toolstack cannot handle reading values that are 623 * not populated. Some Xen 3.4 installation are incapable of doing this 624 * so if we are running on anything older than 4 do not attempt to read 625 * control/platform-feature-xs_reset_watches. 626 */ 627 static bool xen_strict_xenbus_quirk(void) 628 { 629 #ifdef CONFIG_X86 630 uint32_t eax, ebx, ecx, edx, base; 631 632 base = xen_cpuid_base(); 633 cpuid(base + 1, &eax, &ebx, &ecx, &edx); 634 635 if ((eax >> 16) < 4) 636 return true; 637 #endif 638 return false; 639 640 } 641 static void xs_reset_watches(void) 642 { 643 int err, supported = 0; 644 645 if (!xen_hvm_domain() || xen_initial_domain()) 646 return; 647 648 if (xen_strict_xenbus_quirk()) 649 return; 650 651 err = xenbus_scanf(XBT_NIL, "control", 652 "platform-feature-xs_reset_watches", "%d", &supported); 653 if (err != 1 || !supported) 654 return; 655 656 err = xs_error(xs_single(XBT_NIL, XS_RESET_WATCHES, "", NULL)); 657 if (err && err != -EEXIST) 658 printk(KERN_WARNING "xs_reset_watches failed: %d\n", err); 659 } 660 661 /* Register callback to watch this node. */ 662 int register_xenbus_watch(struct xenbus_watch *watch) 663 { 664 /* Pointer in ascii is the token. */ 665 char token[sizeof(watch) * 2 + 1]; 666 int err; 667 668 sprintf(token, "%lX", (long)watch); 669 670 down_read(&xs_state.watch_mutex); 671 672 spin_lock(&watches_lock); 673 BUG_ON(find_watch(token)); 674 list_add(&watch->list, &watches); 675 spin_unlock(&watches_lock); 676 677 err = xs_watch(watch->node, token); 678 679 if (err) { 680 spin_lock(&watches_lock); 681 list_del(&watch->list); 682 spin_unlock(&watches_lock); 683 } 684 685 up_read(&xs_state.watch_mutex); 686 687 return err; 688 } 689 EXPORT_SYMBOL_GPL(register_xenbus_watch); 690 691 void unregister_xenbus_watch(struct xenbus_watch *watch) 692 { 693 struct xs_stored_msg *msg, *tmp; 694 char token[sizeof(watch) * 2 + 1]; 695 int err; 696 697 sprintf(token, "%lX", (long)watch); 698 699 down_read(&xs_state.watch_mutex); 700 701 spin_lock(&watches_lock); 702 BUG_ON(!find_watch(token)); 703 list_del(&watch->list); 704 spin_unlock(&watches_lock); 705 706 err = xs_unwatch(watch->node, token); 707 if (err) 708 printk(KERN_WARNING 709 "XENBUS Failed to release watch %s: %i\n", 710 watch->node, err); 711 712 up_read(&xs_state.watch_mutex); 713 714 /* Make sure there are no callbacks running currently (unless 715 its us) */ 716 if (current->pid != xenwatch_pid) 717 mutex_lock(&xenwatch_mutex); 718 719 /* Cancel pending watch events. */ 720 spin_lock(&watch_events_lock); 721 list_for_each_entry_safe(msg, tmp, &watch_events, list) { 722 if (msg->u.watch.handle != watch) 723 continue; 724 list_del(&msg->list); 725 kfree(msg->u.watch.vec); 726 kfree(msg); 727 } 728 spin_unlock(&watch_events_lock); 729 730 if (current->pid != xenwatch_pid) 731 mutex_unlock(&xenwatch_mutex); 732 } 733 EXPORT_SYMBOL_GPL(unregister_xenbus_watch); 734 735 void xs_suspend(void) 736 { 737 transaction_suspend(); 738 down_write(&xs_state.watch_mutex); 739 mutex_lock(&xs_state.request_mutex); 740 mutex_lock(&xs_state.response_mutex); 741 } 742 743 void xs_resume(void) 744 { 745 struct xenbus_watch *watch; 746 char token[sizeof(watch) * 2 + 1]; 747 748 xb_init_comms(); 749 750 mutex_unlock(&xs_state.response_mutex); 751 mutex_unlock(&xs_state.request_mutex); 752 transaction_resume(); 753 754 /* No need for watches_lock: the watch_mutex is sufficient. */ 755 list_for_each_entry(watch, &watches, list) { 756 sprintf(token, "%lX", (long)watch); 757 xs_watch(watch->node, token); 758 } 759 760 up_write(&xs_state.watch_mutex); 761 } 762 763 void xs_suspend_cancel(void) 764 { 765 mutex_unlock(&xs_state.response_mutex); 766 mutex_unlock(&xs_state.request_mutex); 767 up_write(&xs_state.watch_mutex); 768 mutex_unlock(&xs_state.transaction_mutex); 769 } 770 771 static int xenwatch_thread(void *unused) 772 { 773 struct list_head *ent; 774 struct xs_stored_msg *msg; 775 776 for (;;) { 777 wait_event_interruptible(watch_events_waitq, 778 !list_empty(&watch_events)); 779 780 if (kthread_should_stop()) 781 break; 782 783 mutex_lock(&xenwatch_mutex); 784 785 spin_lock(&watch_events_lock); 786 ent = watch_events.next; 787 if (ent != &watch_events) 788 list_del(ent); 789 spin_unlock(&watch_events_lock); 790 791 if (ent != &watch_events) { 792 msg = list_entry(ent, struct xs_stored_msg, list); 793 msg->u.watch.handle->callback( 794 msg->u.watch.handle, 795 (const char **)msg->u.watch.vec, 796 msg->u.watch.vec_size); 797 kfree(msg->u.watch.vec); 798 kfree(msg); 799 } 800 801 mutex_unlock(&xenwatch_mutex); 802 } 803 804 return 0; 805 } 806 807 static int process_msg(void) 808 { 809 struct xs_stored_msg *msg; 810 char *body; 811 int err; 812 813 /* 814 * We must disallow save/restore while reading a xenstore message. 815 * A partial read across s/r leaves us out of sync with xenstored. 816 */ 817 for (;;) { 818 err = xb_wait_for_data_to_read(); 819 if (err) 820 return err; 821 mutex_lock(&xs_state.response_mutex); 822 if (xb_data_to_read()) 823 break; 824 /* We raced with save/restore: pending data 'disappeared'. */ 825 mutex_unlock(&xs_state.response_mutex); 826 } 827 828 829 msg = kmalloc(sizeof(*msg), GFP_NOIO | __GFP_HIGH); 830 if (msg == NULL) { 831 err = -ENOMEM; 832 goto out; 833 } 834 835 err = xb_read(&msg->hdr, sizeof(msg->hdr)); 836 if (err) { 837 kfree(msg); 838 goto out; 839 } 840 841 if (msg->hdr.len > XENSTORE_PAYLOAD_MAX) { 842 kfree(msg); 843 err = -EINVAL; 844 goto out; 845 } 846 847 body = kmalloc(msg->hdr.len + 1, GFP_NOIO | __GFP_HIGH); 848 if (body == NULL) { 849 kfree(msg); 850 err = -ENOMEM; 851 goto out; 852 } 853 854 err = xb_read(body, msg->hdr.len); 855 if (err) { 856 kfree(body); 857 kfree(msg); 858 goto out; 859 } 860 body[msg->hdr.len] = '\0'; 861 862 if (msg->hdr.type == XS_WATCH_EVENT) { 863 msg->u.watch.vec = split(body, msg->hdr.len, 864 &msg->u.watch.vec_size); 865 if (IS_ERR(msg->u.watch.vec)) { 866 err = PTR_ERR(msg->u.watch.vec); 867 kfree(msg); 868 goto out; 869 } 870 871 spin_lock(&watches_lock); 872 msg->u.watch.handle = find_watch( 873 msg->u.watch.vec[XS_WATCH_TOKEN]); 874 if (msg->u.watch.handle != NULL) { 875 spin_lock(&watch_events_lock); 876 list_add_tail(&msg->list, &watch_events); 877 wake_up(&watch_events_waitq); 878 spin_unlock(&watch_events_lock); 879 } else { 880 kfree(msg->u.watch.vec); 881 kfree(msg); 882 } 883 spin_unlock(&watches_lock); 884 } else { 885 msg->u.reply.body = body; 886 spin_lock(&xs_state.reply_lock); 887 list_add_tail(&msg->list, &xs_state.reply_list); 888 spin_unlock(&xs_state.reply_lock); 889 wake_up(&xs_state.reply_waitq); 890 } 891 892 out: 893 mutex_unlock(&xs_state.response_mutex); 894 return err; 895 } 896 897 static int xenbus_thread(void *unused) 898 { 899 int err; 900 901 for (;;) { 902 err = process_msg(); 903 if (err) 904 printk(KERN_WARNING "XENBUS error %d while reading " 905 "message\n", err); 906 if (kthread_should_stop()) 907 break; 908 } 909 910 return 0; 911 } 912 913 int xs_init(void) 914 { 915 int err; 916 struct task_struct *task; 917 918 INIT_LIST_HEAD(&xs_state.reply_list); 919 spin_lock_init(&xs_state.reply_lock); 920 init_waitqueue_head(&xs_state.reply_waitq); 921 922 mutex_init(&xs_state.request_mutex); 923 mutex_init(&xs_state.response_mutex); 924 mutex_init(&xs_state.transaction_mutex); 925 init_rwsem(&xs_state.watch_mutex); 926 atomic_set(&xs_state.transaction_count, 0); 927 init_waitqueue_head(&xs_state.transaction_wq); 928 929 /* Initialize the shared memory rings to talk to xenstored */ 930 err = xb_init_comms(); 931 if (err) 932 return err; 933 934 task = kthread_run(xenwatch_thread, NULL, "xenwatch"); 935 if (IS_ERR(task)) 936 return PTR_ERR(task); 937 xenwatch_pid = task->pid; 938 939 task = kthread_run(xenbus_thread, NULL, "xenbus"); 940 if (IS_ERR(task)) 941 return PTR_ERR(task); 942 943 /* shutdown watches for kexec boot */ 944 xs_reset_watches(); 945 946 return 0; 947 } 948