mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Handle VMX domains correctly across xend restarts
This patch remembers the device model pid across xend restarts and avoids creating duplicate device model processes. Also, device models don't inherit socket fds from xend (which are closed on exec now), which used to prevent xend restarting. Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com> Signed-off-by: Xiaohui Xin <xiaohui.xin@intel.com> Signed-off-by: Arun Sharma <arun.sharma@intel.com>
This commit is contained in:
1 parent
886d6d4581
commit
c7876d9e88
6 files changed
+21
-4
No files matched your search
@@ -20,6 +20,7 @@ import sys
|
||||
import threading
|
||||
import select
|
||||
import socket
|
||||
import fcntl
|
||||
|
||||
from errno import EAGAIN, EINTR, EWOULDBLOCK
|
||||
|
||||
@@ -152,6 +153,9 @@ class SocketListener:
|
||||
def createSocket(self):
|
||||
raise NotImplementedError()
|
||||
|
||||
def setCloExec(self):
|
||||
fcntl.fcntl(self.sock.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
|
||||
|
||||
def acceptConnection(self, sock, protocol, addr):
|
||||
return SocketServerConnection(sock, protocol, addr, self)
|
||||
|
||||
|
||||
@@ -16,4 +16,4 @@
|
||||
#============================================================================
|
||||
|
||||
from unix import listenUNIX, connectUNIX
|
||||
from tcp import listenTCP, connectTCP
|
||||
from tcp import listenTCP, connectTCP, SetCloExec
|
||||
@@ -85,6 +85,9 @@ def listenTCP(port, factory, interface='', backlog=None):
|
||||
l.startListening()
|
||||
return l
|
||||
|
||||
def SetCloExec(SocketListener):
|
||||
SocketListener.SetCloExec()
|
||||
|
||||
def connectTCP(host, port, factory, timeout=None, bindAddress=None):
|
||||
c = TCPConnector(host, port, factory, timeout=timeout, bindAddress=bindAddress)
|
||||
c.connect()
|
||||
|
||||
@@ -231,6 +231,7 @@ class XendDomainInfo:
|
||||
DBVar('restart_time', ty='float'),
|
||||
DBVar('restart_count', ty='int'),
|
||||
DBVar('target', ty='long', path="memory/target"),
|
||||
DBVar('device_model_pid', ty='int'),
|
||||
]
|
||||
|
||||
def __init__(self, db):
|
||||
@@ -275,6 +276,7 @@ class XendDomainInfo:
|
||||
self.vcpus = 1
|
||||
self.vcpusdb = {}
|
||||
self.bootloader = None
|
||||
self.device_model_pid = 0
|
||||
|
||||
def setDB(self, db):
|
||||
self.db = db
|
||||
@@ -457,6 +459,8 @@ class XendDomainInfo:
|
||||
sxpr.append(devs)
|
||||
if self.config:
|
||||
sxpr.append(['config', self.config])
|
||||
if self.device_model_pid:
|
||||
sxpr.append(['device_model_pid',self.device_model_pid])
|
||||
return sxpr
|
||||
|
||||
def sxpr_devices(self):
|
||||
@@ -739,7 +743,8 @@ class XendDomainInfo:
|
||||
ctrl.initController(reboot=True)
|
||||
else:
|
||||
self.create_configured_devices()
|
||||
self.image.createDeviceModel()
|
||||
if not self.device_model_pid:
|
||||
self.device_model_pid = self.image.createDeviceModel()
|
||||
|
||||
def device_create(self, dev_config):
|
||||
"""Create a new device.
|
||||
|
||||
@@ -262,7 +262,7 @@ class VmxImageHandler(ImageHandler):
|
||||
memmap = None
|
||||
memmap_value = []
|
||||
device_channel = None
|
||||
|
||||
pid = 0
|
||||
def createImage(self):
|
||||
"""Create a VM for the VMX environment.
|
||||
"""
|
||||
@@ -369,6 +369,7 @@ class VmxImageHandler(ImageHandler):
|
||||
log.info("spawning device models: %s %s", device_model, args)
|
||||
self.pid = os.spawnve(os.P_NOWAIT, device_model, args, env)
|
||||
log.info("device model pid: %d", self.pid)
|
||||
return self.pid
|
||||
|
||||
def vncParams(self):
|
||||
# see if a vncviewer was specified
|
||||
@@ -388,8 +389,11 @@ class VmxImageHandler(ImageHandler):
|
||||
def destroy(self):
|
||||
channel.eventChannelClose(self.device_channel)
|
||||
import signal
|
||||
if not self.pid:
|
||||
self.pid = self.vm.device_model_pid
|
||||
os.kill(self.pid, signal.SIGKILL)
|
||||
(pid, status) = os.waitpid(self.pid, 0)
|
||||
self.pid = 0
|
||||
|
||||
def getDomainMemory(self, mem_mb):
|
||||
return (mem_mb * 1024) + self.getPageTableSize(mem_mb)
|
||||
|
||||
@@ -140,7 +140,8 @@ def listenRelocation():
|
||||
if xroot.get_xend_relocation_server():
|
||||
port = xroot.get_xend_relocation_port()
|
||||
interface = xroot.get_xend_relocation_address()
|
||||
reactor.listenTCP(port, factory, interface=interface)
|
||||
l = reactor.listenTCP(port, factory, interface=interface)
|
||||
l.setCloExec()
|
||||
|
||||
def setupRelocation(dst, port):
|
||||
try:
|
||||
|
||||