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:
Peter Krempa 2020-10-20 17:31:23 +02:00
parent 32ab328461
commit 07780553f6
2 changed files with 27 additions and 100 deletions

View File

@ -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;

View File

@ -115,8 +115,8 @@ typedef struct {
typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;
typedef struct {
virHashTablePtr uids;
virHashTablePtr fids;
GHashTable *uids;
GHashTable *fids;
} virDomainZPCIAddressIds;
typedef virDomainZPCIAddressIds *virDomainZPCIAddressIdsPtr;