mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +00:00
conf: numa: Rename virDomainNumatune to virDomainNuma
The structure will gradually become the only place for NUMA related config, thus rename it appropriately.
This commit is contained in:
parent
456268d46b
commit
6bc80fa86d
@ -2249,7 +2249,7 @@ void virDomainDefFree(virDomainDefPtr def)
|
|||||||
virBitmapFree(def->cputune.iothreadsched[i].ids);
|
virBitmapFree(def->cputune.iothreadsched[i].ids);
|
||||||
VIR_FREE(def->cputune.iothreadsched);
|
VIR_FREE(def->cputune.iothreadsched);
|
||||||
|
|
||||||
virDomainNumatuneFree(def->numatune);
|
virDomainNumaFree(def->numa);
|
||||||
|
|
||||||
virSysinfoDefFree(def->sysinfo);
|
virSysinfoDefFree(def->sysinfo);
|
||||||
|
|
||||||
@ -13508,14 +13508,14 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainNumatuneParseXML(&def->numatune,
|
if (virDomainNumatuneParseXML(&def->numa,
|
||||||
def->placement_mode ==
|
def->placement_mode ==
|
||||||
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
||||||
def->cpu ? def->cpu->ncells : 0,
|
def->cpu ? def->cpu->ncells : 0,
|
||||||
ctxt) < 0)
|
ctxt) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (virDomainNumatuneHasPlacementAuto(def->numatune) &&
|
if (virDomainNumatuneHasPlacementAuto(def->numa) &&
|
||||||
!def->cpumask && !def->cputune.vcpupin &&
|
!def->cpumask && !def->cputune.vcpupin &&
|
||||||
!def->cputune.emulatorpin && !def->cputune.iothreadspin)
|
!def->cputune.emulatorpin && !def->cputune.iothreadspin)
|
||||||
def->placement_mode = VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO;
|
def->placement_mode = VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO;
|
||||||
@ -19894,7 +19894,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
|
|||||||
if (cputune)
|
if (cputune)
|
||||||
virBufferAddLit(buf, "</cputune>\n");
|
virBufferAddLit(buf, "</cputune>\n");
|
||||||
|
|
||||||
if (virDomainNumatuneFormatXML(buf, def->numatune) < 0)
|
if (virDomainNumatuneFormatXML(buf, def->numa) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (def->resource)
|
if (def->resource)
|
||||||
@ -22322,7 +22322,7 @@ virDomainDefNeedsPlacementAdvice(virDomainDefPtr def)
|
|||||||
if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
|
if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (virDomainNumatuneHasPlacementAuto(def->numatune))
|
if (virDomainNumatuneHasPlacementAuto(def->numa))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -2091,7 +2091,7 @@ struct _virDomainDef {
|
|||||||
|
|
||||||
virDomainCputune cputune;
|
virDomainCputune cputune;
|
||||||
|
|
||||||
virDomainNumatunePtr numatune;
|
virDomainNumaPtr numa;
|
||||||
virDomainResourceDefPtr resource;
|
virDomainResourceDefPtr resource;
|
||||||
virDomainIdMapDef idmap;
|
virDomainIdMapDef idmap;
|
||||||
|
|
||||||
|
@ -43,10 +43,10 @@ VIR_ENUM_IMPL(virDomainNumatunePlacement,
|
|||||||
"static",
|
"static",
|
||||||
"auto");
|
"auto");
|
||||||
|
|
||||||
typedef struct _virDomainNumatuneNode virDomainNumatuneNode;
|
typedef struct _virDomainNumaNode virDomainNumaNode;
|
||||||
typedef virDomainNumatuneNode *virDomainNumatuneNodePtr;
|
typedef virDomainNumaNode *virDomainNumaNodePtr;
|
||||||
|
|
||||||
struct _virDomainNumatune {
|
struct _virDomainNuma {
|
||||||
struct {
|
struct {
|
||||||
bool specified;
|
bool specified;
|
||||||
virBitmapPtr nodeset;
|
virBitmapPtr nodeset;
|
||||||
@ -54,7 +54,7 @@ struct _virDomainNumatune {
|
|||||||
virDomainNumatunePlacement placement;
|
virDomainNumatunePlacement placement;
|
||||||
} memory; /* pinning for all the memory */
|
} memory; /* pinning for all the memory */
|
||||||
|
|
||||||
struct _virDomainNumatuneNode {
|
struct _virDomainNumaNode {
|
||||||
virBitmapPtr nodeset;
|
virBitmapPtr nodeset;
|
||||||
virDomainNumatuneMemMode mode;
|
virDomainNumatuneMemMode mode;
|
||||||
} *mem_nodes; /* fine tuning per guest node */
|
} *mem_nodes; /* fine tuning per guest node */
|
||||||
@ -65,7 +65,7 @@ struct _virDomainNumatune {
|
|||||||
|
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
virDomainNumatuneNodeSpecified(virDomainNumatunePtr numatune,
|
virDomainNumatuneNodeSpecified(virDomainNumaPtr numatune,
|
||||||
int cellid)
|
int cellid)
|
||||||
{
|
{
|
||||||
if (numatune &&
|
if (numatune &&
|
||||||
@ -77,7 +77,7 @@ virDomainNumatuneNodeSpecified(virDomainNumatunePtr numatune,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virDomainNumatuneNodeParseXML(virDomainNumatunePtr *numatunePtr,
|
virDomainNumatuneNodeParseXML(virDomainNumaPtr *numatunePtr,
|
||||||
size_t ncells,
|
size_t ncells,
|
||||||
xmlXPathContextPtr ctxt)
|
xmlXPathContextPtr ctxt)
|
||||||
{
|
{
|
||||||
@ -85,7 +85,7 @@ virDomainNumatuneNodeParseXML(virDomainNumatunePtr *numatunePtr,
|
|||||||
int n = 0;
|
int n = 0;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
virDomainNumatunePtr numatune = *numatunePtr;
|
virDomainNumaPtr numatune = *numatunePtr;
|
||||||
xmlNodePtr *nodes = NULL;
|
xmlNodePtr *nodes = NULL;
|
||||||
|
|
||||||
if ((n = virXPathNodeSet("./numatune/memnode", ctxt, &nodes)) < 0) {
|
if ((n = virXPathNodeSet("./numatune/memnode", ctxt, &nodes)) < 0) {
|
||||||
@ -126,7 +126,7 @@ virDomainNumatuneNodeParseXML(virDomainNumatunePtr *numatunePtr,
|
|||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
int mode = 0;
|
int mode = 0;
|
||||||
unsigned int cellid = 0;
|
unsigned int cellid = 0;
|
||||||
virDomainNumatuneNodePtr mem_node = NULL;
|
virDomainNumaNodePtr mem_node = NULL;
|
||||||
xmlNodePtr cur_node = nodes[i];
|
xmlNodePtr cur_node = nodes[i];
|
||||||
|
|
||||||
tmp = virXMLPropString(cur_node, "cellid");
|
tmp = virXMLPropString(cur_node, "cellid");
|
||||||
@ -194,7 +194,7 @@ virDomainNumatuneNodeParseXML(virDomainNumatunePtr *numatunePtr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
virDomainNumatuneParseXML(virDomainNumatunePtr *numatunePtr,
|
virDomainNumatuneParseXML(virDomainNumaPtr *numatunePtr,
|
||||||
bool placement_static,
|
bool placement_static,
|
||||||
size_t ncells,
|
size_t ncells,
|
||||||
xmlXPathContextPtr ctxt)
|
xmlXPathContextPtr ctxt)
|
||||||
@ -220,7 +220,7 @@ virDomainNumatuneParseXML(virDomainNumatunePtr *numatunePtr,
|
|||||||
node = virXPathNode("./numatune/memory[1]", ctxt);
|
node = virXPathNode("./numatune/memory[1]", ctxt);
|
||||||
|
|
||||||
if (*numatunePtr) {
|
if (*numatunePtr) {
|
||||||
virDomainNumatuneFree(*numatunePtr);
|
virDomainNumaFree(*numatunePtr);
|
||||||
*numatunePtr = NULL;
|
*numatunePtr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ virDomainNumatuneParseXML(virDomainNumatunePtr *numatunePtr,
|
|||||||
|
|
||||||
int
|
int
|
||||||
virDomainNumatuneFormatXML(virBufferPtr buf,
|
virDomainNumatuneFormatXML(virBufferPtr buf,
|
||||||
virDomainNumatunePtr numatune)
|
virDomainNumaPtr numatune)
|
||||||
{
|
{
|
||||||
const char *tmp = NULL;
|
const char *tmp = NULL;
|
||||||
char *nodeset = NULL;
|
char *nodeset = NULL;
|
||||||
@ -316,7 +316,7 @@ virDomainNumatuneFormatXML(virBufferPtr buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < numatune->nmem_nodes; i++) {
|
for (i = 0; i < numatune->nmem_nodes; i++) {
|
||||||
virDomainNumatuneNodePtr mem_node = &numatune->mem_nodes[i];
|
virDomainNumaNodePtr mem_node = &numatune->mem_nodes[i];
|
||||||
|
|
||||||
if (!mem_node->nodeset)
|
if (!mem_node->nodeset)
|
||||||
continue;
|
continue;
|
||||||
@ -338,23 +338,23 @@ virDomainNumatuneFormatXML(virBufferPtr buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
virDomainNumatuneFree(virDomainNumatunePtr numatune)
|
virDomainNumaFree(virDomainNumaPtr numa)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
if (!numatune)
|
if (!numa)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
virBitmapFree(numatune->memory.nodeset);
|
virBitmapFree(numa->memory.nodeset);
|
||||||
for (i = 0; i < numatune->nmem_nodes; i++)
|
for (i = 0; i < numa->nmem_nodes; i++)
|
||||||
virBitmapFree(numatune->mem_nodes[i].nodeset);
|
virBitmapFree(numa->mem_nodes[i].nodeset);
|
||||||
VIR_FREE(numatune->mem_nodes);
|
VIR_FREE(numa->mem_nodes);
|
||||||
|
|
||||||
VIR_FREE(numatune);
|
VIR_FREE(numa);
|
||||||
}
|
}
|
||||||
|
|
||||||
virDomainNumatuneMemMode
|
virDomainNumatuneMemMode
|
||||||
virDomainNumatuneGetMode(virDomainNumatunePtr numatune,
|
virDomainNumatuneGetMode(virDomainNumaPtr numatune,
|
||||||
int cellid)
|
int cellid)
|
||||||
{
|
{
|
||||||
if (!numatune)
|
if (!numatune)
|
||||||
@ -370,7 +370,7 @@ virDomainNumatuneGetMode(virDomainNumatunePtr numatune,
|
|||||||
}
|
}
|
||||||
|
|
||||||
virBitmapPtr
|
virBitmapPtr
|
||||||
virDomainNumatuneGetNodeset(virDomainNumatunePtr numatune,
|
virDomainNumatuneGetNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
int cellid)
|
int cellid)
|
||||||
{
|
{
|
||||||
@ -391,7 +391,7 @@ virDomainNumatuneGetNodeset(virDomainNumatunePtr numatune,
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
virDomainNumatuneFormatNodeset(virDomainNumatunePtr numatune,
|
virDomainNumatuneFormatNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
int cellid)
|
int cellid)
|
||||||
{
|
{
|
||||||
@ -402,7 +402,7 @@ virDomainNumatuneFormatNodeset(virDomainNumatunePtr numatune,
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
virDomainNumatuneMaybeGetNodeset(virDomainNumatunePtr numatune,
|
virDomainNumatuneMaybeGetNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
virBitmapPtr *retNodeset,
|
virBitmapPtr *retNodeset,
|
||||||
int cellid)
|
int cellid)
|
||||||
@ -432,7 +432,7 @@ virDomainNumatuneMaybeGetNodeset(virDomainNumatunePtr numatune,
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
virDomainNumatuneMaybeFormatNodeset(virDomainNumatunePtr numatune,
|
virDomainNumatuneMaybeFormatNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
char **mask,
|
char **mask,
|
||||||
int cellid)
|
int cellid)
|
||||||
@ -451,7 +451,7 @@ virDomainNumatuneMaybeFormatNodeset(virDomainNumatunePtr numatune,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
virDomainNumatuneSet(virDomainNumatunePtr *numatunePtr,
|
virDomainNumatuneSet(virDomainNumaPtr *numatunePtr,
|
||||||
bool placement_static,
|
bool placement_static,
|
||||||
int placement,
|
int placement,
|
||||||
int mode,
|
int mode,
|
||||||
@ -459,7 +459,7 @@ virDomainNumatuneSet(virDomainNumatunePtr *numatunePtr,
|
|||||||
{
|
{
|
||||||
bool created = false;
|
bool created = false;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
virDomainNumatunePtr numatune;
|
virDomainNumaPtr numatune;
|
||||||
|
|
||||||
/* No need to do anything in this case */
|
/* No need to do anything in this case */
|
||||||
if (mode == -1 && placement == -1 && !nodeset)
|
if (mode == -1 && placement == -1 && !nodeset)
|
||||||
@ -538,7 +538,7 @@ virDomainNumatuneSet(virDomainNumatunePtr *numatunePtr,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (ret < 0 && created) {
|
if (ret < 0 && created) {
|
||||||
virDomainNumatuneFree(*numatunePtr);
|
virDomainNumaFree(*numatunePtr);
|
||||||
*numatunePtr = NULL;
|
*numatunePtr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,8 +546,8 @@ virDomainNumatuneSet(virDomainNumatunePtr *numatunePtr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
virDomainNumatuneNodesEqual(virDomainNumatunePtr n1,
|
virDomainNumaNodesEqual(virDomainNumaPtr n1,
|
||||||
virDomainNumatunePtr n2)
|
virDomainNumaPtr n2)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
@ -555,8 +555,8 @@ virDomainNumatuneNodesEqual(virDomainNumatunePtr n1,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (i = 0; i < n1->nmem_nodes; i++) {
|
for (i = 0; i < n1->nmem_nodes; i++) {
|
||||||
virDomainNumatuneNodePtr nd1 = &n1->mem_nodes[i];
|
virDomainNumaNodePtr nd1 = &n1->mem_nodes[i];
|
||||||
virDomainNumatuneNodePtr nd2 = &n2->mem_nodes[i];
|
virDomainNumaNodePtr nd2 = &n2->mem_nodes[i];
|
||||||
|
|
||||||
if (!nd1->nodeset && !nd2->nodeset)
|
if (!nd1->nodeset && !nd2->nodeset)
|
||||||
continue;
|
continue;
|
||||||
@ -572,8 +572,8 @@ virDomainNumatuneNodesEqual(virDomainNumatunePtr n1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
virDomainNumatuneEquals(virDomainNumatunePtr n1,
|
virDomainNumaEquals(virDomainNumaPtr n1,
|
||||||
virDomainNumatunePtr n2)
|
virDomainNumaPtr n2)
|
||||||
{
|
{
|
||||||
if (!n1 && !n2)
|
if (!n1 && !n2)
|
||||||
return true;
|
return true;
|
||||||
@ -582,7 +582,7 @@ virDomainNumatuneEquals(virDomainNumatunePtr n1,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!n1->memory.specified && !n2->memory.specified)
|
if (!n1->memory.specified && !n2->memory.specified)
|
||||||
return virDomainNumatuneNodesEqual(n1, n2);
|
return virDomainNumaNodesEqual(n1, n2);
|
||||||
|
|
||||||
if (!n1->memory.specified || !n2->memory.specified)
|
if (!n1->memory.specified || !n2->memory.specified)
|
||||||
return false;
|
return false;
|
||||||
@ -596,11 +596,11 @@ virDomainNumatuneEquals(virDomainNumatunePtr n1,
|
|||||||
if (!virBitmapEqual(n1->memory.nodeset, n2->memory.nodeset))
|
if (!virBitmapEqual(n1->memory.nodeset, n2->memory.nodeset))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return virDomainNumatuneNodesEqual(n1, n2);
|
return virDomainNumaNodesEqual(n1, n2);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
virDomainNumatuneHasPlacementAuto(virDomainNumatunePtr numatune)
|
virDomainNumatuneHasPlacementAuto(virDomainNumaPtr numatune)
|
||||||
{
|
{
|
||||||
if (!numatune)
|
if (!numatune)
|
||||||
return false;
|
return false;
|
||||||
@ -615,7 +615,7 @@ virDomainNumatuneHasPlacementAuto(virDomainNumatunePtr numatune)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
virDomainNumatuneHasPerNodeBinding(virDomainNumatunePtr numatune)
|
virDomainNumatuneHasPerNodeBinding(virDomainNumaPtr numatune)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
@ -631,7 +631,7 @@ virDomainNumatuneHasPerNodeBinding(virDomainNumatunePtr numatune)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
virDomainNumatuneSpecifiedMaxNode(virDomainNumatunePtr numatune)
|
virDomainNumatuneSpecifiedMaxNode(virDomainNumaPtr numatune)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
virBitmapPtr nodemask = NULL;
|
virBitmapPtr nodemask = NULL;
|
||||||
@ -659,7 +659,7 @@ virDomainNumatuneSpecifiedMaxNode(virDomainNumatunePtr numatune)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
virDomainNumatuneNodesetIsAvailable(virDomainNumatunePtr numatune,
|
virDomainNumatuneNodesetIsAvailable(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset)
|
virBitmapPtr auto_nodeset)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
# include "cpu_conf.h"
|
# include "cpu_conf.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct _virDomainNumatune virDomainNumatune;
|
typedef struct _virDomainNuma virDomainNuma;
|
||||||
typedef virDomainNumatune *virDomainNumatunePtr;
|
typedef virDomainNuma *virDomainNumaPtr;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
VIR_DOMAIN_NUMATUNE_PLACEMENT_DEFAULT = 0,
|
VIR_DOMAIN_NUMATUNE_PLACEMENT_DEFAULT = 0,
|
||||||
@ -47,31 +47,31 @@ VIR_ENUM_DECL(virDomainNumatunePlacement)
|
|||||||
VIR_ENUM_DECL(virDomainNumatuneMemMode)
|
VIR_ENUM_DECL(virDomainNumatuneMemMode)
|
||||||
|
|
||||||
|
|
||||||
void virDomainNumatuneFree(virDomainNumatunePtr numatune);
|
void virDomainNumaFree(virDomainNumaPtr numa);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XML Parse/Format functions
|
* XML Parse/Format functions
|
||||||
*/
|
*/
|
||||||
int virDomainNumatuneParseXML(virDomainNumatunePtr *numatunePtr,
|
int virDomainNumatuneParseXML(virDomainNumaPtr *numatunePtr,
|
||||||
bool placement_static,
|
bool placement_static,
|
||||||
size_t ncells,
|
size_t ncells,
|
||||||
xmlXPathContextPtr ctxt)
|
xmlXPathContextPtr ctxt)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4);
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4);
|
||||||
|
|
||||||
int virDomainNumatuneFormatXML(virBufferPtr buf, virDomainNumatunePtr numatune)
|
int virDomainNumatuneFormatXML(virBufferPtr buf, virDomainNumaPtr numatune)
|
||||||
ATTRIBUTE_NONNULL(1);
|
ATTRIBUTE_NONNULL(1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Getters
|
* Getters
|
||||||
*/
|
*/
|
||||||
virDomainNumatuneMemMode virDomainNumatuneGetMode(virDomainNumatunePtr numatune,
|
virDomainNumatuneMemMode virDomainNumatuneGetMode(virDomainNumaPtr numatune,
|
||||||
int cellid);
|
int cellid);
|
||||||
|
|
||||||
virBitmapPtr virDomainNumatuneGetNodeset(virDomainNumatunePtr numatune,
|
virBitmapPtr virDomainNumatuneGetNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
int cellid);
|
int cellid);
|
||||||
|
|
||||||
int virDomainNumatuneMaybeGetNodeset(virDomainNumatunePtr numatune,
|
int virDomainNumatuneMaybeGetNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
virBitmapPtr *retNodeset,
|
virBitmapPtr *retNodeset,
|
||||||
int cellid);
|
int cellid);
|
||||||
@ -79,11 +79,11 @@ int virDomainNumatuneMaybeGetNodeset(virDomainNumatunePtr numatune,
|
|||||||
/*
|
/*
|
||||||
* Formatters
|
* Formatters
|
||||||
*/
|
*/
|
||||||
char *virDomainNumatuneFormatNodeset(virDomainNumatunePtr numatune,
|
char *virDomainNumatuneFormatNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
int cellid);
|
int cellid);
|
||||||
|
|
||||||
int virDomainNumatuneMaybeFormatNodeset(virDomainNumatunePtr numatune,
|
int virDomainNumatuneMaybeFormatNodeset(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset,
|
virBitmapPtr auto_nodeset,
|
||||||
char **mask,
|
char **mask,
|
||||||
int cellid);
|
int cellid);
|
||||||
@ -91,7 +91,7 @@ int virDomainNumatuneMaybeFormatNodeset(virDomainNumatunePtr numatune,
|
|||||||
/*
|
/*
|
||||||
* Setters
|
* Setters
|
||||||
*/
|
*/
|
||||||
int virDomainNumatuneSet(virDomainNumatunePtr *numatunePtr,
|
int virDomainNumatuneSet(virDomainNumaPtr *numatunePtr,
|
||||||
bool placement_static,
|
bool placement_static,
|
||||||
int placement,
|
int placement,
|
||||||
int mode,
|
int mode,
|
||||||
@ -101,19 +101,19 @@ int virDomainNumatuneSet(virDomainNumatunePtr *numatunePtr,
|
|||||||
/*
|
/*
|
||||||
* Other accessors
|
* Other accessors
|
||||||
*/
|
*/
|
||||||
bool virDomainNumatuneEquals(virDomainNumatunePtr n1,
|
bool virDomainNumaEquals(virDomainNumaPtr n1,
|
||||||
virDomainNumatunePtr n2);
|
virDomainNumaPtr n2);
|
||||||
|
|
||||||
bool virDomainNumatuneHasPlacementAuto(virDomainNumatunePtr numatune);
|
bool virDomainNumatuneHasPlacementAuto(virDomainNumaPtr numatune);
|
||||||
|
|
||||||
bool virDomainNumatuneHasPerNodeBinding(virDomainNumatunePtr numatune);
|
bool virDomainNumatuneHasPerNodeBinding(virDomainNumaPtr numatune);
|
||||||
|
|
||||||
int virDomainNumatuneSpecifiedMaxNode(virDomainNumatunePtr numatune);
|
int virDomainNumatuneSpecifiedMaxNode(virDomainNumaPtr numatune);
|
||||||
|
|
||||||
bool virDomainNumatuneNodesetIsAvailable(virDomainNumatunePtr numatune,
|
bool virDomainNumatuneNodesetIsAvailable(virDomainNumaPtr numatune,
|
||||||
virBitmapPtr auto_nodeset);
|
virBitmapPtr auto_nodeset);
|
||||||
|
|
||||||
bool virDomainNumatuneNodeSpecified(virDomainNumatunePtr numatune,
|
bool virDomainNumatuneNodeSpecified(virDomainNumaPtr numatune,
|
||||||
int cellid);
|
int cellid);
|
||||||
|
|
||||||
int virDomainNumaDefCPUParseXML(virCPUDefPtr def, xmlXPathContextPtr ctxt);
|
int virDomainNumaDefCPUParseXML(virCPUDefPtr def, xmlXPathContextPtr ctxt);
|
||||||
|
@ -626,10 +626,10 @@ virNodeDeviceObjUnlock;
|
|||||||
|
|
||||||
|
|
||||||
# conf/numa_conf.h
|
# conf/numa_conf.h
|
||||||
virDomainNumatuneEquals;
|
virDomainNumaEquals;
|
||||||
|
virDomainNumaFree;
|
||||||
virDomainNumatuneFormatNodeset;
|
virDomainNumatuneFormatNodeset;
|
||||||
virDomainNumatuneFormatXML;
|
virDomainNumatuneFormatXML;
|
||||||
virDomainNumatuneFree;
|
|
||||||
virDomainNumatuneGetMode;
|
virDomainNumatuneGetMode;
|
||||||
virDomainNumatuneGetNodeset;
|
virDomainNumatuneGetNodeset;
|
||||||
virDomainNumatuneHasPerNodeBinding;
|
virDomainNumatuneHasPerNodeBinding;
|
||||||
|
@ -79,11 +79,11 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainNumatuneGetMode(def->numatune, -1) !=
|
if (virDomainNumatuneGetMode(def->numa, -1) !=
|
||||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT)
|
VIR_DOMAIN_NUMATUNE_MEM_STRICT)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainNumatuneMaybeFormatNodeset(def->numatune, nodemask,
|
if (virDomainNumatuneMaybeFormatNodeset(def->numa, nodemask,
|
||||||
&mask, -1) < 0)
|
&mask, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -747,8 +747,8 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl)
|
|||||||
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
|
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numatune, auto_nodeset, -1);
|
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numa, auto_nodeset, -1);
|
||||||
mode = virDomainNumatuneGetMode(ctrl->def->numatune, -1);
|
mode = virDomainNumatuneGetMode(ctrl->def->numa, -1);
|
||||||
|
|
||||||
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
|
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -778,7 +778,7 @@ static int virLXCControllerSetupCgroupLimits(virLXCControllerPtr ctrl)
|
|||||||
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
|
if (virLXCControllerGetNumadAdvice(ctrl, &auto_nodeset) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numatune, auto_nodeset, -1);
|
nodeset = virDomainNumatuneGetNodeset(ctrl->def->numa, auto_nodeset, -1);
|
||||||
|
|
||||||
if (!(ctrl->cgroup = virLXCCgroupCreate(ctrl->def,
|
if (!(ctrl->cgroup = virLXCCgroupCreate(ctrl->def,
|
||||||
ctrl->initpid,
|
ctrl->initpid,
|
||||||
|
@ -847,7 +847,7 @@ lxcSetCpusetTune(virDomainDefPtr def, virConfPtr properties)
|
|||||||
value->str) {
|
value->str) {
|
||||||
if (virBitmapParse(value->str, 0, &nodeset, VIR_DOMAIN_CPUMASK_LEN) < 0)
|
if (virBitmapParse(value->str, 0, &nodeset, VIR_DOMAIN_CPUMASK_LEN) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (virDomainNumatuneSet(&def->numatune,
|
if (virDomainNumatuneSet(&def->numa,
|
||||||
def->placement_mode ==
|
def->placement_mode ==
|
||||||
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
||||||
VIR_DOMAIN_NUMATUNE_PLACEMENT_STATIC,
|
VIR_DOMAIN_NUMATUNE_PLACEMENT_STATIC,
|
||||||
|
@ -1825,7 +1825,7 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (def->numatune) {
|
if (def->numa) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("numa parameters are not supported "
|
_("numa parameters are not supported "
|
||||||
"by parallels driver"));
|
"by parallels driver"));
|
||||||
|
@ -619,11 +619,11 @@ qemuSetupCpusetMems(virDomainObjPtr vm)
|
|||||||
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
|
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (virDomainNumatuneGetMode(vm->def->numatune, -1) !=
|
if (virDomainNumatuneGetMode(vm->def->numa, -1) !=
|
||||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT)
|
VIR_DOMAIN_NUMATUNE_MEM_STRICT)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (virDomainNumatuneMaybeFormatNodeset(vm->def->numatune,
|
if (virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
|
||||||
priv->autoNodeset,
|
priv->autoNodeset,
|
||||||
&mem_mask, -1) < 0)
|
&mem_mask, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1030,9 +1030,9 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainNumatuneGetMode(vm->def->numatune, -1) ==
|
if (virDomainNumatuneGetMode(vm->def->numa, -1) ==
|
||||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
||||||
virDomainNumatuneMaybeFormatNodeset(vm->def->numatune,
|
virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
|
||||||
priv->autoNodeset,
|
priv->autoNodeset,
|
||||||
&mem_mask, -1) < 0)
|
&mem_mask, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1201,9 +1201,9 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainNumatuneGetMode(vm->def->numatune, -1) ==
|
if (virDomainNumatuneGetMode(vm->def->numa, -1) ==
|
||||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
||||||
virDomainNumatuneMaybeFormatNodeset(vm->def->numatune,
|
virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
|
||||||
priv->autoNodeset,
|
priv->autoNodeset,
|
||||||
&mem_mask, -1) < 0)
|
&mem_mask, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -4571,7 +4571,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
|
|||||||
if (!(props = virJSONValueNewObject()))
|
if (!(props = virJSONValueNewObject()))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
mode = virDomainNumatuneGetMode(def->numatune, guestNode);
|
mode = virDomainNumatuneGetMode(def->numa, guestNode);
|
||||||
|
|
||||||
if (pagesize == 0 || pagesize != system_page_size) {
|
if (pagesize == 0 || pagesize != system_page_size) {
|
||||||
/* Find the huge page size we want to use */
|
/* Find the huge page size we want to use */
|
||||||
@ -4682,7 +4682,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
|
|||||||
if (userNodeset) {
|
if (userNodeset) {
|
||||||
nodemask = userNodeset;
|
nodemask = userNodeset;
|
||||||
} else {
|
} else {
|
||||||
if (virDomainNumatuneMaybeGetNodeset(def->numatune, autoNodeset,
|
if (virDomainNumatuneMaybeGetNodeset(def->numa, autoNodeset,
|
||||||
&nodemask, guestNode) < 0)
|
&nodemask, guestNode) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -4699,7 +4699,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
|
|||||||
props = NULL;
|
props = NULL;
|
||||||
|
|
||||||
if (!hugepage) {
|
if (!hugepage) {
|
||||||
bool nodeSpecified = virDomainNumatuneNodeSpecified(def->numatune, guestNode);
|
bool nodeSpecified = virDomainNumatuneNodeSpecified(def->numa, guestNode);
|
||||||
|
|
||||||
if ((userNodeset || nodeSpecified || force) &&
|
if ((userNodeset || nodeSpecified || force) &&
|
||||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM)) {
|
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM)) {
|
||||||
@ -7123,7 +7123,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
const long system_page_size = virGetSystemPageSizeKB();
|
const long system_page_size = virGetSystemPageSizeKB();
|
||||||
|
|
||||||
if (virDomainNumatuneHasPerNodeBinding(def->numatune) &&
|
if (virDomainNumatuneHasPerNodeBinding(def->numa) &&
|
||||||
!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
|
!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
|
||||||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE))) {
|
virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE))) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
@ -7141,7 +7141,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!virDomainNumatuneNodesetIsAvailable(def->numatune, auto_nodeset))
|
if (!virDomainNumatuneNodesetIsAvailable(def->numa, auto_nodeset))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
for (i = 0; i < def->mem.nhugepages; i++) {
|
for (i = 0; i < def->mem.nhugepages; i++) {
|
||||||
|
@ -4544,9 +4544,9 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainNumatuneGetMode(vm->def->numatune, -1) ==
|
if (virDomainNumatuneGetMode(vm->def->numa, -1) ==
|
||||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
||||||
virDomainNumatuneMaybeFormatNodeset(vm->def->numatune,
|
virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
|
||||||
priv->autoNodeset,
|
priv->autoNodeset,
|
||||||
&mem_mask, -1) < 0)
|
&mem_mask, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -9404,7 +9404,7 @@ qemuDomainSetNumaParamsLive(virDomainObjPtr vm,
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (virDomainNumatuneGetMode(vm->def->numatune, -1) !=
|
if (virDomainNumatuneGetMode(vm->def->numa, -1) !=
|
||||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
|
VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
_("change of nodeset for running domain "
|
_("change of nodeset for running domain "
|
||||||
@ -9533,7 +9533,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
|
|||||||
|
|
||||||
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
|
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
|
||||||
if (mode != -1 &&
|
if (mode != -1 &&
|
||||||
virDomainNumatuneGetMode(vm->def->numatune, -1) != mode) {
|
virDomainNumatuneGetMode(vm->def->numa, -1) != mode) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
_("can't change numatune mode for running domain"));
|
_("can't change numatune mode for running domain"));
|
||||||
goto endjob;
|
goto endjob;
|
||||||
@ -9543,7 +9543,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
|
|||||||
qemuDomainSetNumaParamsLive(vm, nodeset) < 0)
|
qemuDomainSetNumaParamsLive(vm, nodeset) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
if (virDomainNumatuneSet(&vm->def->numatune,
|
if (virDomainNumatuneSet(&vm->def->numa,
|
||||||
vm->def->placement_mode ==
|
vm->def->placement_mode ==
|
||||||
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
||||||
-1, mode, nodeset) < 0)
|
-1, mode, nodeset) < 0)
|
||||||
@ -9554,7 +9554,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
||||||
if (virDomainNumatuneSet(&persistentDef->numatune,
|
if (virDomainNumatuneSet(&persistentDef->numa,
|
||||||
persistentDef->placement_mode ==
|
persistentDef->placement_mode ==
|
||||||
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC,
|
||||||
-1, mode, nodeset) < 0)
|
-1, mode, nodeset) < 0)
|
||||||
@ -9632,14 +9632,14 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (flags & VIR_DOMAIN_AFFECT_CONFIG)
|
if (flags & VIR_DOMAIN_AFFECT_CONFIG)
|
||||||
param->value.i = virDomainNumatuneGetMode(persistentDef->numatune, -1);
|
param->value.i = virDomainNumatuneGetMode(persistentDef->numa, -1);
|
||||||
else
|
else
|
||||||
param->value.i = virDomainNumatuneGetMode(vm->def->numatune, -1);
|
param->value.i = virDomainNumatuneGetMode(vm->def->numa, -1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: /* fill numa nodeset here */
|
case 1: /* fill numa nodeset here */
|
||||||
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
||||||
nodeset = virDomainNumatuneFormatNodeset(persistentDef->numatune,
|
nodeset = virDomainNumatuneFormatNodeset(persistentDef->numa,
|
||||||
NULL, -1);
|
NULL, -1);
|
||||||
if (!nodeset)
|
if (!nodeset)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -9647,7 +9647,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
|
|||||||
if (!virCgroupHasController(priv->cgroup,
|
if (!virCgroupHasController(priv->cgroup,
|
||||||
VIR_CGROUP_CONTROLLER_MEMORY) ||
|
VIR_CGROUP_CONTROLLER_MEMORY) ||
|
||||||
virCgroupGetCpusetMems(priv->cgroup, &nodeset) < 0) {
|
virCgroupGetCpusetMems(priv->cgroup, &nodeset) < 0) {
|
||||||
nodeset = virDomainNumatuneFormatNodeset(vm->def->numatune,
|
nodeset = virDomainNumatuneFormatNodeset(vm->def->numa,
|
||||||
NULL, -1);
|
NULL, -1);
|
||||||
if (!nodeset)
|
if (!nodeset)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -3263,8 +3263,8 @@ static int qemuProcessHook(void *data)
|
|||||||
if (virSecurityManagerClearSocketLabel(h->driver->securityManager, h->vm->def) < 0)
|
if (virSecurityManagerClearSocketLabel(h->driver->securityManager, h->vm->def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
mode = virDomainNumatuneGetMode(h->vm->def->numatune, -1);
|
mode = virDomainNumatuneGetMode(h->vm->def->numa, -1);
|
||||||
nodeset = virDomainNumatuneGetNodeset(h->vm->def->numatune,
|
nodeset = virDomainNumatuneGetNodeset(h->vm->def->numa,
|
||||||
priv->autoNodeset, -1);
|
priv->autoNodeset, -1);
|
||||||
|
|
||||||
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
|
if (virNumaSetupMemoryPolicy(mode, nodeset) < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user