root/drivers/xen/xenbus/xenbus_probe_frontend.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. frontend_bus_id
  2. xenbus_probe_frontend
  3. xenbus_uevent_frontend
  4. backend_changed
  5. xenbus_frontend_delayed_resume
  6. xenbus_frontend_dev_resume
  7. xenbus_frontend_dev_probe
  8. frontend_changed
  9. read_backend_details
  10. is_device_connecting
  11. essential_device_connecting
  12. non_essential_device_connecting
  13. exists_essential_connecting_device
  14. exists_non_essential_connecting_device
  15. print_device_status
  16. wait_loop
  17. wait_for_devices
  18. __xenbus_register_frontend
  19. xenbus_reset_backend_state_changed
  20. xenbus_reset_wait_for_backend
  21. xenbus_reset_frontend
  22. xenbus_check_frontend
  23. xenbus_reset_state
  24. frontend_probe_and_watch
  25. xenbus_probe_frontend_init
  26. boot_wait_for_devices

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   3 
   4 #define DPRINTK(fmt, ...)                               \
   5         pr_debug("(%s:%d) " fmt "\n",                   \
   6                  __func__, __LINE__, ##__VA_ARGS__)
   7 
   8 #include <linux/kernel.h>
   9 #include <linux/err.h>
  10 #include <linux/string.h>
  11 #include <linux/ctype.h>
  12 #include <linux/fcntl.h>
  13 #include <linux/mm.h>
  14 #include <linux/proc_fs.h>
  15 #include <linux/notifier.h>
  16 #include <linux/kthread.h>
  17 #include <linux/mutex.h>
  18 #include <linux/io.h>
  19 #include <linux/module.h>
  20 
  21 #include <asm/page.h>
  22 #include <asm/pgtable.h>
  23 #include <asm/xen/hypervisor.h>
  24 #include <xen/xenbus.h>
  25 #include <xen/events.h>
  26 #include <xen/page.h>
  27 #include <xen/xen.h>
  28 
  29 #include <xen/platform_pci.h>
  30 
  31 #include "xenbus.h"
  32 
  33 
  34 
  35 /* device/<type>/<id> => <type>-<id> */
  36 static int frontend_bus_id(char bus_id[XEN_BUS_ID_SIZE], const char *nodename)
  37 {
  38         nodename = strchr(nodename, '/');
  39         if (!nodename || strlen(nodename + 1) >= XEN_BUS_ID_SIZE) {
  40                 pr_warn("bad frontend %s\n", nodename);
  41                 return -EINVAL;
  42         }
  43 
  44         strlcpy(bus_id, nodename + 1, XEN_BUS_ID_SIZE);
  45         if (!strchr(bus_id, '/')) {
  46                 pr_warn("bus_id %s no slash\n", bus_id);
  47                 return -EINVAL;
  48         }
  49         *strchr(bus_id, '/') = '-';
  50         return 0;
  51 }
  52 
  53 /* device/<typename>/<name> */
  54 static int xenbus_probe_frontend(struct xen_bus_type *bus, const char *type,
  55                                  const char *name)
  56 {
  57         char *nodename;
  58         int err;
  59 
  60         /* ignore console/0 */
  61         if (!strncmp(type, "console", 7) && !strncmp(name, "0", 1)) {
  62                 DPRINTK("Ignoring buggy device entry console/0");
  63                 return 0;
  64         }
  65 
  66         nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", bus->root, type, name);
  67         if (!nodename)
  68                 return -ENOMEM;
  69 
  70         DPRINTK("%s", nodename);
  71 
  72         err = xenbus_probe_node(bus, type, nodename);
  73         kfree(nodename);
  74         return err;
  75 }
  76 
  77 static int xenbus_uevent_frontend(struct device *_dev,
  78                                   struct kobj_uevent_env *env)
  79 {
  80         struct xenbus_device *dev = to_xenbus_device(_dev);
  81 
  82         if (add_uevent_var(env, "MODALIAS=xen:%s", dev->devicetype))
  83                 return -ENOMEM;
  84 
  85         return 0;
  86 }
  87 
  88 
  89 static void backend_changed(struct xenbus_watch *watch,
  90                             const char *path, const char *token)
  91 {
  92         xenbus_otherend_changed(watch, path, token, 1);
  93 }
  94 
  95 static void xenbus_frontend_delayed_resume(struct work_struct *w)
  96 {
  97         struct xenbus_device *xdev = container_of(w, struct xenbus_device, work);
  98 
  99         xenbus_dev_resume(&xdev->dev);
 100 }
 101 
 102 static int xenbus_frontend_dev_resume(struct device *dev)
 103 {
 104         /*
 105          * If xenstored is running in this domain, we cannot access the backend
 106          * state at the moment, so we need to defer xenbus_dev_resume
 107          */
 108         if (xen_store_domain_type == XS_LOCAL) {
 109                 struct xenbus_device *xdev = to_xenbus_device(dev);
 110 
 111                 schedule_work(&xdev->work);
 112 
 113                 return 0;
 114         }
 115 
 116         return xenbus_dev_resume(dev);
 117 }
 118 
 119 static int xenbus_frontend_dev_probe(struct device *dev)
 120 {
 121         if (xen_store_domain_type == XS_LOCAL) {
 122                 struct xenbus_device *xdev = to_xenbus_device(dev);
 123                 INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume);
 124         }
 125 
 126         return xenbus_dev_probe(dev);
 127 }
 128 
 129 static const struct dev_pm_ops xenbus_pm_ops = {
 130         .suspend        = xenbus_dev_suspend,
 131         .resume         = xenbus_frontend_dev_resume,
 132         .freeze         = xenbus_dev_suspend,
 133         .thaw           = xenbus_dev_cancel,
 134         .restore        = xenbus_dev_resume,
 135 };
 136 
 137 static struct xen_bus_type xenbus_frontend = {
 138         .root = "device",
 139         .levels = 2,            /* device/type/<id> */
 140         .get_bus_id = frontend_bus_id,
 141         .probe = xenbus_probe_frontend,
 142         .otherend_changed = backend_changed,
 143         .bus = {
 144                 .name           = "xen",
 145                 .match          = xenbus_match,
 146                 .uevent         = xenbus_uevent_frontend,
 147                 .probe          = xenbus_frontend_dev_probe,
 148                 .remove         = xenbus_dev_remove,
 149                 .shutdown       = xenbus_dev_shutdown,
 150                 .dev_groups     = xenbus_dev_groups,
 151 
 152                 .pm             = &xenbus_pm_ops,
 153         },
 154 };
 155 
 156 static void frontend_changed(struct xenbus_watch *watch,
 157                              const char *path, const char *token)
 158 {
 159         DPRINTK("");
 160 
 161         xenbus_dev_changed(path, &xenbus_frontend);
 162 }
 163 
 164 
 165 /* We watch for devices appearing and vanishing. */
 166 static struct xenbus_watch fe_watch = {
 167         .node = "device",
 168         .callback = frontend_changed,
 169 };
 170 
 171 static int read_backend_details(struct xenbus_device *xendev)
 172 {
 173         return xenbus_read_otherend_details(xendev, "backend-id", "backend");
 174 }
 175 
 176 static int is_device_connecting(struct device *dev, void *data, bool ignore_nonessential)
 177 {
 178         struct xenbus_device *xendev = to_xenbus_device(dev);
 179         struct device_driver *drv = data;
 180         struct xenbus_driver *xendrv;
 181 
 182         /*
 183          * A device with no driver will never connect. We care only about
 184          * devices which should currently be in the process of connecting.
 185          */
 186         if (!dev->driver)
 187                 return 0;
 188 
 189         /* Is this search limited to a particular driver? */
 190         if (drv && (dev->driver != drv))
 191                 return 0;
 192 
 193         if (ignore_nonessential) {
 194                 /* With older QEMU, for PVonHVM guests the guest config files
 195                  * could contain: vfb = [ 'vnc=1, vnclisten=0.0.0.0']
 196                  * which is nonsensical as there is no PV FB (there can be
 197                  * a PVKB) running as HVM guest. */
 198 
 199                 if ((strncmp(xendev->nodename, "device/vkbd", 11) == 0))
 200                         return 0;
 201 
 202                 if ((strncmp(xendev->nodename, "device/vfb", 10) == 0))
 203                         return 0;
 204         }
 205         xendrv = to_xenbus_driver(dev->driver);
 206         return (xendev->state < XenbusStateConnected ||
 207                 (xendev->state == XenbusStateConnected &&
 208                  xendrv->is_ready && !xendrv->is_ready(xendev)));
 209 }
 210 static int essential_device_connecting(struct device *dev, void *data)
 211 {
 212         return is_device_connecting(dev, data, true /* ignore PV[KBB+FB] */);
 213 }
 214 static int non_essential_device_connecting(struct device *dev, void *data)
 215 {
 216         return is_device_connecting(dev, data, false);
 217 }
 218 
 219 static int exists_essential_connecting_device(struct device_driver *drv)
 220 {
 221         return bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
 222                                 essential_device_connecting);
 223 }
 224 static int exists_non_essential_connecting_device(struct device_driver *drv)
 225 {
 226         return bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
 227                                 non_essential_device_connecting);
 228 }
 229 
 230 static int print_device_status(struct device *dev, void *data)
 231 {
 232         struct xenbus_device *xendev = to_xenbus_device(dev);
 233         struct device_driver *drv = data;
 234 
 235         /* Is this operation limited to a particular driver? */
 236         if (drv && (dev->driver != drv))
 237                 return 0;
 238 
 239         if (!dev->driver) {
 240                 /* Information only: is this too noisy? */
 241                 pr_info("Device with no driver: %s\n", xendev->nodename);
 242         } else if (xendev->state < XenbusStateConnected) {
 243                 enum xenbus_state rstate = XenbusStateUnknown;
 244                 if (xendev->otherend)
 245                         rstate = xenbus_read_driver_state(xendev->otherend);
 246                 pr_warn("Timeout connecting to device: %s (local state %d, remote state %d)\n",
 247                         xendev->nodename, xendev->state, rstate);
 248         }
 249 
 250         return 0;
 251 }
 252 
 253 /* We only wait for device setup after most initcalls have run. */
 254 static int ready_to_wait_for_devices;
 255 
 256 static bool wait_loop(unsigned long start, unsigned int max_delay,
 257                      unsigned int *seconds_waited)
 258 {
 259         if (time_after(jiffies, start + (*seconds_waited+5)*HZ)) {
 260                 if (!*seconds_waited)
 261                         pr_warn("Waiting for devices to initialise: ");
 262                 *seconds_waited += 5;
 263                 pr_cont("%us...", max_delay - *seconds_waited);
 264                 if (*seconds_waited == max_delay) {
 265                         pr_cont("\n");
 266                         return true;
 267                 }
 268         }
 269 
 270         schedule_timeout_interruptible(HZ/10);
 271 
 272         return false;
 273 }
 274 /*
 275  * On a 5-minute timeout, wait for all devices currently configured.  We need
 276  * to do this to guarantee that the filesystems and / or network devices
 277  * needed for boot are available, before we can allow the boot to proceed.
 278  *
 279  * This needs to be on a late_initcall, to happen after the frontend device
 280  * drivers have been initialised, but before the root fs is mounted.
 281  *
 282  * A possible improvement here would be to have the tools add a per-device
 283  * flag to the store entry, indicating whether it is needed at boot time.
 284  * This would allow people who knew what they were doing to accelerate their
 285  * boot slightly, but of course needs tools or manual intervention to set up
 286  * those flags correctly.
 287  */
 288 static void wait_for_devices(struct xenbus_driver *xendrv)
 289 {
 290         unsigned long start = jiffies;
 291         struct device_driver *drv = xendrv ? &xendrv->driver : NULL;
 292         unsigned int seconds_waited = 0;
 293 
 294         if (!ready_to_wait_for_devices || !xen_domain())
 295                 return;
 296 
 297         while (exists_non_essential_connecting_device(drv))
 298                 if (wait_loop(start, 30, &seconds_waited))
 299                         break;
 300 
 301         /* Skips PVKB and PVFB check.*/
 302         while (exists_essential_connecting_device(drv))
 303                 if (wait_loop(start, 270, &seconds_waited))
 304                         break;
 305 
 306         if (seconds_waited)
 307                 printk("\n");
 308 
 309         bus_for_each_dev(&xenbus_frontend.bus, NULL, drv,
 310                          print_device_status);
 311 }
 312 
 313 int __xenbus_register_frontend(struct xenbus_driver *drv, struct module *owner,
 314                                const char *mod_name)
 315 {
 316         int ret;
 317 
 318         drv->read_otherend_details = read_backend_details;
 319 
 320         ret = xenbus_register_driver_common(drv, &xenbus_frontend,
 321                                             owner, mod_name);
 322         if (ret)
 323                 return ret;
 324 
 325         /* If this driver is loaded as a module wait for devices to attach. */
 326         wait_for_devices(drv);
 327 
 328         return 0;
 329 }
 330 EXPORT_SYMBOL_GPL(__xenbus_register_frontend);
 331 
 332 static DECLARE_WAIT_QUEUE_HEAD(backend_state_wq);
 333 static int backend_state;
 334 
 335 static void xenbus_reset_backend_state_changed(struct xenbus_watch *w,
 336                                         const char *path, const char *token)
 337 {
 338         if (xenbus_scanf(XBT_NIL, path, "", "%i",
 339                          &backend_state) != 1)
 340                 backend_state = XenbusStateUnknown;
 341         printk(KERN_DEBUG "XENBUS: backend %s %s\n",
 342                path, xenbus_strstate(backend_state));
 343         wake_up(&backend_state_wq);
 344 }
 345 
 346 static void xenbus_reset_wait_for_backend(char *be, int expected)
 347 {
 348         long timeout;
 349         timeout = wait_event_interruptible_timeout(backend_state_wq,
 350                         backend_state == expected, 5 * HZ);
 351         if (timeout <= 0)
 352                 pr_info("backend %s timed out\n", be);
 353 }
 354 
 355 /*
 356  * Reset frontend if it is in Connected or Closed state.
 357  * Wait for backend to catch up.
 358  * State Connected happens during kdump, Closed after kexec.
 359  */
 360 static void xenbus_reset_frontend(char *fe, char *be, int be_state)
 361 {
 362         struct xenbus_watch be_watch;
 363 
 364         printk(KERN_DEBUG "XENBUS: backend %s %s\n",
 365                         be, xenbus_strstate(be_state));
 366 
 367         memset(&be_watch, 0, sizeof(be_watch));
 368         be_watch.node = kasprintf(GFP_NOIO | __GFP_HIGH, "%s/state", be);
 369         if (!be_watch.node)
 370                 return;
 371 
 372         be_watch.callback = xenbus_reset_backend_state_changed;
 373         backend_state = XenbusStateUnknown;
 374 
 375         pr_info("triggering reconnect on %s\n", be);
 376         register_xenbus_watch(&be_watch);
 377 
 378         /* fall through to forward backend to state XenbusStateInitialising */
 379         switch (be_state) {
 380         case XenbusStateConnected:
 381                 xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateClosing);
 382                 xenbus_reset_wait_for_backend(be, XenbusStateClosing);
 383                 /* fall through */
 384 
 385         case XenbusStateClosing:
 386                 xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateClosed);
 387                 xenbus_reset_wait_for_backend(be, XenbusStateClosed);
 388                 /* fall through */
 389 
 390         case XenbusStateClosed:
 391                 xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateInitialising);
 392                 xenbus_reset_wait_for_backend(be, XenbusStateInitWait);
 393         }
 394 
 395         unregister_xenbus_watch(&be_watch);
 396         pr_info("reconnect done on %s\n", be);
 397         kfree(be_watch.node);
 398 }
 399 
 400 static void xenbus_check_frontend(char *class, char *dev)
 401 {
 402         int be_state, fe_state, err;
 403         char *backend, *frontend;
 404 
 405         frontend = kasprintf(GFP_NOIO | __GFP_HIGH, "device/%s/%s", class, dev);
 406         if (!frontend)
 407                 return;
 408 
 409         err = xenbus_scanf(XBT_NIL, frontend, "state", "%i", &fe_state);
 410         if (err != 1)
 411                 goto out;
 412 
 413         switch (fe_state) {
 414         case XenbusStateConnected:
 415         case XenbusStateClosed:
 416                 printk(KERN_DEBUG "XENBUS: frontend %s %s\n",
 417                                 frontend, xenbus_strstate(fe_state));
 418                 backend = xenbus_read(XBT_NIL, frontend, "backend", NULL);
 419                 if (!backend || IS_ERR(backend))
 420                         goto out;
 421                 err = xenbus_scanf(XBT_NIL, backend, "state", "%i", &be_state);
 422                 if (err == 1)
 423                         xenbus_reset_frontend(frontend, backend, be_state);
 424                 kfree(backend);
 425                 break;
 426         default:
 427                 break;
 428         }
 429 out:
 430         kfree(frontend);
 431 }
 432 
 433 static void xenbus_reset_state(void)
 434 {
 435         char **devclass, **dev;
 436         int devclass_n, dev_n;
 437         int i, j;
 438 
 439         devclass = xenbus_directory(XBT_NIL, "device", "", &devclass_n);
 440         if (IS_ERR(devclass))
 441                 return;
 442 
 443         for (i = 0; i < devclass_n; i++) {
 444                 dev = xenbus_directory(XBT_NIL, "device", devclass[i], &dev_n);
 445                 if (IS_ERR(dev))
 446                         continue;
 447                 for (j = 0; j < dev_n; j++)
 448                         xenbus_check_frontend(devclass[i], dev[j]);
 449                 kfree(dev);
 450         }
 451         kfree(devclass);
 452 }
 453 
 454 static int frontend_probe_and_watch(struct notifier_block *notifier,
 455                                    unsigned long event,
 456                                    void *data)
 457 {
 458         /* reset devices in Connected or Closed state */
 459         if (xen_hvm_domain())
 460                 xenbus_reset_state();
 461         /* Enumerate devices in xenstore and watch for changes. */
 462         xenbus_probe_devices(&xenbus_frontend);
 463         register_xenbus_watch(&fe_watch);
 464 
 465         return NOTIFY_DONE;
 466 }
 467 
 468 
 469 static int __init xenbus_probe_frontend_init(void)
 470 {
 471         static struct notifier_block xenstore_notifier = {
 472                 .notifier_call = frontend_probe_and_watch
 473         };
 474         int err;
 475 
 476         DPRINTK("");
 477 
 478         /* Register ourselves with the kernel bus subsystem */
 479         err = bus_register(&xenbus_frontend.bus);
 480         if (err)
 481                 return err;
 482 
 483         register_xenstore_notifier(&xenstore_notifier);
 484 
 485         return 0;
 486 }
 487 subsys_initcall(xenbus_probe_frontend_init);
 488 
 489 #ifndef MODULE
 490 static int __init boot_wait_for_devices(void)
 491 {
 492         if (!xen_has_pv_devices())
 493                 return -ENODEV;
 494 
 495         ready_to_wait_for_devices = 1;
 496         wait_for_devices(NULL);
 497         return 0;
 498 }
 499 
 500 late_initcall(boot_wait_for_devices);
 501 #endif
 502 
 503 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */