Commit 4c3733a8 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

experiments: add support for non-NIC pci device simulators

parent e9c1dcbc
...@@ -41,7 +41,7 @@ class Experiment(object): ...@@ -41,7 +41,7 @@ class Experiment(object):
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name
self.hosts = [] self.hosts = []
self.nics = [] self.pcidevs = []
self.networks = [] self.networks = []
self.metadata = {} self.metadata = {}
...@@ -52,10 +52,13 @@ class Experiment(object): ...@@ -52,10 +52,13 @@ class Experiment(object):
self.hosts.append(sim) self.hosts.append(sim)
def add_nic(self, sim): def add_nic(self, sim):
for n in self.nics: self.add_pcidev(sim)
if n.name == sim.name:
raise Exception('Duplicate nic name') def add_pcidev(self, sim):
self.nics.append(sim) for d in self.pcidevs:
if d.name == sim.name:
raise Exception('Duplicate pcidev name')
self.pcidevs.append(sim)
def add_network(self, sim): def add_network(self, sim):
for n in self.networks: for n in self.networks:
...@@ -65,7 +68,7 @@ class Experiment(object): ...@@ -65,7 +68,7 @@ class Experiment(object):
def all_simulators(self): def all_simulators(self):
""" All simulators used in experiment. """ """ All simulators used in experiment. """
return itertools.chain(self.hosts, self.nics, self.networks) return itertools.chain(self.hosts, self.pcidevs, self.networks)
def resreq_mem(self): def resreq_mem(self):
mem = 0 mem = 0
...@@ -339,14 +342,14 @@ class ExpEnv(object): ...@@ -339,14 +342,14 @@ class ExpEnv(object):
def cfgtar_path(self, sim): def cfgtar_path(self, sim):
return '%s/cfg.%s.tar' % (self.workdir, sim.name) return '%s/cfg.%s.tar' % (self.workdir, sim.name)
def nic_pci_path(self, sim): def dev_pci_path(self, sim):
return '%s/nic.pci.%s' % (self.workdir, sim.name) return '%s/dev.pci.%s' % (self.workdir, sim.name)
def nic_eth_path(self, sim): def nic_eth_path(self, sim):
return '%s/nic.eth.%s' % (self.workdir, sim.name) return '%s/nic.eth.%s' % (self.workdir, sim.name)
def nic_shm_path(self, sim): def dev_shm_path(self, sim):
return '%s/nic.shm.%s' % (self.shm_base, sim.name) return '%s/dev.shm.%s' % (self.shm_base, sim.name)
def n2n_eth_path(self, sim_l, sim_c): def n2n_eth_path(self, sim_l, sim_c):
return '%s/n2n.eth.%s.%s' % (self.workdir, sim_l.name, sim_c.name) return '%s/n2n.eth.%s.%s' % (self.workdir, sim_l.name, sim_c.name)
......
...@@ -70,37 +70,56 @@ class HostSim(Simulator): ...@@ -70,37 +70,56 @@ class HostSim(Simulator):
pci_latency = 500 pci_latency = 500
def __init__(self): def __init__(self):
self.nics = [] self.pcidevs = []
super().__init__() super().__init__()
def full_name(self): def full_name(self):
return 'host.' + self.name return 'host.' + self.name
def add_nic(self, nic): def add_nic(self, dev):
nic.name = self.name + '.' + nic.name self.add_pcidev(dev)
self.nics.append(nic)
def add_pcidev(self, dev):
dev.name = self.name + '.' + dev.name
self.pcidevs.append(dev)
def set_config(self, nc): def set_config(self, nc):
self.node_config = nc self.node_config = nc
def dependencies(self): def dependencies(self):
deps = [] deps = []
for nic in self.nics: for dev in self.pcidevs:
deps.append(nic) deps.append(dev)
deps.append(nic.network) if isinstance(dev, NICSim):
deps.append(dev.network)
return deps return deps
def wait_terminate(self): def wait_terminate(self):
return self.wait return self.wait
class NICSim(Simulator):
network = None
name = ''
class PCIDevSim(Simulator):
name = ''
sync_mode = 0 sync_mode = 0
start_tick = 0 start_tick = 0
sync_period = 500 sync_period = 500
pci_latency = 500 pci_latency = 500
def __init__(self):
super().__init__()
def full_name(self):
return 'dev.' + self.name
def sockets_cleanup(self, env):
return [env.dev_pci_path(self), env.dev_shm_path(self)]
def sockets_wait(self, env):
return [env.dev_pci_path(self)]
class NICSim(PCIDevSim):
network = None
eth_latency = 500 eth_latency = 500
def __init__(self): def __init__(self):
...@@ -112,8 +131,8 @@ class NICSim(Simulator): ...@@ -112,8 +131,8 @@ class NICSim(Simulator):
def basic_args(self, env, extra=None): def basic_args(self, env, extra=None):
cmd = '%s %s %s %d %d %d %d %d' % \ cmd = '%s %s %s %d %d %d %d %d' % \
(env.nic_pci_path(self), env.nic_eth_path(self), (env.dev_pci_path(self), env.nic_eth_path(self),
env.nic_shm_path(self), self.sync_mode, self.start_tick, env.dev_shm_path(self), self.sync_mode, self.start_tick,
self.sync_period, self.pci_latency, self.eth_latency) self.sync_period, self.pci_latency, self.eth_latency)
if extra is not None: if extra is not None:
...@@ -130,11 +149,10 @@ class NICSim(Simulator): ...@@ -130,11 +149,10 @@ class NICSim(Simulator):
return 'nic.' + self.name return 'nic.' + self.name
def sockets_cleanup(self, env): def sockets_cleanup(self, env):
return [env.nic_pci_path(self), env.nic_eth_path(self), return super().sockets_cleanup(env) + [env.nic_eth_path(self)]
env.nic_shm_path(self)]
def sockets_wait(self, env): def sockets_wait(self, env):
return [env.nic_pci_path(self), env.nic_eth_path(self)] return super().sockets_wait(env) + [env.nic_eth_path(self)]
class NetSim(Simulator): class NetSim(Simulator):
name = '' name = ''
...@@ -229,11 +247,11 @@ class QemuHost(HostSim): ...@@ -229,11 +247,11 @@ class QemuHost(HostSim):
else: else:
cmd += ' -cpu host -enable-kvm ' cmd += ' -cpu host -enable-kvm '
if len(self.nics) > 0: di = 0
assert len(self.nics) == 1 for dev in self.pcidevs:
cmd += f'-chardev socket,path={env.nic_pci_path(self.nics[0])},' cmd += f'-chardev socket,path={env.dev_pci_path(dev)},'
cmd += 'id=simbrickscd ' cmd += f'id=simbrickscd{di} '
cmd += f'-device simbricks-pci,chardev=simbrickscd' cmd += f'-device simbricks-pci,chardev=simbrickscd{di}'
if self.sync: if self.sync:
cmd += ',sync=on' cmd += ',sync=on'
cmd += f',sync-mode={self.sync_mode}' cmd += f',sync-mode={self.sync_mode}'
...@@ -242,6 +260,7 @@ class QemuHost(HostSim): ...@@ -242,6 +260,7 @@ class QemuHost(HostSim):
else: else:
cmd += ',sync=off' cmd += ',sync=off'
cmd += ' ' cmd += ' '
di += 1
return cmd return cmd
...@@ -293,19 +312,19 @@ class Gem5Host(HostSim): ...@@ -293,19 +312,19 @@ class Gem5Host(HostSim):
if env.restore_cp: if env.restore_cp:
cmd += '-r 1 ' cmd += '-r 1 '
if len(self.nics) > 0: if len(self.pcidevs) > 0:
assert len(self.nics) == 1 assert len(self.pcidevs) == 1 # our gem5 python script supports only 1
nic = self.nics[0] dev = self.pcidevs[0]
cmd += f'--simbricks-pci={env.nic_pci_path(nic)} ' cmd += f'--simbricks-pci={env.dev_pci_path(dev)} '
cmd += f'--simbricks-shm={env.nic_shm_path(nic)} ' cmd += f'--simbricks-shm={env.dev_shm_path(dev)} '
if cpu_type == 'TimingSimpleCPU': if cpu_type == 'TimingSimpleCPU':
cmd += '--simbricks-sync ' cmd += '--simbricks-sync '
cmd += f'--simbricks-sync_mode={self.sync_mode} ' cmd += f'--simbricks-sync_mode={self.sync_mode} '
cmd += f'--simbricks-pci-lat={self.pci_latency} ' cmd += f'--simbricks-pci-lat={self.pci_latency} '
cmd += f'--simbricks-sync-int={self.sync_period} ' cmd += f'--simbricks-sync-int={self.sync_period} '
if isinstance(nic, I40eNIC) or \ if isinstance(dev, I40eNIC) or \
(isinstance(nic, MultiSubNIC) and \ (isinstance(dev, MultiSubNIC) and \
isinstance(nic.multinic, I40eMultiNIC)): isinstance(dev.multinic, I40eMultiNIC)):
cmd += '--simbricks-type=i40e ' cmd += '--simbricks-type=i40e '
return cmd return cmd
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment