mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-09 20:58:33 +03:00
nodedev: Remove driver locks around object list mgmt code
Since virnodedeviceobj now has a self-lockable hash table, there's no need to lock the table from the driver for processing. Thus remove the locks from the driver for NodeDeviceObjList mgmt. This includes the test driver as well.
This commit is contained in:
parent
4ae9dbea99
commit
4cb719b2dc
@ -174,19 +174,13 @@ nodeNumOfDevices(virConnectPtr conn,
|
|||||||
const char *cap,
|
const char *cap,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
int ndevs = 0;
|
|
||||||
|
|
||||||
if (virNodeNumOfDevicesEnsureACL(conn) < 0)
|
if (virNodeNumOfDevicesEnsureACL(conn) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
nodeDeviceLock();
|
return virNodeDeviceObjListNumOfDevices(driver->devs, conn, cap,
|
||||||
ndevs = virNodeDeviceObjListNumOfDevices(driver->devs, conn, cap,
|
virNodeNumOfDevicesCheckACL);
|
||||||
virNodeNumOfDevicesCheckACL);
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
|
|
||||||
return ndevs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -197,20 +191,14 @@ nodeListDevices(virConnectPtr conn,
|
|||||||
int maxnames,
|
int maxnames,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
int nnames;
|
|
||||||
|
|
||||||
if (virNodeListDevicesEnsureACL(conn) < 0)
|
if (virNodeListDevicesEnsureACL(conn) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
nodeDeviceLock();
|
return virNodeDeviceObjListGetNames(driver->devs, conn,
|
||||||
nnames = virNodeDeviceObjListGetNames(driver->devs, conn,
|
virNodeListDevicesCheckACL,
|
||||||
virNodeListDevicesCheckACL,
|
cap, names, maxnames);
|
||||||
cap, names, maxnames);
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
|
|
||||||
return nnames;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -219,19 +207,14 @@ nodeConnectListAllNodeDevices(virConnectPtr conn,
|
|||||||
virNodeDevicePtr **devices,
|
virNodeDevicePtr **devices,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
virCheckFlags(VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP, -1);
|
virCheckFlags(VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP, -1);
|
||||||
|
|
||||||
if (virConnectListAllNodeDevicesEnsureACL(conn) < 0)
|
if (virConnectListAllNodeDevicesEnsureACL(conn) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
nodeDeviceLock();
|
return virNodeDeviceObjListExport(conn, driver->devs, devices,
|
||||||
ret = virNodeDeviceObjListExport(conn, driver->devs, devices,
|
virConnectListAllNodeDevicesCheckACL,
|
||||||
virConnectListAllNodeDevicesCheckACL,
|
flags);
|
||||||
flags);
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -240,11 +223,7 @@ nodeDeviceObjFindByName(const char *name)
|
|||||||
{
|
{
|
||||||
virNodeDeviceObjPtr obj;
|
virNodeDeviceObjPtr obj;
|
||||||
|
|
||||||
nodeDeviceLock();
|
if (!(obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
|
||||||
obj = virNodeDeviceObjListFindByName(driver->devs, name);
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
|
|
||||||
if (!obj) {
|
|
||||||
virReportError(VIR_ERR_NO_NODE_DEVICE,
|
virReportError(VIR_ERR_NO_NODE_DEVICE,
|
||||||
_("no node device with matching name '%s'"),
|
_("no node device with matching name '%s'"),
|
||||||
name);
|
name);
|
||||||
@ -294,11 +273,8 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn,
|
|||||||
|
|
||||||
virCheckFlags(0, NULL);
|
virCheckFlags(0, NULL);
|
||||||
|
|
||||||
nodeDeviceLock();
|
if (!(obj = virNodeDeviceObjListFindSCSIHostByWWNs(driver->devs,
|
||||||
obj = virNodeDeviceObjListFindSCSIHostByWWNs(driver->devs, wwnn, wwpn);
|
wwnn, wwpn)))
|
||||||
nodeDeviceUnlock();
|
|
||||||
|
|
||||||
if (!obj)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
def = virNodeDeviceObjGetDef(obj);
|
def = virNodeDeviceObjGetDef(obj);
|
||||||
@ -509,13 +485,6 @@ nodeDeviceFindNewDevice(virConnectPtr conn,
|
|||||||
virNodeDevicePtr device = NULL;
|
virNodeDevicePtr device = NULL;
|
||||||
time_t start = 0, now = 0;
|
time_t start = 0, now = 0;
|
||||||
|
|
||||||
/* The thread that creates the device takes the driver lock, so we
|
|
||||||
* must release it in order to allow the device to be created.
|
|
||||||
* We're not doing anything with the driver pointer at this point,
|
|
||||||
* so it's safe to release it, assuming that the pointer itself
|
|
||||||
* doesn't become invalid. */
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
|
|
||||||
nodeDeviceGetTime(&start);
|
nodeDeviceGetTime(&start);
|
||||||
|
|
||||||
while ((now - start) < LINUX_NEW_DEVICE_WAIT_TIME) {
|
while ((now - start) < LINUX_NEW_DEVICE_WAIT_TIME) {
|
||||||
@ -532,8 +501,6 @@ nodeDeviceFindNewDevice(virConnectPtr conn,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,8 +519,6 @@ nodeDeviceCreateXML(virConnectPtr conn,
|
|||||||
virCheckFlags(0, NULL);
|
virCheckFlags(0, NULL);
|
||||||
virt_type = virConnectGetType(conn);
|
virt_type = virConnectGetType(conn);
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
|
|
||||||
if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, virt_type)))
|
if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, virt_type)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -579,7 +544,6 @@ nodeDeviceCreateXML(virConnectPtr conn,
|
|||||||
"wwnn '%s' and wwpn '%s'"),
|
"wwnn '%s' and wwpn '%s'"),
|
||||||
def->name, wwnn, wwpn);
|
def->name, wwnn, wwpn);
|
||||||
cleanup:
|
cleanup:
|
||||||
nodeDeviceUnlock();
|
|
||||||
virNodeDeviceDefFree(def);
|
virNodeDeviceDefFree(def);
|
||||||
VIR_FREE(wwnn);
|
VIR_FREE(wwnn);
|
||||||
VIR_FREE(wwpn);
|
VIR_FREE(wwpn);
|
||||||
@ -601,8 +565,6 @@ nodeDeviceDestroy(virNodeDevicePtr device)
|
|||||||
return -1;
|
return -1;
|
||||||
def = virNodeDeviceObjGetDef(obj);
|
def = virNodeDeviceObjGetDef(obj);
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
|
|
||||||
if (virNodeDeviceDestroyEnsureACL(device->conn, def) < 0)
|
if (virNodeDeviceDestroyEnsureACL(device->conn, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -634,7 +596,6 @@ nodeDeviceDestroy(virNodeDevicePtr device)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
nodeDeviceUnlock();
|
|
||||||
virNodeDeviceObjEndAPI(&obj);
|
virNodeDeviceObjEndAPI(&obj);
|
||||||
VIR_FREE(parent);
|
VIR_FREE(parent);
|
||||||
VIR_FREE(wwnn);
|
VIR_FREE(wwnn);
|
||||||
|
@ -508,20 +508,15 @@ dev_refresh(const char *udi)
|
|||||||
const char *name = hal_name(udi);
|
const char *name = hal_name(udi);
|
||||||
virNodeDeviceObjPtr obj;
|
virNodeDeviceObjPtr obj;
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
|
if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
|
||||||
/* Simply "rediscover" device -- incrementally handling changes
|
/* Simply "rediscover" device -- incrementally handling changes
|
||||||
* to sub-capabilities (like net.80203) is nasty ... so avoid it.
|
* to sub-capabilities (like net.80203) is nasty ... so avoid it.
|
||||||
*/
|
*/
|
||||||
virNodeDeviceObjListRemove(driver->devs, obj);
|
virNodeDeviceObjListRemove(driver->devs, obj);
|
||||||
} else {
|
|
||||||
VIR_DEBUG("no device named %s", name);
|
|
||||||
}
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
|
|
||||||
if (obj) {
|
|
||||||
virObjectUnref(obj);
|
virObjectUnref(obj);
|
||||||
dev_create(udi);
|
dev_create(udi);
|
||||||
|
} else {
|
||||||
|
VIR_DEBUG("no device named %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -541,14 +536,12 @@ device_removed(LibHalContext *ctx ATTRIBUTE_UNUSED,
|
|||||||
const char *name = hal_name(udi);
|
const char *name = hal_name(udi);
|
||||||
virNodeDeviceObjPtr obj;
|
virNodeDeviceObjPtr obj;
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
obj = virNodeDeviceObjListFindByName(driver->devs, name);
|
obj = virNodeDeviceObjListFindByName(driver->devs, name);
|
||||||
VIR_DEBUG("%s", name);
|
VIR_DEBUG("%s", name);
|
||||||
if (obj)
|
if (obj)
|
||||||
virNodeDeviceObjListRemove(driver->devs, obj);
|
virNodeDeviceObjListRemove(driver->devs, obj);
|
||||||
else
|
else
|
||||||
VIR_DEBUG("no device named %s", name);
|
VIR_DEBUG("no device named %s", name);
|
||||||
nodeDeviceUnlock();
|
|
||||||
virObjectUnref(obj);
|
virObjectUnref(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -561,11 +554,8 @@ device_cap_added(LibHalContext *ctx,
|
|||||||
virNodeDeviceObjPtr obj;
|
virNodeDeviceObjPtr obj;
|
||||||
virNodeDeviceDefPtr def;
|
virNodeDeviceDefPtr def;
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
obj = virNodeDeviceObjListFindByName(driver->devs, name);
|
|
||||||
nodeDeviceUnlock();
|
|
||||||
VIR_DEBUG("%s %s", cap, name);
|
VIR_DEBUG("%s %s", cap, name);
|
||||||
if (obj) {
|
if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
|
||||||
def = virNodeDeviceObjGetDef(obj);
|
def = virNodeDeviceObjGetDef(obj);
|
||||||
(void)gather_capability(ctx, udi, cap, &def->caps);
|
(void)gather_capability(ctx, udi, cap, &def->caps);
|
||||||
virNodeDeviceObjEndAPI(&obj);
|
virNodeDeviceObjEndAPI(&obj);
|
||||||
|
@ -1607,7 +1607,6 @@ udevEventHandleCallback(int watch ATTRIBUTE_UNUSED,
|
|||||||
const char *action = NULL;
|
const char *action = NULL;
|
||||||
int udev_fd = -1;
|
int udev_fd = -1;
|
||||||
|
|
||||||
nodeDeviceLock();
|
|
||||||
udev_fd = udev_monitor_get_fd(udev_monitor);
|
udev_fd = udev_monitor_get_fd(udev_monitor);
|
||||||
if (fd != udev_fd) {
|
if (fd != udev_fd) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
@ -1639,7 +1638,6 @@ udevEventHandleCallback(int watch ATTRIBUTE_UNUSED,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
udev_device_unref(device);
|
udev_device_unref(device);
|
||||||
nodeDeviceUnlock();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1767,7 +1765,6 @@ nodeStateInitialize(bool privileged,
|
|||||||
{
|
{
|
||||||
udevPrivate *priv = NULL;
|
udevPrivate *priv = NULL;
|
||||||
struct udev *udev = NULL;
|
struct udev *udev = NULL;
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(priv) < 0)
|
if (VIR_ALLOC(priv) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -1846,19 +1843,18 @@ nodeStateInitialize(bool privileged,
|
|||||||
if (udevSetupSystemDev() != 0)
|
if (udevSetupSystemDev() != 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Populate with known devices */
|
nodeDeviceUnlock();
|
||||||
|
|
||||||
|
/* Populate with known devices */
|
||||||
if (udevEnumerateDevices(udev) != 0)
|
if (udevEnumerateDevices(udev) != 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
nodeDeviceUnlock();
|
nodeDeviceUnlock();
|
||||||
|
nodeStateCleanup();
|
||||||
if (ret == -1)
|
return -1;
|
||||||
nodeStateCleanup();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5200,11 +5200,7 @@ testNodeDeviceObjFindByName(testDriverPtr driver,
|
|||||||
{
|
{
|
||||||
virNodeDeviceObjPtr obj;
|
virNodeDeviceObjPtr obj;
|
||||||
|
|
||||||
testDriverLock(driver);
|
if (!(obj = virNodeDeviceObjListFindByName(driver->devs, name)))
|
||||||
obj = virNodeDeviceObjListFindByName(driver->devs, name);
|
|
||||||
testDriverUnlock(driver);
|
|
||||||
|
|
||||||
if (!obj)
|
|
||||||
virReportError(VIR_ERR_NO_NODE_DEVICE,
|
virReportError(VIR_ERR_NO_NODE_DEVICE,
|
||||||
_("no node device with matching name '%s'"),
|
_("no node device with matching name '%s'"),
|
||||||
name);
|
name);
|
||||||
@ -5219,15 +5215,10 @@ testNodeNumOfDevices(virConnectPtr conn,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
testDriverPtr driver = conn->privateData;
|
testDriverPtr driver = conn->privateData;
|
||||||
int ndevs = 0;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
testDriverLock(driver);
|
return virNodeDeviceObjListNumOfDevices(driver->devs, conn, cap, NULL);
|
||||||
ndevs = virNodeDeviceObjListNumOfDevices(driver->devs, conn, cap, NULL);
|
|
||||||
testDriverUnlock(driver);
|
|
||||||
|
|
||||||
return ndevs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5239,16 +5230,11 @@ testNodeListDevices(virConnectPtr conn,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
testDriverPtr driver = conn->privateData;
|
testDriverPtr driver = conn->privateData;
|
||||||
int nnames = 0;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
testDriverLock(driver);
|
return virNodeDeviceObjListGetNames(driver->devs, conn, NULL,
|
||||||
nnames = virNodeDeviceObjListGetNames(driver->devs, conn, NULL,
|
cap, names, maxnames);
|
||||||
cap, names, maxnames);
|
|
||||||
testDriverUnlock(driver);
|
|
||||||
|
|
||||||
return nnames;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5463,8 +5449,6 @@ testNodeDeviceCreateXML(virConnectPtr conn,
|
|||||||
|
|
||||||
virCheckFlags(0, NULL);
|
virCheckFlags(0, NULL);
|
||||||
|
|
||||||
testDriverLock(driver);
|
|
||||||
|
|
||||||
if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, NULL)))
|
if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, NULL)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -5501,7 +5485,6 @@ testNodeDeviceCreateXML(virConnectPtr conn,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virNodeDeviceObjEndAPI(&obj);
|
virNodeDeviceObjEndAPI(&obj);
|
||||||
testDriverUnlock(driver);
|
|
||||||
virNodeDeviceDefFree(def);
|
virNodeDeviceDefFree(def);
|
||||||
virObjectUnref(dev);
|
virObjectUnref(dev);
|
||||||
VIR_FREE(wwnn);
|
VIR_FREE(wwnn);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user