On 07/04/2011 09:57 AM, Cleber Rosa wrote:
> On 07/04/2011 03:45 AM, Prasad Joshi wrote:
>> On Mon, Jul 4, 2011 at 7:32 AM, Cleber Rosa<[email protected]> wrote:
>>> Building and loading KVM modules that are not shipped with the Linux
>>> kernel
>>> is discouraged these days.
>>>
>>> This patch allows for loading the KVM modules only on the default
>>> system
>>> location, which should be the modules built/shipped with the running
>>> kernel.
>>>
>>> Signed-off-by: Cleber Rosa<[email protected]>
>>> ---
>>> client/tests/kvm/build.cfg.sample | 20 +----
>>> client/virt/kvm_installer.py | 172
>>> ++-----------------------------------
>>> 2 files changed, 11 insertions(+), 181 deletions(-)
>>>
>>> diff --git a/client/tests/kvm/build.cfg.sample
>>> b/client/tests/kvm/build.cfg.sample
>>> index e60c4bc..0bccd65 100644
>>> --- a/client/tests/kvm/build.cfg.sample
>>> +++ b/client/tests/kvm/build.cfg.sample
>>> @@ -34,19 +34,8 @@ variants:
>>> - git:
>>> install_mode = git
>>> ## Install KVM from git repositories.
>>> - ## If you provide only "git_repo" and
>>> "user_git_repo", the
>>> - ## build test will assume it will perform all build
>>> from the
>>> - ## userspace dir, building modules trough
>>> - ## make -C kernel LINUX=%s sync. As of today
>>> (07-13-2009)
>>> - ## upstream needs 3 git repos:
>>> - ## * git_repo (linux sources)
>>> - ## * user_git_repo (qemu sources)
>>> - ## * kmod_repo" to build KVM userspace + kernel
>>> modules.
>>> - # git_repo =
>>> git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm.git
>>> - # kernel_branch = kernel_branch_name
>>> - # kernel_lbranch = kernel_lbranch_name
>>> - # kernel_commit = kernel_commit_name
>>> - # kernel_patches = ['http://foo.com/patch1',
>>> 'http://foo.com/patch2']
>>> + ## This now only concerns the userspace component,
>>> and it assumes
>>> + ## the kernel modules are shipped with the linux
>>> kernel.
>>> user_git_repo =
>>> git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git
>>> # user_branch = user_branch_name
>>> # user_lbranch = user_lbranch_name
>>> @@ -54,11 +43,6 @@ variants:
>>> # user_patches = ['http://foo.com/patch1',
>>> 'http://foo.com/patch2']
>>> ## This is how you pass extra params to the
>>> userspace configure script
>>> # extra_configure_options = '--enable-spice
>>> --disable-werror'
>>> - # kmod_repo =
>>> git://git.kernel.org/pub/scm/virt/kvm/kvm-kmod.git
>>> - # kmod_branch = kmod_branch_name
>>> - # kmod_lbranch = kmod_lbranch_name
>>> - # kmod_commit = kmod_commit_name
>>> - # kmod_patches = ['http://foo.com/patch1',
>>> 'http://foo.com/patch2']
>>> # spice_repo =
>>> git://anongit.freedesktop.org/spice/spice
>>> # spice_branch = master
>>> # spice_lbranch = master
>>> diff --git a/client/virt/kvm_installer.py
>>> b/client/virt/kvm_installer.py
>>> index e79c9fc..98bde12 100644
>>> --- a/client/virt/kvm_installer.py
>>> +++ b/client/virt/kvm_installer.py
>>> @@ -15,68 +15,6 @@ def kill_qemu_processes():
>>> utils.system("fuser -k /dev/kvm", ignore_status=True)
>>>
>>>
>>> -def _unload_kvm_modules(mod_list):
>>> - logging.info("Unloading previously loaded KVM modules")
>>> - for module in reversed(mod_list):
>>> - utils.unload_module(module)
>>> -
>>> -
>>> -def _load_kvm_modules(mod_list, module_dir=None, load_stock=False):
>>> - """
>>> - Just load the KVM modules, without killing Qemu or unloading
>>> previous
>>> - modules.
>>> -
>>> - Load modules present on any sub directory of module_dir.
>>> Function will walk
>>> - through module_dir until it finds the modules.
>>> -
>>> - @param module_dir: Directory where the KVM modules are located.
>>> - @param load_stock: Whether we are going to load system kernel
>>> modules.
>>> - @param extra_modules: List of extra modules to load.
>>> - """
>>> - if module_dir:
>>> - logging.info("Loading the built KVM modules...")
>>> - kvm_module_path = None
>>> - kvm_vendor_module_path = None
>>> - abort = False
>>> -
>>> - list_modules = ['%s.ko' % (m) for m in mod_list]
>>> -
>>> - list_module_paths = []
>>> - for folder, subdirs, files in os.walk(module_dir):
>>> - for module in list_modules:
>>> - if module in files:
>>> - module_path = os.path.join(folder, module)
>>> - list_module_paths.append(module_path)
>>> -
>>> - # We might need to arrange the modules in the correct order
>>> - # to avoid module load problems
>>> - list_modules_load = []
>>> - for module in list_modules:
>>> - for module_path in list_module_paths:
>>> - if os.path.basename(module_path) == module:
>>> - list_modules_load.append(module_path)
>>> -
>>> - if len(list_module_paths) != len(list_modules):
>>> - logging.error("KVM modules not found. If you don't want
>>> to use the "
>>> - "modules built by this test, make sure
>>> the option "
>>> - "load_modules: 'no' is marked on the test
>>> control "
>>> - "file.")
>>> - raise error.TestError("The modules %s were requested to
>>> be loaded, "
>>> - "but the only modules found were
>>> %s" %
>>> - (list_modules, list_module_paths))
>>> -
>>> - for module_path in list_modules_load:
>>> - try:
>>> - utils.system("insmod %s" % module_path)
>>> - except Exception, e:
>>> - raise error.TestFail("Failed to load KVM modules:
>>> %s" % e)
>>> -
>>> - if load_stock:
>>> - logging.info("Loading current system KVM modules...")
>>> - for module in mod_list:
>>> - utils.system("modprobe %s" % module)
>>> -
>>> -
>>> def create_symlinks(test_bindir, prefix=None, bin_list=None,
>>> unittest=None):
>>> """
>>> Create symbolic links for the appropriate qemu and qemu-img
>>> commands on
>>> @@ -143,8 +81,6 @@ class KvmNotInstalled(KvmInstallException):
>>>
>>>
>>> class BaseInstaller(object):
>>> - # default value for load_stock argument
>>> - load_stock_modules = True
>>> def __init__(self, mode=None):
>>> self.install_mode = mode
>>> self._full_module_list = None
>>> @@ -254,7 +190,9 @@ class BaseInstaller(object):
>>>
>>> May be overridden by subclasses.
>>> """
>>> - _load_kvm_modules(mod_list,
>>> load_stock=self.load_stock_modules)
>>> + logging.info("Loading KVM modules")
>>> + for module in mod_list:
>>> + utils.system("modprobe %s" % module)
>> Why not use the function utils.load_module() to load the modules?
>
> Well, there might be a historic reason for that.
>
> Based on another comment, in another piece of code
> (client/tests/kvm/tests/module_probe.py), I believe the reason is that
> utils.load_module() does "too much": checks if the module is loaded by
> running lsmod, etc.
>
Actually the comment is about utils.unload_module(), but still is the
only hint that I can find.
> As this discussion is not really the point of my proposed change, I
> chose to keep things as they were.
>
>>>
>>> def load_modules(self, mod_list=None):
>>> @@ -269,7 +207,9 @@ class BaseInstaller(object):
>>> """
>>> if mod_list is None:
>>> mod_list = self.full_module_list()
>>> - _unload_kvm_modules(mod_list)
>>> + logging.info("Unloading previously loaded KVM modules")
>>> + for module in reversed(mod_list):
>>> + utils.unload_module(module)
>>>
>>>
>>> def unload_modules(self, mod_list=None):
>>> @@ -297,7 +237,6 @@ class YumInstaller(BaseInstaller):
>>> """
>>> Class that uses yum to install and remove packages.
>>> """
>>> - load_stock_modules = True
>>> def set_install_params(self, test, params):
>>> super(YumInstaller, self).set_install_params(test, params)
>>> # Checking if all required dependencies are available
>>> @@ -357,7 +296,6 @@ class KojiInstaller(YumInstaller):
>>> It uses yum to install and remove packages. Packages are specified
>>> according to the syntax defined in the PkgSpec class.
>>> """
>>> - load_stock_modules = True
>>> def set_install_params(self, test, params):
>>> """
>>> Gets parameters and initializes the package downloader.
>>> @@ -450,8 +388,6 @@ class SourceDirInstaller(BaseInstaller):
>>> super(SourceDirInstaller, self).set_install_params(test,
>>> params)
>>>
>>> self.mod_install_dir = os.path.join(self.prefix, 'modules')
>>> - self.installed_kmods = False # it will be set to True in
>>> case we
>>> - # installed our own modules
>>>
>>> srcdir = params.get("srcdir", None)
>>> self.path_to_roms = params.get("path_to_rom_images", None)
>>> @@ -494,51 +430,11 @@ class SourceDirInstaller(BaseInstaller):
>>> utils.system(step)
>>>
>>>
>>> - def _install_kmods_old_userspace(self, userspace_path):
>>> - """
>>> - Run the module install command.
>>> -
>>> - This is for the "old userspace" code, that contained a
>>> 'kernel' subdirectory
>>> - with the kmod build code.
>>> -
>>> - The code would be much simpler if we could specify the
>>> module install
>>> - path as parameter to the toplevel Makefile. As we can't do
>>> that and
>>> - the module install code doesn't use --prefix, we have to call
>>> - 'make -C kernel install' directly, setting the module
>>> directory
>>> - parameters.
>>> -
>>> - If the userspace tree doens't have a 'kernel' subdirectory,
>>> the
>>> - module install step will be skipped.
>>> -
>>> - @param userspace_path: the path the kvm-userspace directory
>>> - """
>>> - kdir = os.path.join(userspace_path, 'kernel')
>>> - if os.path.isdir(kdir):
>>> - os.chdir(kdir)
>>> - # INSTALLDIR is the target dir for the modules
>>> - # ORIGMODDIR is the dir where the old modules will be
>>> removed. we
>>> - # don't want to mess with the system
>>> modules, so set it
>>> - # to a non-existing directory
>>> - utils.system('make install INSTALLDIR=%s
>>> ORIGMODDIR=/tmp/no-old-modules' % (self.mod_install_dir))
>>> - self.installed_kmods = True
>>> -
>>> -
>>> - def _install_kmods(self, kmod_path):
>>> - """Run the module install command for the kmod-kvm repository
>>> -
>>> - @param kmod_path: the path to the kmod-kvm.git working copy
>>> - """
>>> - os.chdir(kmod_path)
>>> - utils.system('make modules_install DESTDIR=%s' %
>>> (self.mod_install_dir))
>>> - self.installed_kmods = True
>>> -
>>> -
>>> def _install(self):
>>> os.chdir(self.srcdir)
>>> logging.info("Installing KVM userspace")
>>> if self.repo_type == 1:
>>> utils.system("make -C qemu install")
>>> - self._install_kmods_old_userspace(self.srcdir)
>>> elif self.repo_type == 2:
>>> utils.system("make install")
>>> if self.path_to_roms:
>>> @@ -549,17 +445,6 @@ class SourceDirInstaller(BaseInstaller):
>>> unittest=self.unittest_prefix)
>>>
>>>
>>> - def _load_modules(self, mod_list):
>>> - # load the installed KVM modules in case we installed them
>>> - # ourselves. Otherwise, just load the system modules.
>>> - if self.installed_kmods:
>>> - logging.info("Loading installed KVM modules")
>>> - _load_kvm_modules(mod_list,
>>> module_dir=self.mod_install_dir)
>>> - else:
>>> - logging.info("Loading stock KVM modules")
>>> - _load_kvm_modules(mod_list, load_stock=True)
>>> -
>>> -
>>> def install(self):
>>> self._build()
>>> self._install()
>>> @@ -611,19 +496,6 @@ class GitInstaller(SourceDirInstaller):
>>> cfg =
>>> 'PKG_CONFIG_PATH="%s/lib/pkgconfig:%s/share/pkgconfig" ./configure' % (
>>> self.prefix, self.prefix)
>>>
>>> - self.kernel = GitRepo(installer=self, prefix='kernel',
>>> - repo_param='git_repo', srcdir='kvm')
>>> - self.kmod = GitRepo(installer=self, prefix='kmod',
>>> srcdir="kvm_kmod")
>>> - if params.get('kernel_git_repo'):
>>> - cfg += ' --kerneldir=%s' % self.host_kernel_srcdir
>>> - self.kernel.build_steps = [cfg,
>>> - 'make clean',
>>> - 'make -C kernel LINUX=%s sync' %
>>> self.kernel.srcdir]
>>> - self.kmod.build_steps=[cfg,
>>> - 'make clean',
>>> - 'make sync LINUX=%s' %
>>> self.kernel.srcdir,
>>> - 'make']
>>> -
>>> self.spice_protocol = GitRepo(installer=self,
>>> prefix='spice_protocol',
>>> srcdir='spice-protocol',
>>> build_steps= ['./autogen.sh',
>>> @@ -657,19 +529,12 @@ class GitInstaller(SourceDirInstaller):
>>> logging.error(message)
>>> raise error.TestError(message)
>>>
>>> - for repo in [self.userspace, self.kernel, self.kmod,
>>> self.spice_protocol, self.spice]:
>>> + for repo in [self.userspace, self.spice_protocol, self.spice]:
>>> if not repo.repo:
>>> continue
>>> repo.fetch_and_patch()
>>>
>>> def _build(self):
>>> - if self.kmod.repo:
>>> - logging.info('Building KVM modules')
>>> - self.kmod.build()
>>> - elif self.kernel.repo:
>>> - logging.info('Building KVM modules')
>>> - self.kernel.build()
>>> -
>>> if self.spice_protocol.repo:
>>> logging.info('Building Spice-protocol')
>>> self.spice_protocol.build()
>>> @@ -683,25 +548,8 @@ class GitInstaller(SourceDirInstaller):
>>>
>>>
>>> def _install(self):
>>> - if self.kernel:
>>> - os.chdir(self.userspace.srcdir)
>>> - # the kernel module install with --prefix doesn't work,
>>> and DESTDIR
>>> - # wouldn't work for the userspace stuff, so we clear
>>> WANT_MODULE:
>>> - utils.system('make install WANT_MODULE=')
>>> - # and install the old-style-kmod modules manually:
>>> - self._install_kmods_old_userspace(self.userspace.srcdir)
>>> - elif self.kmod:
>>> - # if we have a kmod repository, it is easier:
>>> - # 1) install userspace:
>>> - os.chdir(self.userspace_srcdir)
>>> - utils.system('make install')
>>> - # 2) install kmod:
>>> - self._install_kmods(self.kmod_srcdir)
>>> - else:
>>> - # if we don't have kmod sources, we just install
>>> - # userspace:
>>> - os.chdir(self.userspace.srcdir)
>>> - utils.system('make install')
>>> + os.chdir(self.userspace.srcdir)
>>> + utils.system('make install')
>>>
>>> if self.path_to_roms:
>>> install_roms(self.path_to_roms, self.prefix)
>>> @@ -721,8 +569,6 @@ class GitInstaller(SourceDirInstaller):
>>>
>>>
>>> class PreInstalledKvm(BaseInstaller):
>>> - # load_modules() will use the stock modules:
>>> - load_stock_modules = True
>>> def install(self):
>>> logging.info("Expecting KVM to be already installed. Doing
>>> nothing")
>>>
>>> --
>>> 1.7.4.4
>>>
>>> _______________________________________________
>>> Autotest mailing list
>>> [email protected]
>>> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>>>
>
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest