Enable configurable vswitch memory

Currently, a DPDK enabled vswitch makes use of a fixed 1G hugepage to
enable an optimized datapath.

In the case of OVS-DPDK, this can cause an issue when changing the
MTU of one or more interfaces, as a seperate mempool is allocated
for each size.  If the minimal mempool size(s) cannot fit into the
1G page, DPDK memory initialization will fail.

This commit allows an operator to configure the amount of hugepage
memory allocated to each socket on a host, which can enable
jumboframe support for OVS-DPDK.

Change-Id: Ie54cc23a0839d80d2062510f8f6128eb68b2cfc9
Story: 2004472
Task: 28162
Depends-On: https://review.openstack.org/#/c/631039
Signed-off-by: Steven Webster <steven.webster@windriver.com>
This commit is contained in:
Steven Webster 2019-01-11 13:38:03 -05:00
parent 96e49c9a91
commit 8569c522fc
6 changed files with 184 additions and 14 deletions

View File

@ -1,2 +1,2 @@
SRC_DIR="starlingx-dashboard"
TIS_PATCH_VER=23
TIS_PATCH_VER=24

View File

@ -10,7 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
#
# Copyright (c) 2013-2018 Wind River Systems, Inc.
# Copyright (c) 2013-2019 Wind River Systems, Inc.
#
from __future__ import absolute_import
@ -154,6 +154,9 @@ class Memory(base.APIResourceWrapper):
'vm_hugepages_possible_2M',
'vm_hugepages_possible_1G',
'vm_hugepages_use_1G',
'vswitch_hugepages_reqd',
'vswitch_hugepages_size_mib',
'vswitch_hugepages_nr',
'uuid', 'ihost_uuid', 'inode_uuid',
'minimum_platform_reserved_mib']

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2013-2018 Wind River Systems, Inc.
# Copyright (c) 2013-2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
@ -23,6 +23,11 @@ LOG = logging.getLogger(__name__)
class UpdateMemory(forms.SelfHandlingForm):
VSWITCH_HP_SIZE_CHOICES = (
('2', _("2 MB")),
('1024', _("1 GB"))
)
host = forms.CharField(label=_("host"),
required=False,
widget=forms.widgets.HiddenInput)
@ -43,6 +48,19 @@ class UpdateMemory(forms.SelfHandlingForm):
label=_("# of Application 1G Hugepages Node 0"),
required=False)
vswitch_hugepages_reqd = forms.CharField(
label=_("# of vSwitch 1G Hugepages Node 0"),
required=False)
vswitch_hugepages_size_mib = forms.ChoiceField(
label=_("vSwitch Hugepage Size Node 0"),
required=False,
choices=VSWITCH_HP_SIZE_CHOICES,
widget=forms.Select(
attrs={
'class': 'switchable',
'data-slug': 'vswitch_hugepages_size_mib'}))
platform_memory_two = forms.CharField(
label=_("Platform Memory for Node 1"),
required=False)
@ -55,6 +73,19 @@ class UpdateMemory(forms.SelfHandlingForm):
label=_("# of Application 1G Hugepages Node 1"),
required=False)
vswitch_hugepages_reqd_two = forms.CharField(
label=_("# of vSwitch 1G Hugepages Node 1"),
required=False)
vswitch_hugepages_size_mib_two = forms.ChoiceField(
label=_("vSwitch Hugepage Size Node 1"),
required=False,
choices=VSWITCH_HP_SIZE_CHOICES,
widget=forms.Select(
attrs={
'class': 'switchable',
'data-slug': 'vswitch_hugepages_size_mib'}))
platform_memory_three = forms.CharField(
label=_("Platform Memory for Node 2"),
required=False)
@ -67,6 +98,19 @@ class UpdateMemory(forms.SelfHandlingForm):
label=_("# of Application 1G Hugepages Node 2"),
required=False)
vswitch_hugepages_reqd_three = forms.CharField(
label=_("# of vSwitch 1G Hugepages Node 2"),
required=False)
vswitch_hugepages_size_mib_three = forms.ChoiceField(
label=_("vSwitch Hugepage Size Node 2"),
required=False,
choices=VSWITCH_HP_SIZE_CHOICES,
widget=forms.Select(
attrs={
'class': 'switchable',
'data-slug': 'vswitch_hugepages_size_mib'}))
platform_memory_four = forms.CharField(
label=_("Platform Memory for Node 3"),
required=False)
@ -79,6 +123,19 @@ class UpdateMemory(forms.SelfHandlingForm):
label=_("# of Application 1G Hugepages Node 3"),
required=False)
vswitch_hugepages_reqd_four = forms.CharField(
label=_("# of vSwitch 1G Hugepages Node 3"),
required=False)
vswitch_hugepages_size_mib_four = forms.ChoiceField(
label=_("vSwitch Hugepage Size Node 3"),
required=False,
choices=VSWITCH_HP_SIZE_CHOICES,
widget=forms.Select(
attrs={
'class': 'switchable',
'data-slug': 'vswitch_hugepages_size_mib'}))
failure_url = 'horizon:admin:inventory:detail'
def __init__(self, request, *args, **kwargs):
@ -90,22 +147,37 @@ class UpdateMemory(forms.SelfHandlingForm):
{
'platform_memory': self.fields['platform_memory'],
'vm_hugepages_nr_2M': self.fields['vm_hugepages_nr_2M'],
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G']
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G'],
'vswitch_hugepages_size_mib':
self.fields['vswitch_hugepages_size_mib'],
'vswitch_hugepages_reqd': self.fields['vswitch_hugepages_reqd']
},
{
'platform_memory': self.fields['platform_memory_two'],
'vm_hugepages_nr_2M': self.fields['vm_hugepages_nr_2M_two'],
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G_two']
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G_two'],
'vswitch_hugepages_size_mib':
self.fields['vswitch_hugepages_size_mib_two'],
'vswitch_hugepages_reqd':
self.fields['vswitch_hugepages_reqd_two']
},
{
'platform_memory': self.fields['platform_memory_three'],
'vm_hugepages_nr_2M': self.fields['vm_hugepages_nr_2M_three'],
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G_three']
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G_three'],
'vswitch_hugepages_size_mib':
self.fields['vswitch_hugepages_size_mib_three'],
'vswitch_hugepages_reqd':
self.fields['vswitch_hugepages_reqd_three']
},
{
'platform_memory': self.fields['platform_memory_four'],
'vm_hugepages_nr_2M': self.fields['vm_hugepages_nr_2M_four'],
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G_four']
'vm_hugepages_nr_1G': self.fields['vm_hugepages_nr_1G_four'],
'vswitch_hugepages_size_mib':
self.fields['vswitch_hugepages_size_mib_four'],
'vswitch_hugepages_reqd':
self.fields['vswitch_hugepages_reqd_four']
}
]
@ -156,6 +228,26 @@ class UpdateMemory(forms.SelfHandlingForm):
if not vm_1g_supported:
vm_1G_field.widget.attrs['disabled'] = 'disabled'
vswitch_hp_reqd_field = field_set['vswitch_hugepages_reqd']
vswitch_hp_reqd_field.help_text = \
'Maximum vSwitch pages'
vswitch_hp_size_mib_field = \
field_set['vswitch_hugepages_size_mib']
vswitch_hp_size_mib_field.help_text = \
'vSwitch hugepage size'
if m.vswitch_hugepages_reqd:
vswitch_hp_reqd_field.initial = \
str(m.vswitch_hugepages_reqd)
elif m.vswitch_hugepages_nr:
vswitch_hp_reqd_field.initial = \
str(m.vswitch_hugepages_nr)
if m.vswitch_hugepages_size_mib:
vswitch_hp_size_mib_field.initial = \
str(m.vswitch_hugepages_size_mib)
break
while count < 4:
@ -166,6 +258,10 @@ class UpdateMemory(forms.SelfHandlingForm):
forms.widgets.HiddenInput()
field_set['vm_hugepages_nr_1G'].widget = \
forms.widgets.HiddenInput()
field_set['vswitch_hugepages_reqd'].widget = \
forms.widgets.HiddenInput()
field_set['vswitch_hugepages_size_mib'].widget = \
forms.widgets.HiddenInput()
count += 1
def clean(self):
@ -184,23 +280,31 @@ class UpdateMemory(forms.SelfHandlingForm):
if data['platform_memory_two'] or \
data['vm_hugepages_nr_2M_two'] or \
data['vm_hugepages_nr_1G_two']:
data['vm_hugepages_nr_1G_two'] or \
data['vswitch_hugepages_size_mib_two'] or \
data['vswitch_hugepages_reqd_two']:
node.append('node1')
if data['platform_memory_three'] or \
data['vm_hugepages_nr_2M_three'] or \
data['vm_hugepages_nr_1G_three']:
data['vm_hugepages_nr_1G_three'] or \
data['vswitch_hugepages_size_mib_three'] or \
data['vswitch_hugepages_reqd_three']:
node.append('node2')
if data['platform_memory_four'] or \
data['vm_hugepages_nr_2M_four'] or \
data['vm_hugepages_nr_1G_four']:
data['vm_hugepages_nr_1G_four'] or \
data['vswitch_hugepages_size_mib_four'] or \
data['vswitch_hugepages_reqd_four']:
node.append('node3')
# host = api.sysinv.host_get(request, host_id)
pages_1G = {}
pages_2M = {}
plat_mem = {}
pages_vs_size = {}
pages_vs_reqd = {}
# Node 0 arguments
if not data['platform_memory']:
@ -218,6 +322,16 @@ class UpdateMemory(forms.SelfHandlingForm):
else:
pages_1G['node0'] = data['vm_hugepages_nr_1G']
if not data['vswitch_hugepages_size_mib']:
del data['vswitch_hugepages_size_mib']
else:
pages_vs_size['node0'] = data['vswitch_hugepages_size_mib']
if not data['vswitch_hugepages_reqd']:
del data['vswitch_hugepages_reqd']
else:
pages_vs_reqd['node0'] = data['vswitch_hugepages_reqd']
# Node 1 arguments
if not data['platform_memory_two']:
del data['platform_memory_two']
@ -234,6 +348,16 @@ class UpdateMemory(forms.SelfHandlingForm):
else:
pages_1G['node1'] = data['vm_hugepages_nr_1G_two']
if not data['vswitch_hugepages_size_mib_two']:
del data['vswitch_hugepages_size_mib_two']
else:
pages_vs_size['node1'] = data['vswitch_hugepages_size_mib_two']
if not data['vswitch_hugepages_reqd_two']:
del data['vswitch_hugepages_reqd_two']
else:
pages_vs_reqd['node1'] = data['vswitch_hugepages_reqd_two']
# Node 2 arguments
if not data['platform_memory_three']:
del data['platform_memory_three']
@ -250,6 +374,16 @@ class UpdateMemory(forms.SelfHandlingForm):
else:
pages_1G['node2'] = data['vm_hugepages_nr_1G_three']
if not data['vswitch_hugepages_size_mib_three']:
del data['vswitch_hugepages_size_mib_three']
else:
pages_vs_size['node2'] = data['vswitch_hugepages_size_mib_three']
if not data['vswitch_hugepages_reqd']:
del data['vswitch_hugepages_reqd']
else:
pages_vs_reqd['node2'] = data['vswitch_hugepages_reqd_three']
# Node 3 arguments
if not data['platform_memory_four']:
del data['platform_memory_four']
@ -266,6 +400,16 @@ class UpdateMemory(forms.SelfHandlingForm):
else:
pages_1G['node3'] = data['vm_hugepages_nr_1G_four']
if not data['vswitch_hugepages_size_mib_four']:
del data['vswitch_hugepages_size_mib_four']
else:
pages_vs_size['node3'] = data['vswitch_hugepages_size_mib_four']
if not data['vswitch_hugepages_reqd_four']:
del data['vswitch_hugepages_reqd_four']
else:
pages_vs_reqd['node3'] = data['vswitch_hugepages_reqd_four']
try:
for nd in node:
node_found = False
@ -288,6 +432,11 @@ class UpdateMemory(forms.SelfHandlingForm):
new_data['vm_hugepages_nr_2M_pending'] = pages_2M[nd]
if nd in pages_1G:
new_data['vm_hugepages_nr_1G_pending'] = pages_1G[nd]
if nd in pages_vs_size:
new_data['vswitch_hugepages_size_mib'] = \
pages_vs_size[nd]
if nd in pages_vs_reqd:
new_data['vswitch_hugepages_reqd'] = pages_vs_reqd[nd]
if new_data:
stx_api.sysinv.host_memory_update(request, memory.uuid,

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2013-2014 Wind River Systems, Inc.
# Copyright (c) 2013-2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
@ -69,6 +69,12 @@ def get_vm_hugepages(memory):
return template.loader.render_to_string(template_name, context)
def get_vs_hugepages(memory):
template_name = 'admin/inventory/memorys/_vswitchfunction_hugepages.html'
context = {"memory": memory}
return template.loader.render_to_string(template_name, context)
class MemorysTable(tables.DataTable):
processor = tables.Column('numa_node',
verbose_name=_('Processor'))
@ -79,6 +85,9 @@ class MemorysTable(tables.DataTable):
vm_huge = tables.Column(get_vm_hugepages,
verbose_name=_('Application Pages'))
vs_huge = tables.Column(get_vs_hugepages,
verbose_name=_('vSwitch Pages'))
def get_object_id(self, datum):
return str(datum.uuid)

View File

@ -17,6 +17,7 @@
<th>{% trans "Numa Node" %}</th>
<th>{% trans "Platform Reserved" %}</th>
<th>{% trans "Application Hugepages" %}</th>
<th>{% trans "vSwitch Hugepages" %}</th>
</tr>
{% for node,m in host.numa_nodes %}
<tr>
@ -26,6 +27,10 @@
{% trans " 2M Pages: " %} {{ m.vm_hugepages_nr_2M }} {{ "<br>" }}
{% trans " 1G Pages: " %} {{ m.vm_hugepages_nr_1G }} {{ "<br>" }}
</td>
<td>
{% trans " Size (MB): " %} {{ m.vswitch_hugepages_size_mib }} {{ "<br>" }}
{% trans " Pages: " %} {{ m.vswitch_hugepages_nr }} {{ "<br>" }}
</td>
</tr>
{% endfor %}
</table>

View File

@ -1,5 +1,9 @@
{% if memory.hugepages_configured == 'True' %}
<strong>{{ "Size: " }}</strong> {{ memory.avs_hugepages_size_mib }} {{ " MiB" }} {{ "<br>" }}
<strong>{{ "Total: " }}</strong> {{ memory.avs_hugepages_nr }} {{ "<br>" }}
<strong>{{ "Available: " }}</strong> {{ memory.avs_hugepages_avail }} {{ "<br>" }}
<strong>{{ "Size: " }}</strong> {{ memory.vswitch_hugepages_size_mib }} {{ " MiB" }} {{ "<br>" }}
{% if memory.vswitch_hugepages_reqd or memory.vswitch_hugepages_reqd == 0 %}
<strong>{{ "&nbsp;&nbsp;&nbsp;&nbsp;Total: " }}</strong> {{ memory.vswitch_hugepages_nr }}
<strong>{{ "&nbsp;&nbsp;Pending: "}}</strong> {{ memory.vswitch_hugepages_reqd }} {{ "<br>" }}
{% else %}
<strong>{{ "&nbsp;&nbsp;&nbsp;&nbsp;Total: " }}</strong> {{ memory.vswitch_hugepages_nr }} {{ "<br>" }}
{% endif %}
{% endif%}