mirror of https://gitee.com/openkylin/libvirt.git
conf: domain_addr: Refactor hash usage in zpci reservation code
Rewrite using GHashTable which already has interfaces for using a number as hash key. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com> Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
32ab328461
commit
07780553f6
|
@ -25,17 +25,18 @@
|
|||
#include "virlog.h"
|
||||
#include "virstring.h"
|
||||
#include "domain_addr.h"
|
||||
#include "virhashcode.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_DOMAIN
|
||||
|
||||
VIR_LOG_INIT("conf.domain_addr");
|
||||
|
||||
static int
|
||||
virDomainZPCIAddressReserveId(virHashTablePtr set,
|
||||
virDomainZPCIAddressReserveId(GHashTable *set,
|
||||
virZPCIDeviceAddressID *id,
|
||||
const char *name)
|
||||
{
|
||||
int *idval;
|
||||
|
||||
if (!id->isSet) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("No zPCI %s to reserve"),
|
||||
|
@ -43,26 +44,24 @@ virDomainZPCIAddressReserveId(virHashTablePtr set,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (virHashLookup(set, &id->value)) {
|
||||
if (g_hash_table_lookup(set, &id->value)) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("zPCI %s %o is already reserved"),
|
||||
name, id->value);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virHashAddEntry(set, &id->value, (void*)1) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to reserve %s %o"),
|
||||
name, id->value);
|
||||
return -1;
|
||||
}
|
||||
idval = g_new0(int, 1);
|
||||
*idval = (int) id->value;
|
||||
|
||||
g_hash_table_add(set, idval);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virDomainZPCIAddressReserveUid(virHashTablePtr set,
|
||||
virDomainZPCIAddressReserveUid(GHashTable *set,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
{
|
||||
return virDomainZPCIAddressReserveId(set, &addr->uid, "uid");
|
||||
|
@ -70,7 +69,7 @@ virDomainZPCIAddressReserveUid(virHashTablePtr set,
|
|||
|
||||
|
||||
static int
|
||||
virDomainZPCIAddressReserveFid(virHashTablePtr set,
|
||||
virDomainZPCIAddressReserveFid(GHashTable *set,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
{
|
||||
return virDomainZPCIAddressReserveId(set, &addr->fid, "fid");
|
||||
|
@ -78,7 +77,7 @@ virDomainZPCIAddressReserveFid(virHashTablePtr set,
|
|||
|
||||
|
||||
static int
|
||||
virDomainZPCIAddressAssignId(virHashTablePtr set,
|
||||
virDomainZPCIAddressAssignId(GHashTable *set,
|
||||
virZPCIDeviceAddressID *id,
|
||||
unsigned int min,
|
||||
unsigned int max,
|
||||
|
@ -87,7 +86,7 @@ virDomainZPCIAddressAssignId(virHashTablePtr set,
|
|||
if (id->isSet)
|
||||
return 0;
|
||||
|
||||
while (virHashLookup(set, &min)) {
|
||||
while (g_hash_table_lookup(set, &min)) {
|
||||
if (min == max) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("There is no more free %s."),
|
||||
|
@ -105,7 +104,7 @@ virDomainZPCIAddressAssignId(virHashTablePtr set,
|
|||
|
||||
|
||||
static int
|
||||
virDomainZPCIAddressAssignUid(virHashTablePtr set,
|
||||
virDomainZPCIAddressAssignUid(GHashTable *set,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
{
|
||||
return virDomainZPCIAddressAssignId(set, &addr->uid, 1,
|
||||
|
@ -114,7 +113,7 @@ virDomainZPCIAddressAssignUid(virHashTablePtr set,
|
|||
|
||||
|
||||
static int
|
||||
virDomainZPCIAddressAssignFid(virHashTablePtr set,
|
||||
virDomainZPCIAddressAssignFid(GHashTable *set,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
{
|
||||
return virDomainZPCIAddressAssignId(set, &addr->fid, 0,
|
||||
|
@ -123,40 +122,19 @@ virDomainZPCIAddressAssignFid(virHashTablePtr set,
|
|||
|
||||
|
||||
static void
|
||||
virDomainZPCIAddressReleaseId(virHashTablePtr set,
|
||||
virZPCIDeviceAddressID *id,
|
||||
const char *name)
|
||||
virDomainZPCIAddressReleaseId(GHashTable *set,
|
||||
virZPCIDeviceAddressID *id)
|
||||
{
|
||||
if (!id->isSet)
|
||||
return;
|
||||
|
||||
if (virHashRemoveEntry(set, &id->value) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Release %s %o failed"),
|
||||
name, id->value);
|
||||
}
|
||||
g_hash_table_remove(set, &id->value);
|
||||
|
||||
id->value = 0;
|
||||
id->isSet = false;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
virDomainZPCIAddressReleaseUid(virHashTablePtr set,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
{
|
||||
virDomainZPCIAddressReleaseId(set, &addr->uid, "uid");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
virDomainZPCIAddressReleaseFid(virHashTablePtr set,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
{
|
||||
virDomainZPCIAddressReleaseId(set, &addr->fid, "fid");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
virDomainZPCIAddressReleaseIds(virDomainZPCIAddressIdsPtr zpciIds,
|
||||
virZPCIDeviceAddressPtr addr)
|
||||
|
@ -164,8 +142,8 @@ virDomainZPCIAddressReleaseIds(virDomainZPCIAddressIdsPtr zpciIds,
|
|||
if (!zpciIds)
|
||||
return;
|
||||
|
||||
virDomainZPCIAddressReleaseUid(zpciIds->uids, addr);
|
||||
virDomainZPCIAddressReleaseFid(zpciIds->fids, addr);
|
||||
virDomainZPCIAddressReleaseId(zpciIds->uids, &addr->uid);
|
||||
virDomainZPCIAddressReleaseId(zpciIds->fids, &addr->fid);
|
||||
}
|
||||
|
||||
|
||||
|
@ -183,7 +161,7 @@ virDomainZPCIAddressEnsureAddr(virDomainZPCIAddressIdsPtr zpciIds,
|
|||
return -1;
|
||||
|
||||
if (virDomainZPCIAddressReserveFid(zpciIds->fids, addr) < 0) {
|
||||
virDomainZPCIAddressReleaseUid(zpciIds->uids, addr);
|
||||
virDomainZPCIAddressReleaseId(zpciIds->uids, &addr->uid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -965,55 +943,15 @@ virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs,
|
|||
}
|
||||
|
||||
|
||||
static uint32_t
|
||||
virZPCIAddrKeyCode(const void *name,
|
||||
uint32_t seed)
|
||||
{
|
||||
unsigned int value = *((unsigned int *)name);
|
||||
return virHashCodeGen(&value, sizeof(value), seed);
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
virZPCIAddrKeyEqual(const void *namea,
|
||||
const void *nameb)
|
||||
{
|
||||
return *((unsigned int *)namea) == *((unsigned int *)nameb);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
virZPCIAddrKeyCopy(const void *name)
|
||||
{
|
||||
unsigned int *copy = g_new0(unsigned int, 1);
|
||||
|
||||
*copy = *((unsigned int *)name);
|
||||
return (void *)copy;
|
||||
}
|
||||
|
||||
|
||||
static char *
|
||||
virZPCIAddrKeyPrintHuman(const void *name)
|
||||
{
|
||||
return g_strdup_printf("%u", *((unsigned int *)name));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
virZPCIAddrKeyFree(void *name)
|
||||
{
|
||||
VIR_FREE(name);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
virDomainPCIAddressSetExtensionFree(virDomainPCIAddressSetPtr addrs)
|
||||
{
|
||||
if (!addrs || !addrs->zpciIds)
|
||||
return;
|
||||
|
||||
virHashFree(addrs->zpciIds->uids);
|
||||
virHashFree(addrs->zpciIds->fids);
|
||||
g_clear_pointer(&addrs->zpciIds->uids, g_hash_table_unref);
|
||||
g_clear_pointer(&addrs->zpciIds->fids, g_hash_table_unref);
|
||||
|
||||
VIR_FREE(addrs->zpciIds);
|
||||
}
|
||||
|
||||
|
@ -1028,19 +966,8 @@ virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr addrs,
|
|||
|
||||
addrs->zpciIds = g_new0(virDomainZPCIAddressIds, 1);
|
||||
|
||||
addrs->zpciIds->uids = virHashCreateFull(10, NULL,
|
||||
virZPCIAddrKeyCode,
|
||||
virZPCIAddrKeyEqual,
|
||||
virZPCIAddrKeyCopy,
|
||||
virZPCIAddrKeyPrintHuman,
|
||||
virZPCIAddrKeyFree);
|
||||
|
||||
addrs->zpciIds->fids = virHashCreateFull(10, NULL,
|
||||
virZPCIAddrKeyCode,
|
||||
virZPCIAddrKeyEqual,
|
||||
virZPCIAddrKeyCopy,
|
||||
virZPCIAddrKeyPrintHuman,
|
||||
virZPCIAddrKeyFree);
|
||||
addrs->zpciIds->uids = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL);
|
||||
addrs->zpciIds->fids = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -115,8 +115,8 @@ typedef struct {
|
|||
typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;
|
||||
|
||||
typedef struct {
|
||||
virHashTablePtr uids;
|
||||
virHashTablePtr fids;
|
||||
GHashTable *uids;
|
||||
GHashTable *fids;
|
||||
} virDomainZPCIAddressIds;
|
||||
typedef virDomainZPCIAddressIds *virDomainZPCIAddressIdsPtr;
|
||||
|
||||
|
|
Loading…
Reference in New Issue