From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id B43721B1C8 for ; Mon, 8 Jan 2018 10:56:30 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Jan 2018 01:56:30 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,330,1511856000"; d="scan'208";a="193209994" Received: from dpdk-test38.sh.intel.com ([10.67.119.87]) by fmsmga006.fm.intel.com with ESMTP; 08 Jan 2018 01:56:29 -0800 From: Marvin Liu To: dts@dpdk.org Cc: Marvin Liu Date: Sun, 7 Jan 2018 21:49:24 -0500 Message-Id: <1515379769-11553-12-git-send-email-yong.liu@intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1515379769-11553-1-git-send-email-yong.liu@intel.com> References: <1515379769-11553-1-git-send-email-yong.liu@intel.com> Subject: [dts] [PATCH v1 11/16] framework/virt_resource: support multiple VMs module X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Jan 2018 09:56:31 -0000 1. Added serial and migrate port allocation support 2. Added lock for virtualzation resource allocation functions 3. Quick scan free port in port allocation function Signed-off-by: Marvin Liu diff --git a/framework/virt_resource.py b/framework/virt_resource.py index b830f4e..2f1b680 100644 --- a/framework/virt_resource.py +++ b/framework/virt_resource.py @@ -31,10 +31,16 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from random import randint -from utils import get_obj_funcs +from utils import get_obj_funcs, parallel_lock, RED -INIT_FREE_PORT = 6060 +#global INIT_FREE_PORT +#global INIT_SERIAL_PORT +#global INIT_MIGRATE_PORT +INIT_FREE_PORT = 6000 +INIT_SERIAL_PORT = 7000 +INIT_MIGRATE_PORT = 8000 +QuickScan = True class VirtResource(object): @@ -149,6 +155,7 @@ class VirtResource(object): for cpu in cpus: self.__core_used(cpu) + @parallel_lock() def alloc_cpu(self, vm='', number=-1, socket=-1, corelist=None): """ There're two options for request cpu resouce for vm. @@ -207,12 +214,14 @@ class VirtResource(object): return False return True + @parallel_lock() def free_cpu(self, vm): if self.__vm_has_resource(vm, 'cores'): for core in self.allocated_info[vm]['cores']: self.__core_unused(core) self.allocated_info[vm].pop('cores') + @parallel_lock() def alloc_pf(self, vm='', number=-1, socket=-1, pflist=[]): """ There're two options for request pf devices for vm. @@ -246,12 +255,14 @@ class VirtResource(object): self.allocated_info[vm]['ports'] = ports return ports + @parallel_lock() def free_pf(self, vm): if self.__vm_has_resource(vm, 'ports'): for pci in self.allocated_info[vm]['ports']: self.__port_unused(pci) self.allocated_info[vm].pop('ports') + @parallel_lock() def alloc_vf_from_pf(self, vm='', pf_pci='', number=-1, vflist=[]): """ There're two options for request vf devices of pf device. @@ -286,12 +297,14 @@ class VirtResource(object): self.allocated_info[vm]['vfs'] = vfs return vfs + @parallel_lock() def free_vf(self, vm): if self.__vm_has_resource(vm, 'vfs'): for pci in self.allocated_info[vm]['vfs']: self.__vf_unused(pci) self.allocated_info[vm].pop('vfs') + @parallel_lock() def add_vf_on_pf(self, pf_pci='', vflist=[]): """ Add vf devices generated by specified pf devices. @@ -307,6 +320,7 @@ class VirtResource(object): self.used_vfs += used_vfs self.vfs += vfs + @parallel_lock() def del_vf_on_pf(self, pf_pci='', vflist=[]): """ Remove vf devices generated by specified pf devices. @@ -327,38 +341,78 @@ class VirtResource(object): del self.used_vfs[index] del self.vfs[index] - def alloc_port(self, vm=''): + @parallel_lock() + def _check_port_allocated(self, port): + """ + Check whether port has been pre-allocated + """ + for vm_info in self.allocated_info.values(): + if vm_info.has_key('hostport') and port == vm_info['hostport']: + return True + if vm_info.has_key('serialport') and port == vm_info['serialport']: + return True + if vm_info.has_key('migrateport') and port == vm_info['migrateport']: + return True + return False + + @parallel_lock() + def alloc_port(self, vm='', port_type='connect'): """ Allocate unused host port for vm """ + global INIT_FREE_PORT + global INIT_SERIAL_PORT + global INIT_MIGRATE_PORT + if vm == '': print "Alloc host port request vitual machine name!!!" return None - port_start = INIT_FREE_PORT + randint(1, 100) - port_step = randint(1, 10) - port = None - count = 20 + if port_type == 'connect': + port = INIT_FREE_PORT + elif port_type == 'serial': + port = INIT_SERIAL_PORT + elif port_type == 'migrate': + port = INIT_MIGRATE_PORT + while True: - if self.dut.check_port_occupied(port_start) is False: - port = port_start - break - count -= 1 - if count < 0: - print 'No available port on the host!!!' + if self.dut.check_port_occupied(port) is False and self._check_port_allocated(port) is False: break - port_start += port_step + else: + port += 1 + continue if vm not in self.allocated_info: self.allocated_info[vm] = {} - self.allocated_info[vm]['hostport'] = port + if port_type == 'connect': + self.allocated_info[vm]['hostport'] = port + elif port_type == 'serial': + self.allocated_info[vm]['serialport'] = port + elif port_type == 'migrate': + self.allocated_info[vm]['migrateport'] = port + + # do not scan port from the begining + if QuickScan: + if port_type == 'connect': + INIT_FREE_PORT = port + elif port_type == 'serial': + INIT_SERIAL_PORT = port + elif port_type == 'migrate': + INIT_MIGRATE_PORT = port + return port + @parallel_lock() def free_port(self, vm): if self.__vm_has_resource(vm, 'hostport'): self.allocated_info[vm].pop('hostport') + if self.__vm_has_resource(vm, 'serialport'): + self.allocated_info[vm].pop('serialport') + if self.__vm_has_resource(vm, 'migrateport'): + self.allocated_info[vm].pop('migrateport') + @parallel_lock() def alloc_vnc_num(self, vm=''): """ Allocate unused host VNC display number for VM. @@ -377,10 +431,12 @@ class VirtResource(object): return free_vnc_display_num + @parallel_lock() def free_vnc_num(self, vm): if self.__vm_has_resource(vm, 'vnc_display_num'): self.allocated_info[vm].pop('vnc_display_num') + @parallel_lock() def free_all_resource(self, vm): """ Free all resource VM has been allocated. -- 1.9.3