Lines Matching refs:aodev

714 void libxl__prepare_ao_device(libxl__ao *ao, libxl__ao_device *aodev)  in libxl__prepare_ao_device()  argument
716 aodev->ao = ao; in libxl__prepare_ao_device()
717 aodev->rc = 0; in libxl__prepare_ao_device()
718 aodev->dev = NULL; in libxl__prepare_ao_device()
719 aodev->num_exec = 0; in libxl__prepare_ao_device()
721 libxl__ev_time_init(&aodev->timeout); in libxl__prepare_ao_device()
726 libxl__xswait_init(&aodev->xswait); in libxl__prepare_ao_device()
727 aodev->active = 1; in libxl__prepare_ao_device()
730 libxl__async_exec_init(&aodev->aes); in libxl__prepare_ao_device()
731 libxl__ev_child_init(&aodev->child); in libxl__prepare_ao_device()
733 libxl__ev_qmp_init(&aodev->qmp); in libxl__prepare_ao_device()
761 libxl__ao_device *aodev) { in libxl__multidev_prepare_with_aodev() argument
764 aodev->multidev = multidev; in libxl__multidev_prepare_with_aodev()
765 aodev->callback = libxl__multidev_one_callback; in libxl__multidev_prepare_with_aodev()
766 libxl__prepare_ao_device(ao, aodev); in libxl__multidev_prepare_with_aodev()
772 multidev->array[multidev->used++] = aodev; in libxl__multidev_prepare_with_aodev()
777 libxl__ao_device *aodev; in libxl__multidev_prepare() local
779 GCNEW(aodev); in libxl__multidev_prepare()
780 libxl__multidev_prepare_with_aodev(multidev, aodev); in libxl__multidev_prepare()
782 return aodev; in libxl__multidev_prepare()
785 void libxl__multidev_one_callback(libxl__egc *egc, libxl__ao_device *aodev) in libxl__multidev_one_callback() argument
787 STATE_AO_GC(aodev->ao); in libxl__multidev_one_callback()
788 libxl__multidev *multidev = aodev->multidev; in libxl__multidev_one_callback()
791 aodev->active = 0; in libxl__multidev_one_callback()
884 libxl__ao_device *aodev; in libxl__devices_destroy() local
925 aodev = libxl__multidev_prepare(multidev); in libxl__devices_destroy()
926 aodev->action = LIBXL__DEVICE_ACTION_REMOVE; in libxl__devices_destroy()
927 aodev->dev = dev; in libxl__devices_destroy()
928 aodev->force = drs->force; in libxl__devices_destroy()
930 libxl__initiate_device_usbctrl_remove(egc, aodev); in libxl__devices_destroy()
932 libxl__initiate_device_generic_remove(egc, aodev); in libxl__devices_destroy()
963 libxl__ao_device *aodev);
965 static void device_hotplug(libxl__egc *egc, libxl__ao_device *aodev);
975 static void device_hotplug_done(libxl__egc *egc, libxl__ao_device *aodev);
977 static void device_hotplug_clean(libxl__gc *gc, libxl__ao_device *aodev);
979 void libxl__wait_device_connection(libxl__egc *egc, libxl__ao_device *aodev) in libxl__wait_device_connection() argument
981 STATE_AO_GC(aodev->ao); in libxl__wait_device_connection()
982 char *be_path = libxl__device_backend_path(gc, aodev->dev); in libxl__wait_device_connection()
986 if (QEMU_BACKEND(aodev->dev)) { in libxl__wait_device_connection()
994 device_hotplug(egc, aodev); in libxl__wait_device_connection()
998 rc = libxl__ev_devstate_wait(ao, &aodev->backend_ds, in libxl__wait_device_connection()
1003 LOGD(ERROR, aodev->dev->domid, "unable to initialize device %s", be_path); in libxl__wait_device_connection()
1010 aodev->rc = rc; in libxl__wait_device_connection()
1011 device_hotplug_done(egc, aodev); in libxl__wait_device_connection()
1016 libxl__ao_device *aodev) in libxl__initiate_device_generic_remove() argument
1018 STATE_AO_GC(aodev->ao); in libxl__initiate_device_generic_remove()
1020 char *be_path = libxl__device_backend_path(gc, aodev->dev); in libxl__initiate_device_generic_remove()
1025 uint32_t my_domid, domid = aodev->dev->domid; in libxl__initiate_device_generic_remove()
1042 if (QEMU_BACKEND(aodev->dev) && in libxl__initiate_device_generic_remove()
1048 rc = libxl__ev_time_register_rel(ao, &aodev->timeout, in libxl__initiate_device_generic_remove()
1067 if (aodev->force.flag == LIBXL__FORCE_ON) in libxl__initiate_device_generic_remove()
1069 libxl__device_frontend_path(gc, aodev->dev)); in libxl__initiate_device_generic_remove()
1105 rc = libxl__ev_devstate_wait(ao, &aodev->backend_ds, in libxl__initiate_device_generic_remove()
1119 aodev->rc = rc; in libxl__initiate_device_generic_remove()
1122 device_hotplug_done(egc, aodev); in libxl__initiate_device_generic_remove()
1129 libxl__ao_device *aodev = CONTAINER_OF(ev, *aodev, timeout); in device_qemu_timeout() local
1130 STATE_AO_GC(aodev->ao); in device_qemu_timeout()
1131 char *be_path = libxl__device_backend_path(gc, aodev->dev); in device_qemu_timeout()
1139 libxl__ev_time_deregister(gc, &aodev->timeout); in device_qemu_timeout()
1144 LOGD(ERROR, aodev->dev->domid, "unable to start transaction"); in device_qemu_timeout()
1167 device_hotplug(egc, aodev); in device_qemu_timeout()
1172 aodev->rc = rc; in device_qemu_timeout()
1173 device_hotplug_done(egc, aodev); in device_qemu_timeout()
1178 libxl__ao_device *aodev = CONTAINER_OF(ds, *aodev, backend_ds); in device_backend_callback() local
1179 STATE_AO_GC(aodev->ao); in device_backend_callback()
1181 LOGD(DEBUG, aodev->dev->domid, "calling device_backend_cleanup"); in device_backend_callback()
1182 device_backend_cleanup(gc, aodev); in device_backend_callback()
1185 aodev->action == LIBXL__DEVICE_ACTION_REMOVE && in device_backend_callback()
1186 aodev->force.flag == LIBXL__FORCE_AUTO) { in device_backend_callback()
1187 LOGD(DEBUG, aodev->dev->domid, "Timeout reached, initiating forced remove"); in device_backend_callback()
1188 aodev->force.flag = LIBXL__FORCE_ON; in device_backend_callback()
1189 libxl__initiate_device_generic_remove(egc, aodev); in device_backend_callback()
1194 LOGD(ERROR, aodev->dev->domid, in device_backend_callback()
1196 libxl__device_action_to_string(aodev->action), in device_backend_callback()
1197 libxl__device_backend_path(gc, aodev->dev), rc); in device_backend_callback()
1201 device_hotplug(egc, aodev); in device_backend_callback()
1205 aodev->rc = rc; in device_backend_callback()
1206 device_hotplug_done(egc, aodev); in device_backend_callback()
1210 static void device_backend_cleanup(libxl__gc *gc, libxl__ao_device *aodev) in device_backend_cleanup() argument
1212 if (!aodev) return; in device_backend_cleanup()
1213 libxl__ev_devstate_cancel(gc, &aodev->backend_ds); in device_backend_cleanup()
1216 static void device_hotplug(libxl__egc *egc, libxl__ao_device *aodev) in device_hotplug() argument
1218 STATE_AO_GC(aodev->ao); in device_hotplug()
1219 libxl__async_exec_state *aes = &aodev->aes; in device_hotplug()
1220 char *be_path = libxl__device_backend_path(gc, aodev->dev); in device_hotplug()
1232 LOGD(ERROR, aodev->dev->domid, "Failed to get domid"); in device_hotplug()
1235 if (aodev->dev->backend_domid != domid) { in device_hotplug()
1236 LOGD(DEBUG, aodev->dev->domid, in device_hotplug()
1238 aodev->dev->backend_domid, domid); in device_hotplug()
1240 if (aodev->action != LIBXL__DEVICE_ACTION_REMOVE) { in device_hotplug()
1245 aodev->xswait.ao = ao; in device_hotplug()
1246 aodev->xswait.what = "removal of backend path"; in device_hotplug()
1247 aodev->xswait.path = be_path; in device_hotplug()
1248 aodev->xswait.timeout_ms = LIBXL_DESTROY_TIMEOUT * 1000; in device_hotplug()
1249 aodev->xswait.callback = device_destroy_be_watch_cb; in device_hotplug()
1250 rc = libxl__xswait_start(gc, &aodev->xswait); in device_hotplug()
1252 LOGD(ERROR, aodev->dev->domid, in device_hotplug()
1262 hotplug = libxl__get_hotplug_script_info(gc, aodev->dev, &args, &env, in device_hotplug()
1263 aodev->action, in device_hotplug()
1264 aodev->num_exec); in device_hotplug()
1268 LOGD(DEBUG, aodev->dev->domid, "No hotplug script to execute"); in device_hotplug()
1275 LOGD(ERROR, aodev->dev->domid, in device_hotplug()
1277 "device %s", libxl__device_backend_path(gc, aodev->dev)); in device_hotplug()
1283 LOGD(DEBUG, aodev->dev->domid, "calling hotplug script: %s %s", args[0], args[1]); in device_hotplug()
1284 LOGD(DEBUG, aodev->dev->domid, "extra args:"); in device_hotplug()
1290 LOGD(DEBUG, aodev->dev->domid, "\t%s", arg); in device_hotplug()
1292 LOGD(DEBUG, aodev->dev->domid, "env:"); in device_hotplug()
1299 LOGD(DEBUG, aodev->dev->domid, "\t%s: %s", k, v); in device_hotplug()
1305 LOGD(ERROR, aodev->dev->domid, "unable to open /dev/null for hotplug script"); in device_hotplug()
1325 assert(libxl__async_exec_inuse(&aodev->aes)); in device_hotplug()
1331 aodev->rc = rc; in device_hotplug()
1332 device_hotplug_done(egc, aodev); in device_hotplug()
1340 libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes); in device_hotplug_child_death_cb() local
1341 STATE_AO_GC(aodev->ao); in device_hotplug_child_death_cb()
1342 char *be_path = libxl__device_backend_path(gc, aodev->dev); in device_hotplug_child_death_cb()
1345 device_hotplug_clean(gc, aodev); in device_hotplug_child_death_cb()
1356 if (!aodev->rc) in device_hotplug_child_death_cb()
1357 aodev->rc = rc; in device_hotplug_child_death_cb()
1358 if (aodev->action == LIBXL__DEVICE_ACTION_ADD) in device_hotplug_child_death_cb()
1370 aodev->num_exec++; in device_hotplug_child_death_cb()
1371 device_hotplug(egc, aodev); in device_hotplug_child_death_cb()
1376 assert(aodev->rc); in device_hotplug_child_death_cb()
1377 device_hotplug_done(egc, aodev); in device_hotplug_child_death_cb()
1384 libxl__ao_device *aodev = CONTAINER_OF(xswait, *aodev, xswait); in device_destroy_be_watch_cb() local
1385 STATE_AO_GC(aodev->ao); in device_destroy_be_watch_cb()
1389 LOGD(ERROR, aodev->dev->domid, in device_destroy_be_watch_cb()
1392 aodev->rc = rc; in device_destroy_be_watch_cb()
1403 device_hotplug_done(egc, aodev); in device_destroy_be_watch_cb()
1406 static void device_hotplug_done(libxl__egc *egc, libxl__ao_device *aodev) in device_hotplug_done() argument
1408 STATE_AO_GC(aodev->ao); in device_hotplug_done()
1411 device_hotplug_clean(gc, aodev); in device_hotplug_done()
1414 if (aodev->action == LIBXL__DEVICE_ACTION_REMOVE && in device_hotplug_done()
1415 (aodev->force.flag == LIBXL__FORCE_ON || !aodev->rc)) { in device_hotplug_done()
1416 rc = libxl__device_destroy(gc, aodev->dev); in device_hotplug_done()
1417 if (!aodev->rc) in device_hotplug_done()
1418 aodev->rc = rc; in device_hotplug_done()
1421 aodev->callback(egc, aodev); in device_hotplug_done()
1425 static void device_hotplug_clean(libxl__gc *gc, libxl__ao_device *aodev) in device_hotplug_clean() argument
1428 libxl__ev_time_deregister(gc, &aodev->timeout); in device_hotplug_clean()
1429 libxl__xswait_stop(gc, &aodev->xswait); in device_hotplug_clean()
1430 assert(!libxl__async_exec_inuse(&aodev->aes)); in device_hotplug_clean()
1489 void device_addrm_aocomplete(libxl__egc *egc, libxl__ao_device *aodev) in device_addrm_aocomplete() argument
1491 STATE_AO_GC(aodev->ao); in device_addrm_aocomplete()
1493 if (aodev->rc) { in device_addrm_aocomplete()
1494 if (aodev->dev) { in device_addrm_aocomplete()
1495 LOGD(ERROR, aodev->dev->domid, "Unable to %s %s with id %u", in device_addrm_aocomplete()
1496 libxl__device_action_to_string(aodev->action), in device_addrm_aocomplete()
1497 libxl__device_kind_to_string(aodev->dev->kind), in device_addrm_aocomplete()
1498 aodev->dev->devid); in device_addrm_aocomplete()
1501 libxl__device_action_to_string(aodev->action)); in device_addrm_aocomplete()
1507 libxl__ao_complete(egc, ao, aodev->rc); in device_addrm_aocomplete()
1533 static void device_complete(libxl__egc *egc, libxl__ao_device *aodev) in device_complete() argument
1535 STATE_AO_GC(aodev->ao); in device_complete()
1538 libxl__device_backend_path(gc, aodev->dev), in device_complete()
1539 libxl__device_action_to_string(aodev->action), in device_complete()
1540 aodev->rc ? "failed" : "succeed"); in device_complete()
1542 libxl__nested_ao_free(aodev->ao); in device_complete()
1649 libxl__ao_device *aodev; in add_device() local
1679 GCNEW(aodev); in add_device()
1680 libxl__prepare_ao_device(ao, aodev); in add_device()
1685 GCNEW(aodev->dev); in add_device()
1686 *aodev->dev = *dev; in add_device()
1687 aodev->action = LIBXL__DEVICE_ACTION_ADD; in add_device()
1688 aodev->callback = device_complete; in add_device()
1689 libxl__wait_device_connection(egc, aodev); in add_device()
1702 libxl__ao_device *aodev; in remove_device() local
1718 GCNEW(aodev); in remove_device()
1719 libxl__prepare_ao_device(ao, aodev); in remove_device()
1724 GCNEW(aodev->dev); in remove_device()
1725 *aodev->dev = *dev; in remove_device()
1726 aodev->action = LIBXL__DEVICE_ACTION_REMOVE; in remove_device()
1727 aodev->callback = device_complete; in remove_device()
1728 libxl__initiate_device_generic_remove(egc, aodev); in remove_device()
1938 libxl__ao_device *aodev) in libxl__device_add_async() argument
1940 STATE_AO_GC(aodev->ao); in libxl__device_add_async()
1958 rc = dt->set_default(gc, domid, type, aodev->update_json); in libxl__device_add_async()
1974 if (aodev->update_json) { in libxl__device_add_async()
2015 aodev->action = LIBXL__DEVICE_ACTION_ADD; /* for error message */ in libxl__device_add_async()
2020 if (aodev->update_json) { in libxl__device_add_async()
2035 aodev->dev = device; in libxl__device_add_async()
2036 aodev->action = LIBXL__DEVICE_ACTION_ADD; in libxl__device_add_async()
2037 libxl__wait_device_connection(egc, aodev); in libxl__device_add_async()
2046 aodev->rc = rc; in libxl__device_add_async()
2047 if (rc) aodev->callback(egc, aodev); in libxl__device_add_async()