提交 408aeebc 编写于 作者: M Martin Kletzander

resctrl: Do not calculate free bandwidth for MBA

For CAT we calculate unallocated parts of the cache, however with MBA this does
not make sense as the purpose of that is to limit the bandwidth and the setting
is only proportional relative to bandwidth settings for other groups.

This means it makes sense to set the values to 100% even if there are other
groups with some allocations and that we don't need to find the available
(unallocated) bandwidth in all the groups.
Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
上级 60a0d32e
...@@ -1823,22 +1823,6 @@ virResctrlAllocSubtract(virResctrlAllocPtr dst, ...@@ -1823,22 +1823,6 @@ virResctrlAllocSubtract(virResctrlAllocPtr dst,
} }
static void
virResctrlMemoryBandwidthSubtract(virResctrlAllocPtr free,
virResctrlAllocPtr used)
{
size_t i;
if (!used->mem_bw)
return;
for (i = 0; i < used->mem_bw->nbandwidths; i++) {
if (used->mem_bw->bandwidths[i])
*(free->mem_bw->bandwidths[i]) -= *(used->mem_bw->bandwidths[i]);
}
}
static virResctrlAllocPtr static virResctrlAllocPtr
virResctrlAllocNewFromInfo(virResctrlInfoPtr info) virResctrlAllocNewFromInfo(virResctrlInfoPtr info)
{ {
...@@ -1902,15 +1886,18 @@ virResctrlAllocNewFromInfo(virResctrlInfoPtr info) ...@@ -1902,15 +1886,18 @@ virResctrlAllocNewFromInfo(virResctrlInfoPtr info)
} }
/* /*
* This function creates an allocation that represents all unused parts of * This function creates an allocation that represents all unused parts of all
* all caches and memory bandwidth in the system. It uses virResctrlInfo * caches in the system. It uses virResctrlInfo for creating a new full
* for creating a new full allocation with all bits set (using the * allocation with all bits set (using virResctrlAllocNewFromInfo()) and then
* virResctrlAllocNewFromInfo()), sets memory bandwidth 100%, and then scans * scans for all allocations under /sys/fs/resctrl and subtracts each one of
* for all allocations under /sys/fs/resctrl and subtracts each one of them * them from it. That way it can then return an allocation with only bit set
* from it. That way it can then return an allocation with only bit set * being those that are not mentioned in any other allocation. It is used for
* being those that are not mentioned in any other allocation for CAT and * two things, a) calculating the masks when creating allocations and b) from
* available memory bandwidth for MBA. It is used for two things, calculating * tests.
* the masks and bandwidth available when creating allocations and from tests. *
* MBA (Memory Bandwidth Allocation) is not taken into account as it is a
* limiting setting, not an allocating one. The way it works is also vastly
* different from CAT.
*/ */
virResctrlAllocPtr virResctrlAllocPtr
virResctrlAllocGetUnused(virResctrlInfoPtr resctrl) virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
...@@ -1956,7 +1943,6 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl) ...@@ -1956,7 +1943,6 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
goto error; goto error;
} }
virResctrlMemoryBandwidthSubtract(ret, alloc);
virResctrlAllocSubtract(ret, alloc); virResctrlAllocSubtract(ret, alloc);
virObjectUnref(alloc); virObjectUnref(alloc);
alloc = NULL; alloc = NULL;
...@@ -2109,12 +2095,10 @@ virResctrlAllocFindUnused(virResctrlAllocPtr alloc, ...@@ -2109,12 +2095,10 @@ virResctrlAllocFindUnused(virResctrlAllocPtr alloc,
static int static int
virResctrlAllocMemoryBandwidth(virResctrlInfoPtr resctrl, virResctrlAllocMemoryBandwidth(virResctrlInfoPtr resctrl,
virResctrlAllocPtr alloc, virResctrlAllocPtr alloc)
virResctrlAllocPtr free)
{ {
size_t i; size_t i;
virResctrlAllocMemBWPtr mem_bw_alloc = alloc->mem_bw; virResctrlAllocMemBWPtr mem_bw_alloc = alloc->mem_bw;
virResctrlAllocMemBWPtr mem_bw_free = free->mem_bw;
virResctrlInfoMemBWPtr mem_bw_info = resctrl->membw_info; virResctrlInfoMemBWPtr mem_bw_info = resctrl->membw_info;
if (!mem_bw_alloc) if (!mem_bw_alloc)
...@@ -2154,14 +2138,6 @@ virResctrlAllocMemoryBandwidth(virResctrlInfoPtr resctrl, ...@@ -2154,14 +2138,6 @@ virResctrlAllocMemoryBandwidth(virResctrlInfoPtr resctrl,
i, mem_bw_info->max_id); i, mem_bw_info->max_id);
return -1; return -1;
} }
if (*(mem_bw_alloc->bandwidths[i]) > *(mem_bw_free->bandwidths[i])) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Not enough room for allocation of %u%% "
"bandwidth on node %zd, available bandwidth %u%%"),
*(mem_bw_alloc->bandwidths[i]), i,
*(mem_bw_free->bandwidths[i]));
return -1;
}
} }
return 0; return 0;
} }
...@@ -2228,7 +2204,7 @@ virResctrlAllocAssign(virResctrlInfoPtr resctrl, ...@@ -2228,7 +2204,7 @@ virResctrlAllocAssign(virResctrlInfoPtr resctrl,
if (!alloc_default) if (!alloc_default)
goto cleanup; goto cleanup;
if (virResctrlAllocMemoryBandwidth(resctrl, alloc, alloc_free) < 0) if (virResctrlAllocMemoryBandwidth(resctrl, alloc) < 0)
goto cleanup; goto cleanup;
if (virResctrlAllocCopyMasks(alloc, alloc_default) < 0) if (virResctrlAllocCopyMasks(alloc, alloc_default) < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册