From 8569c522fc167e88fcde1f2fa40177a8171308c4 Mon Sep 17 00:00:00 2001 From: Steven Webster Date: Fri, 11 Jan 2019 13:38:03 -0500 Subject: [PATCH] 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 --- starlingx-dashboard/centos/build_srpm.data | 2 +- .../starlingx_dashboard/api/sysinv.py | 5 +- .../admin/inventory/memories/forms.py | 165 +++++++++++++++++- .../admin/inventory/memories/tables.py | 11 +- .../inventory/memorys/_createprofile.html | 5 + .../memorys/_vswitchfunction_hugepages.html | 10 +- 6 files changed, 184 insertions(+), 14 deletions(-) diff --git a/starlingx-dashboard/centos/build_srpm.data b/starlingx-dashboard/centos/build_srpm.data index a9a7d14a..38f9ad7e 100644 --- a/starlingx-dashboard/centos/build_srpm.data +++ b/starlingx-dashboard/centos/build_srpm.data @@ -1,2 +1,2 @@ SRC_DIR="starlingx-dashboard" -TIS_PATCH_VER=23 +TIS_PATCH_VER=24 diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/api/sysinv.py b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/api/sysinv.py index 2245e2cd..10b11ebe 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/api/sysinv.py +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/api/sysinv.py @@ -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'] diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/forms.py b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/forms.py index 8b584b33..6036473c 100755 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/forms.py +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/forms.py @@ -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, diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/tables.py b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/tables.py index 8bdc396c..39e673d5 100644 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/tables.py +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/memories/tables.py @@ -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) diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_createprofile.html b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_createprofile.html index a4e5ad5d..363f460d 100755 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_createprofile.html +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_createprofile.html @@ -17,6 +17,7 @@ {% trans "Numa Node" %} {% trans "Platform Reserved" %} {% trans "Application Hugepages" %} + {% trans "vSwitch Hugepages" %} {% for node,m in host.numa_nodes %} @@ -26,6 +27,10 @@ {% trans " 2M Pages: " %} {{ m.vm_hugepages_nr_2M }} {{ "
" }} {% trans " 1G Pages: " %} {{ m.vm_hugepages_nr_1G }} {{ "
" }} + + {% trans " Size (MB): " %} {{ m.vswitch_hugepages_size_mib }} {{ "
" }} + {% trans " Pages: " %} {{ m.vswitch_hugepages_nr }} {{ "
" }} + {% endfor %} diff --git a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_vswitchfunction_hugepages.html b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_vswitchfunction_hugepages.html index 3345a3f8..296945cc 100755 --- a/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_vswitchfunction_hugepages.html +++ b/starlingx-dashboard/starlingx-dashboard/starlingx_dashboard/dashboards/admin/inventory/templates/inventory/memorys/_vswitchfunction_hugepages.html @@ -1,5 +1,9 @@ {% if memory.hugepages_configured == 'True' %} - {{ "Size: " }} {{ memory.avs_hugepages_size_mib }} {{ " MiB" }} {{ "
" }} - {{ "Total: " }} {{ memory.avs_hugepages_nr }} {{ "
" }} - {{ "Available: " }} {{ memory.avs_hugepages_avail }} {{ "
" }} + {{ "Size: " }} {{ memory.vswitch_hugepages_size_mib }} {{ " MiB" }} {{ "
" }} + {% if memory.vswitch_hugepages_reqd or memory.vswitch_hugepages_reqd == 0 %} + {{ "    Total: " }} {{ memory.vswitch_hugepages_nr }} + {{ "  Pending: "}} {{ memory.vswitch_hugepages_reqd }} {{ "
" }} + {% else %} + {{ "    Total: " }} {{ memory.vswitch_hugepages_nr }} {{ "
" }} + {% endif %} {% endif%}