• Home
  • Raw
  • Download

Lines Matching refs:xd

139 int tb_xdomain_response(struct tb_xdomain *xd, const void *response,  in tb_xdomain_response()  argument
142 return __tb_xdomain_response(xd->tb->ctl, response, size, type); in tb_xdomain_response()
191 int tb_xdomain_request(struct tb_xdomain *xd, const void *request, in tb_xdomain_request() argument
196 return __tb_xdomain_request(xd->tb->ctl, request, request_size, in tb_xdomain_request()
392 struct tb_xdomain *xd, u8 sequence, const struct tb_xdp_properties *req) in tb_xdp_properties_response() argument
404 if (!uuid_equal(xd->local_uuid, &req->dst_uuid)) { in tb_xdp_properties_response()
405 tb_xdp_error_response(ctl, xd->route, sequence, in tb_xdp_properties_response()
410 mutex_lock(&xd->lock); in tb_xdp_properties_response()
412 if (req->offset >= xd->local_property_block_len) { in tb_xdp_properties_response()
413 mutex_unlock(&xd->lock); in tb_xdp_properties_response()
417 len = xd->local_property_block_len - req->offset; in tb_xdp_properties_response()
423 mutex_unlock(&xd->lock); in tb_xdp_properties_response()
427 tb_xdp_fill_header(&res->hdr, xd->route, sequence, PROPERTIES_RESPONSE, in tb_xdp_properties_response()
429 res->generation = xd->local_property_block_gen; in tb_xdp_properties_response()
430 res->data_length = xd->local_property_block_len; in tb_xdp_properties_response()
432 uuid_copy(&res->src_uuid, xd->local_uuid); in tb_xdp_properties_response()
434 memcpy(res->data, &xd->local_property_block[req->offset], len * 4); in tb_xdp_properties_response()
436 mutex_unlock(&xd->lock); in tb_xdp_properties_response()
518 static void update_property_block(struct tb_xdomain *xd) in update_property_block() argument
521 mutex_lock(&xd->lock); in update_property_block()
526 if (!xd->local_property_block || in update_property_block()
527 xd->local_property_block_gen < xdomain_property_block_gen) { in update_property_block()
534 dev_warn(&xd->dev, "failed to copy properties\n"); in update_property_block()
540 tb_property_add_immediate(dir, "maxhopid", xd->local_max_hopid); in update_property_block()
544 dev_warn(&xd->dev, "local property block creation failed\n"); in update_property_block()
558 dev_warn(&xd->dev, "property block generation failed\n"); in update_property_block()
566 kfree(xd->local_property_block); in update_property_block()
568 xd->local_property_block = block; in update_property_block()
569 xd->local_property_block_len = block_len; in update_property_block()
570 xd->local_property_block_gen = xdomain_property_block_gen; in update_property_block()
574 mutex_unlock(&xd->lock); in update_property_block()
585 struct tb_xdomain *xd; in tb_xdp_handle_request() local
609 xd = tb_xdomain_find_by_route_locked(tb, route); in tb_xdp_handle_request()
610 if (xd) in tb_xdp_handle_request()
611 update_property_block(xd); in tb_xdp_handle_request()
615 if (xd) { in tb_xdp_handle_request()
616 ret = tb_xdp_properties_response(tb, ctl, xd, sequence, in tb_xdp_handle_request()
629 if (xd && device_is_registered(&xd->dev)) { in tb_xdp_handle_request()
630 queue_delayed_work(tb->wq, &xd->get_properties_work, in tb_xdp_handle_request()
646 tb_xdomain_put(xd); in tb_xdp_handle_request()
804 struct tb_xdomain *xd = tb_service_parent(svc); in tb_service_release() local
807 ida_simple_remove(&xd->service_ids, svc->id); in tb_service_release()
822 struct tb_xdomain *xd = data; in remove_missing_service() local
829 if (!tb_property_find(xd->remote_properties, svc->key, in remove_missing_service()
875 static void enumerate_services(struct tb_xdomain *xd) in enumerate_services() argument
886 device_for_each_child_reverse(&xd->dev, xd, remove_missing_service); in enumerate_services()
889 tb_property_for_each(xd->remote_properties, p) { in enumerate_services()
894 dev = device_find_child(&xd->dev, p, find_service); in enumerate_services()
909 id = ida_simple_get(&xd->service_ids, 0, 0, GFP_KERNEL); in enumerate_services()
918 svc->dev.parent = &xd->dev; in enumerate_services()
919 dev_set_name(&svc->dev, "%s.%d", dev_name(&xd->dev), svc->id); in enumerate_services()
930 static int populate_properties(struct tb_xdomain *xd, in populate_properties() argument
939 xd->device = p->value.immediate; in populate_properties()
944 xd->vendor = p->value.immediate; in populate_properties()
952 xd->remote_max_hopid = p ? p->value.immediate : XDOMAIN_DEFAULT_MAX_HOPID; in populate_properties()
954 kfree(xd->device_name); in populate_properties()
955 xd->device_name = NULL; in populate_properties()
956 kfree(xd->vendor_name); in populate_properties()
957 xd->vendor_name = NULL; in populate_properties()
962 xd->device_name = kstrdup(p->value.text, GFP_KERNEL); in populate_properties()
965 xd->vendor_name = kstrdup(p->value.text, GFP_KERNEL); in populate_properties()
970 static inline struct tb_switch *tb_xdomain_parent(struct tb_xdomain *xd) in tb_xdomain_parent() argument
972 return tb_to_switch(xd->dev.parent); in tb_xdomain_parent()
975 static int tb_xdomain_update_link_attributes(struct tb_xdomain *xd) in tb_xdomain_update_link_attributes() argument
981 port = tb_port_at(xd->route, tb_xdomain_parent(xd)); in tb_xdomain_update_link_attributes()
987 if (xd->link_speed != ret) in tb_xdomain_update_link_attributes()
990 xd->link_speed = ret; in tb_xdomain_update_link_attributes()
996 if (xd->link_width != ret) in tb_xdomain_update_link_attributes()
999 xd->link_width = ret; in tb_xdomain_update_link_attributes()
1002 kobject_uevent(&xd->dev.kobj, KOBJ_CHANGE); in tb_xdomain_update_link_attributes()
1009 struct tb_xdomain *xd = container_of(work, typeof(*xd), in tb_xdomain_get_uuid() local
1011 struct tb *tb = xd->tb; in tb_xdomain_get_uuid()
1015 dev_dbg(&xd->dev, "requesting remote UUID\n"); in tb_xdomain_get_uuid()
1017 ret = tb_xdp_uuid_request(tb->ctl, xd->route, xd->uuid_retries, &uuid); in tb_xdomain_get_uuid()
1019 if (xd->uuid_retries-- > 0) { in tb_xdomain_get_uuid()
1020 dev_dbg(&xd->dev, "failed to request UUID, retrying\n"); in tb_xdomain_get_uuid()
1021 queue_delayed_work(xd->tb->wq, &xd->get_uuid_work, in tb_xdomain_get_uuid()
1024 dev_dbg(&xd->dev, "failed to read remote UUID\n"); in tb_xdomain_get_uuid()
1029 dev_dbg(&xd->dev, "got remote UUID %pUb\n", &uuid); in tb_xdomain_get_uuid()
1031 if (uuid_equal(&uuid, xd->local_uuid)) in tb_xdomain_get_uuid()
1032 dev_dbg(&xd->dev, "intra-domain loop detected\n"); in tb_xdomain_get_uuid()
1039 if (xd->remote_uuid && !uuid_equal(&uuid, xd->remote_uuid)) { in tb_xdomain_get_uuid()
1040 dev_dbg(&xd->dev, "remote UUID is different, unplugging\n"); in tb_xdomain_get_uuid()
1041 xd->is_unplugged = true; in tb_xdomain_get_uuid()
1046 if (!xd->remote_uuid) { in tb_xdomain_get_uuid()
1047 xd->remote_uuid = kmemdup(&uuid, sizeof(uuid_t), GFP_KERNEL); in tb_xdomain_get_uuid()
1048 if (!xd->remote_uuid) in tb_xdomain_get_uuid()
1053 queue_delayed_work(xd->tb->wq, &xd->properties_changed_work, in tb_xdomain_get_uuid()
1055 queue_delayed_work(xd->tb->wq, &xd->get_properties_work, in tb_xdomain_get_uuid()
1061 struct tb_xdomain *xd = container_of(work, typeof(*xd), in tb_xdomain_get_properties() local
1064 struct tb *tb = xd->tb; in tb_xdomain_get_properties()
1070 dev_dbg(&xd->dev, "requesting remote properties\n"); in tb_xdomain_get_properties()
1072 ret = tb_xdp_properties_request(tb->ctl, xd->route, xd->local_uuid, in tb_xdomain_get_properties()
1073 xd->remote_uuid, xd->properties_retries, in tb_xdomain_get_properties()
1076 if (xd->properties_retries-- > 0) { in tb_xdomain_get_properties()
1077 dev_dbg(&xd->dev, in tb_xdomain_get_properties()
1079 queue_delayed_work(xd->tb->wq, &xd->get_properties_work, in tb_xdomain_get_properties()
1083 dev_err(&xd->dev, in tb_xdomain_get_properties()
1085 xd->remote_uuid); in tb_xdomain_get_properties()
1090 xd->properties_retries = XDOMAIN_PROPERTIES_RETRIES; in tb_xdomain_get_properties()
1092 mutex_lock(&xd->lock); in tb_xdomain_get_properties()
1095 if (xd->remote_properties && gen <= xd->remote_property_block_gen) in tb_xdomain_get_properties()
1100 dev_err(&xd->dev, "failed to parse XDomain properties\n"); in tb_xdomain_get_properties()
1104 ret = populate_properties(xd, dir); in tb_xdomain_get_properties()
1106 dev_err(&xd->dev, "missing XDomain properties in response\n"); in tb_xdomain_get_properties()
1111 if (xd->remote_properties) { in tb_xdomain_get_properties()
1112 tb_property_free_dir(xd->remote_properties); in tb_xdomain_get_properties()
1116 xd->remote_properties = dir; in tb_xdomain_get_properties()
1117 xd->remote_property_block_gen = gen; in tb_xdomain_get_properties()
1119 tb_xdomain_update_link_attributes(xd); in tb_xdomain_get_properties()
1121 mutex_unlock(&xd->lock); in tb_xdomain_get_properties()
1131 if (device_add(&xd->dev)) { in tb_xdomain_get_properties()
1132 dev_err(&xd->dev, "failed to add XDomain device\n"); in tb_xdomain_get_properties()
1135 dev_info(&xd->dev, "new host found, vendor=%#x device=%#x\n", in tb_xdomain_get_properties()
1136 xd->vendor, xd->device); in tb_xdomain_get_properties()
1137 if (xd->vendor_name && xd->device_name) in tb_xdomain_get_properties()
1138 dev_info(&xd->dev, "%s %s\n", xd->vendor_name, in tb_xdomain_get_properties()
1139 xd->device_name); in tb_xdomain_get_properties()
1141 kobject_uevent(&xd->dev.kobj, KOBJ_CHANGE); in tb_xdomain_get_properties()
1144 enumerate_services(xd); in tb_xdomain_get_properties()
1151 mutex_unlock(&xd->lock); in tb_xdomain_get_properties()
1156 struct tb_xdomain *xd = container_of(work, typeof(*xd), in tb_xdomain_properties_changed() local
1160 dev_dbg(&xd->dev, "sending properties changed notification\n"); in tb_xdomain_properties_changed()
1162 ret = tb_xdp_properties_changed_request(xd->tb->ctl, xd->route, in tb_xdomain_properties_changed()
1163 xd->properties_changed_retries, xd->local_uuid); in tb_xdomain_properties_changed()
1165 if (xd->properties_changed_retries-- > 0) { in tb_xdomain_properties_changed()
1166 dev_dbg(&xd->dev, in tb_xdomain_properties_changed()
1168 queue_delayed_work(xd->tb->wq, in tb_xdomain_properties_changed()
1169 &xd->properties_changed_work, in tb_xdomain_properties_changed()
1172 dev_err(&xd->dev, "failed to send properties changed notification\n"); in tb_xdomain_properties_changed()
1176 xd->properties_changed_retries = XDOMAIN_PROPERTIES_CHANGED_RETRIES; in tb_xdomain_properties_changed()
1182 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in device_show() local
1184 return sprintf(buf, "%#x\n", xd->device); in device_show()
1191 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in device_name_show() local
1194 if (mutex_lock_interruptible(&xd->lock)) in device_name_show()
1196 ret = sprintf(buf, "%s\n", xd->device_name ? xd->device_name : ""); in device_name_show()
1197 mutex_unlock(&xd->lock); in device_name_show()
1206 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in maxhopid_show() local
1208 return sprintf(buf, "%d\n", xd->remote_max_hopid); in maxhopid_show()
1215 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in vendor_show() local
1217 return sprintf(buf, "%#x\n", xd->vendor); in vendor_show()
1224 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in vendor_name_show() local
1227 if (mutex_lock_interruptible(&xd->lock)) in vendor_name_show()
1229 ret = sprintf(buf, "%s\n", xd->vendor_name ? xd->vendor_name : ""); in vendor_name_show()
1230 mutex_unlock(&xd->lock); in vendor_name_show()
1239 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in unique_id_show() local
1241 return sprintf(buf, "%pUb\n", xd->remote_uuid); in unique_id_show()
1248 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in speed_show() local
1250 return sprintf(buf, "%u.0 Gb/s\n", xd->link_speed); in speed_show()
1259 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in lanes_show() local
1261 return sprintf(buf, "%u\n", xd->link_width); in lanes_show()
1292 struct tb_xdomain *xd = container_of(dev, struct tb_xdomain, dev); in tb_xdomain_release() local
1294 put_device(xd->dev.parent); in tb_xdomain_release()
1296 kfree(xd->local_property_block); in tb_xdomain_release()
1297 tb_property_free_dir(xd->remote_properties); in tb_xdomain_release()
1298 ida_destroy(&xd->out_hopids); in tb_xdomain_release()
1299 ida_destroy(&xd->in_hopids); in tb_xdomain_release()
1300 ida_destroy(&xd->service_ids); in tb_xdomain_release()
1302 kfree(xd->local_uuid); in tb_xdomain_release()
1303 kfree(xd->remote_uuid); in tb_xdomain_release()
1304 kfree(xd->device_name); in tb_xdomain_release()
1305 kfree(xd->vendor_name); in tb_xdomain_release()
1306 kfree(xd); in tb_xdomain_release()
1309 static void start_handshake(struct tb_xdomain *xd) in start_handshake() argument
1311 xd->uuid_retries = XDOMAIN_UUID_RETRIES; in start_handshake()
1312 xd->properties_retries = XDOMAIN_PROPERTIES_RETRIES; in start_handshake()
1313 xd->properties_changed_retries = XDOMAIN_PROPERTIES_CHANGED_RETRIES; in start_handshake()
1315 if (xd->needs_uuid) { in start_handshake()
1316 queue_delayed_work(xd->tb->wq, &xd->get_uuid_work, in start_handshake()
1320 queue_delayed_work(xd->tb->wq, &xd->properties_changed_work, in start_handshake()
1322 queue_delayed_work(xd->tb->wq, &xd->get_properties_work, in start_handshake()
1327 static void stop_handshake(struct tb_xdomain *xd) in stop_handshake() argument
1329 xd->uuid_retries = 0; in stop_handshake()
1330 xd->properties_retries = 0; in stop_handshake()
1331 xd->properties_changed_retries = 0; in stop_handshake()
1333 cancel_delayed_work_sync(&xd->get_uuid_work); in stop_handshake()
1334 cancel_delayed_work_sync(&xd->get_properties_work); in stop_handshake()
1335 cancel_delayed_work_sync(&xd->properties_changed_work); in stop_handshake()
1378 struct tb_xdomain *xd; in tb_xdomain_alloc() local
1385 xd = kzalloc(sizeof(*xd), GFP_KERNEL); in tb_xdomain_alloc()
1386 if (!xd) in tb_xdomain_alloc()
1389 xd->tb = tb; in tb_xdomain_alloc()
1390 xd->route = route; in tb_xdomain_alloc()
1391 xd->local_max_hopid = down->config.max_in_hop_id; in tb_xdomain_alloc()
1392 ida_init(&xd->service_ids); in tb_xdomain_alloc()
1393 ida_init(&xd->in_hopids); in tb_xdomain_alloc()
1394 ida_init(&xd->out_hopids); in tb_xdomain_alloc()
1395 mutex_init(&xd->lock); in tb_xdomain_alloc()
1396 INIT_DELAYED_WORK(&xd->get_uuid_work, tb_xdomain_get_uuid); in tb_xdomain_alloc()
1397 INIT_DELAYED_WORK(&xd->get_properties_work, tb_xdomain_get_properties); in tb_xdomain_alloc()
1398 INIT_DELAYED_WORK(&xd->properties_changed_work, in tb_xdomain_alloc()
1401 xd->local_uuid = kmemdup(local_uuid, sizeof(uuid_t), GFP_KERNEL); in tb_xdomain_alloc()
1402 if (!xd->local_uuid) in tb_xdomain_alloc()
1406 xd->remote_uuid = kmemdup(remote_uuid, sizeof(uuid_t), in tb_xdomain_alloc()
1408 if (!xd->remote_uuid) in tb_xdomain_alloc()
1411 xd->needs_uuid = true; in tb_xdomain_alloc()
1414 device_initialize(&xd->dev); in tb_xdomain_alloc()
1415 xd->dev.parent = get_device(parent); in tb_xdomain_alloc()
1416 xd->dev.bus = &tb_bus_type; in tb_xdomain_alloc()
1417 xd->dev.type = &tb_xdomain_type; in tb_xdomain_alloc()
1418 xd->dev.groups = xdomain_attr_groups; in tb_xdomain_alloc()
1419 dev_set_name(&xd->dev, "%u-%llx", tb->index, route); in tb_xdomain_alloc()
1421 dev_dbg(&xd->dev, "local UUID %pUb\n", local_uuid); in tb_xdomain_alloc()
1423 dev_dbg(&xd->dev, "remote UUID %pUb\n", remote_uuid); in tb_xdomain_alloc()
1429 pm_runtime_set_active(&xd->dev); in tb_xdomain_alloc()
1430 pm_runtime_get_noresume(&xd->dev); in tb_xdomain_alloc()
1431 pm_runtime_enable(&xd->dev); in tb_xdomain_alloc()
1433 return xd; in tb_xdomain_alloc()
1436 kfree(xd->local_uuid); in tb_xdomain_alloc()
1438 kfree(xd); in tb_xdomain_alloc()
1452 void tb_xdomain_add(struct tb_xdomain *xd) in tb_xdomain_add() argument
1455 start_handshake(xd); in tb_xdomain_add()
1472 void tb_xdomain_remove(struct tb_xdomain *xd) in tb_xdomain_remove() argument
1474 stop_handshake(xd); in tb_xdomain_remove()
1476 device_for_each_child_reverse(&xd->dev, xd, unregister_service); in tb_xdomain_remove()
1483 pm_runtime_disable(&xd->dev); in tb_xdomain_remove()
1484 pm_runtime_put_noidle(&xd->dev); in tb_xdomain_remove()
1485 pm_runtime_set_suspended(&xd->dev); in tb_xdomain_remove()
1487 if (!device_is_registered(&xd->dev)) { in tb_xdomain_remove()
1488 put_device(&xd->dev); in tb_xdomain_remove()
1490 dev_info(&xd->dev, "host disconnected\n"); in tb_xdomain_remove()
1491 device_unregister(&xd->dev); in tb_xdomain_remove()
1505 int tb_xdomain_lane_bonding_enable(struct tb_xdomain *xd) in tb_xdomain_lane_bonding_enable() argument
1510 port = tb_port_at(xd->route, tb_xdomain_parent(xd)); in tb_xdomain_lane_bonding_enable()
1537 tb_xdomain_update_link_attributes(xd); in tb_xdomain_lane_bonding_enable()
1539 dev_dbg(&xd->dev, "lane bonding enabled\n"); in tb_xdomain_lane_bonding_enable()
1551 void tb_xdomain_lane_bonding_disable(struct tb_xdomain *xd) in tb_xdomain_lane_bonding_disable() argument
1555 port = tb_port_at(xd->route, tb_xdomain_parent(xd)); in tb_xdomain_lane_bonding_disable()
1562 tb_xdomain_update_link_attributes(xd); in tb_xdomain_lane_bonding_disable()
1564 dev_dbg(&xd->dev, "lane bonding disabled\n"); in tb_xdomain_lane_bonding_disable()
1579 int tb_xdomain_alloc_in_hopid(struct tb_xdomain *xd, int hopid) in tb_xdomain_alloc_in_hopid() argument
1583 if (hopid < TB_PATH_MIN_HOPID || hopid > xd->local_max_hopid) in tb_xdomain_alloc_in_hopid()
1586 return ida_alloc_range(&xd->in_hopids, hopid, xd->local_max_hopid, in tb_xdomain_alloc_in_hopid()
1601 int tb_xdomain_alloc_out_hopid(struct tb_xdomain *xd, int hopid) in tb_xdomain_alloc_out_hopid() argument
1605 if (hopid < TB_PATH_MIN_HOPID || hopid > xd->remote_max_hopid) in tb_xdomain_alloc_out_hopid()
1608 return ida_alloc_range(&xd->out_hopids, hopid, xd->remote_max_hopid, in tb_xdomain_alloc_out_hopid()
1618 void tb_xdomain_release_in_hopid(struct tb_xdomain *xd, int hopid) in tb_xdomain_release_in_hopid() argument
1620 ida_free(&xd->in_hopids, hopid); in tb_xdomain_release_in_hopid()
1629 void tb_xdomain_release_out_hopid(struct tb_xdomain *xd, int hopid) in tb_xdomain_release_out_hopid() argument
1631 ida_free(&xd->out_hopids, hopid); in tb_xdomain_release_out_hopid()
1650 int tb_xdomain_enable_paths(struct tb_xdomain *xd, int transmit_path, in tb_xdomain_enable_paths() argument
1654 return tb_domain_approve_xdomain_paths(xd->tb, xd, transmit_path, in tb_xdomain_enable_paths()
1675 int tb_xdomain_disable_paths(struct tb_xdomain *xd, int transmit_path, in tb_xdomain_disable_paths() argument
1679 return tb_domain_disconnect_xdomain_paths(xd->tb, xd, transmit_path, in tb_xdomain_disable_paths()
1698 struct tb_xdomain *xd; in switch_find_xdomain() local
1701 xd = port->xdomain; in switch_find_xdomain()
1704 if (xd->remote_uuid && in switch_find_xdomain()
1705 uuid_equal(xd->remote_uuid, lookup->uuid)) in switch_find_xdomain()
1706 return xd; in switch_find_xdomain()
1708 lookup->link == xd->link && in switch_find_xdomain()
1709 lookup->depth == xd->depth) { in switch_find_xdomain()
1710 return xd; in switch_find_xdomain()
1712 lookup->route == xd->route) { in switch_find_xdomain()
1713 return xd; in switch_find_xdomain()
1716 xd = switch_find_xdomain(port->remote->sw, lookup); in switch_find_xdomain()
1717 if (xd) in switch_find_xdomain()
1718 return xd; in switch_find_xdomain()
1743 struct tb_xdomain *xd; in tb_xdomain_find_by_uuid() local
1748 xd = switch_find_xdomain(tb->root_switch, &lookup); in tb_xdomain_find_by_uuid()
1749 return tb_xdomain_get(xd); in tb_xdomain_find_by_uuid()
1773 struct tb_xdomain *xd; in tb_xdomain_find_by_link_depth() local
1779 xd = switch_find_xdomain(tb->root_switch, &lookup); in tb_xdomain_find_by_link_depth()
1780 return tb_xdomain_get(xd); in tb_xdomain_find_by_link_depth()
1801 struct tb_xdomain *xd; in tb_xdomain_find_by_route() local
1806 xd = switch_find_xdomain(tb->root_switch, &lookup); in tb_xdomain_find_by_route()
1807 return tb_xdomain_get(xd); in tb_xdomain_find_by_route()
1856 struct tb_xdomain *xd; in update_xdomain() local
1858 xd = tb_to_xdomain(dev); in update_xdomain()
1859 if (xd) { in update_xdomain()
1860 queue_delayed_work(xd->tb->wq, &xd->properties_changed_work, in update_xdomain()