[arch-commits] Commit in linux-lts/trunk (4 files)

Tobias Powalowski tpowa at archlinux.org
Mon Oct 22 12:36:16 UTC 2012


    Date: Monday, October 22, 2012 @ 08:36:15
  Author: tpowa
Revision: 169495

upgpkg: linux-lts 3.0.47-1

bump to 3.0.47, added module initialisation patches

Added:
  linux-lts/trunk/module-init-wait-3.0.patch
  linux-lts/trunk/module-symbol-waiting-3.0.patch
Modified:
  linux-lts/trunk/PKGBUILD
  linux-lts/trunk/linux-lts.install

---------------------------------+
 PKGBUILD                        |   19 ++++++---
 linux-lts.install               |    2 
 module-init-wait-3.0.patch      |   77 ++++++++++++++++++++++++++++++++++++++
 module-symbol-waiting-3.0.patch |   66 ++++++++++++++++++++++++++++++++
 4 files changed, 158 insertions(+), 6 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-10-22 12:27:52 UTC (rev 169494)
+++ PKGBUILD	2012-10-22 12:36:15 UTC (rev 169495)
@@ -5,7 +5,7 @@
 pkgbase=linux-lts           # Build stock -lts kernel
 #pkgbase=linux-custom       # Build kernel with a different name
 _srcname=linux-3.0
-pkgver=3.0.46
+pkgver=3.0.47
 pkgrel=1
 arch=('i686' 'x86_64')
 url="http://www.kernel.org/"
@@ -20,15 +20,19 @@
         'linux-lts.preset'
         'change-default-console-loglevel.patch'
         'i915-fix-ghost-tv-output.patch'
-        'ext4-options.patch')
+        'ext4-options.patch'
+        'module-symbol-waiting-3.0.patch'
+        'module-init-wait-3.0.patch')
 md5sums=('ecf932280e2441bdd992423ef3d55f8f'
-         '8dffb7415b134a5628c4cdbe9b8a3834'
+         'c198c3b3e5ffa605c3148855403a67e7'
          'edc668eef98c6795fbdbc7efd755d9bb'
          '6ec56de185c2a3a24e234ddc0915049a'
          '232b52576a62c7a333e9fe7a1e1ca359'
          '9d3c56a4b999c8bfbd4018089a62f662'
          '263725f20c0b9eb9c353040792d644e5'
-         'c8299cf750a84e12d60b372c8ca7e1e8')
+         'c8299cf750a84e12d60b372c8ca7e1e8'
+         '670931649c60fcb3ef2e0119ed532bd4'
+         '8a71abc4224f575008f974a099b5cf6f')
 
 _kernelname=${pkgbase#linux}
 
@@ -59,6 +63,11 @@
   # https://bugs.archlinux.org/task/28653
   patch -Np1 -i "${srcdir}/ext4-options.patch"
 
+  # fix module initialisation
+  # https://bugs.archlinux.org/task/32122
+  patch -Np1 -i "${srcdir}/module-symbol-waiting-3.0.patch"
+  patch -Np1 -i "${srcdir}/module-init-wait-3.0.patch"
+
   if [ "${CARCH}" = "x86_64" ]; then
     cat "${srcdir}/config.x86_64" > ./.config
   else
@@ -305,4 +314,4 @@
   }"
 done
 
-# vim:set ts=8 sts=2 sw=2 et:
+# vim:set ts=8 sts=2 sw=2 et:
\ No newline at end of file

Modified: linux-lts.install
===================================================================
--- linux-lts.install	2012-10-22 12:27:52 UTC (rev 169494)
+++ linux-lts.install	2012-10-22 12:36:15 UTC (rev 169495)
@@ -2,7 +2,7 @@
 # arg 2:  the old package version
 
 KERNEL_NAME=-lts
-KERNEL_VERSION=3.0.46-1-lts
+KERNEL_VERSION=3.0.47-1-lts
 
 # set a sane PATH to ensure that critical utils like depmod will be found
 export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

Added: module-init-wait-3.0.patch
===================================================================
--- module-init-wait-3.0.patch	                        (rev 0)
+++ module-init-wait-3.0.patch	2012-10-22 12:36:15 UTC (rev 169495)
@@ -0,0 +1,77 @@
+From: Rusty Russell <rusty at rustcorp.com.au>
+Date: Fri, 28 Sep 2012 05:01:03 +0000 (+0930)
+Subject: module: wait when loading a module which is currently initializing.
+X-Git-Tag: v3.7-rc1~2^2~32
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=9bb9c3be568346538
+
+module: wait when loading a module which is currently initializing.
+
+The original module-init-tools module loader used a fnctl lock on the
+.ko file to avoid attempts to simultaneously load a module.
+Unfortunately, you can't get an exclusive fcntl lock on a read-only
+fd, making this not work for read-only mounted filesystems.
+module-init-tools has a hacky sleep-and-loop for this now.
+
+It's not that hard to wait in the kernel, and only return -EEXIST once
+the first module has finished loading (or continue loading the module
+if the first one failed to initialize for some reason).  It's also
+consistent with what we do for dependent modules which are still loading.
+
+Suggested-by: Lucas De Marchi <lucas.demarchi at profusion.mobi>
+Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
+---
+
+diff --git a/kernel/module.c b/kernel/module.c
+index 63cf6e7..74bc195 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2845,6 +2845,20 @@ static int post_relocation(struct module *mod, const struct load_info *info)
+ 	return module_finalize(info->hdr, info->sechdrs, mod);
+ }
+ 
++/* Is this module of this name done loading?  No locks held. */
++static bool finished_loading(const char *name)
++{
++	struct module *mod;
++	bool ret;
++
++	mutex_lock(&module_mutex);
++	mod = find_module(name);
++	ret = !mod || mod->state != MODULE_STATE_COMING;
++	mutex_unlock(&module_mutex);
++
++	return ret;
++}
++
+ /* Allocate and load the module: note that size of section 0 is always
+    zero, and we rely on this for optional sections. */
+ static struct module *load_module(void __user *umod,
+@@ -2852,7 +2866,7 @@ static struct module *load_module(void __user *umod,
+ 				  const char __user *uargs)
+ {
+ 	struct load_info info = { NULL, };
+-	struct module *mod;
++	struct module *mod, *old;
+ 	long err;
+ 
+ 	pr_debug("load_module: umod=%p, len=%lu, uargs=%p\n",
+@@ -2918,8 +2932,18 @@ static struct module *load_module(void __user *umod,
+ 	 * function to insert in a way safe to concurrent readers.
+ 	 * The mutex protects against concurrent writers.
+ 	 */
++again:
+ 	mutex_lock(&module_mutex);
+-	if (find_module(mod->name)) {
++	if ((old = find_module(mod->name)) != NULL) {
++		if (old->state == MODULE_STATE_COMING) {
++			/* Wait in case it fails to load. */
++			mutex_unlock(&module_mutex);
++			err = wait_event_interruptible(module_wq,
++					       finished_loading(mod->name));
++			if (err)
++				goto free_arch_cleanup;
++			goto again;
++		}
+ 		err = -EEXIST;
+ 		goto unlock;
+ 	}

Added: module-symbol-waiting-3.0.patch
===================================================================
--- module-symbol-waiting-3.0.patch	                        (rev 0)
+++ module-symbol-waiting-3.0.patch	2012-10-22 12:36:15 UTC (rev 169495)
@@ -0,0 +1,66 @@
+From: Rusty Russell <rusty at rustcorp.com.au>
+Date: Fri, 28 Sep 2012 05:01:03 +0000 (+0930)
+Subject: module: fix symbol waiting when module fails before init
+X-Git-Tag: v3.7-rc1~2^2~33
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=6f13909f4fe9652f1
+
+module: fix symbol waiting when module fails before init
+
+We use resolve_symbol_wait(), which blocks if the module containing
+the symbol is still loading.  However:
+
+1) The module_wq we use is only woken after calling the modules' init
+   function, but there are other failure paths after the module is
+   placed in the linked list where we need to do the same thing.
+
+2) wake_up() only wakes one waiter, and our waitqueue is shared by all
+   modules, so we need to wake them all.
+
+3) wake_up_all() doesn't imply a memory barrier: I feel happier calling
+   it after we've grabbed and dropped the module_mutex, not just after
+   the state assignment.
+
+Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
+---
+
+diff --git a/kernel/module.c b/kernel/module.c
+index 7f2ee45f..63cf6e7 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2959,7 +2959,7 @@ static struct module *load_module(void __user *umod,
+ 	/* Unlink carefully: kallsyms could be walking list. */
+ 	list_del_rcu(&mod->list);
+ 	module_bug_cleanup(mod);
+-
++	wake_up_all(&module_wq);
+  ddebug:
+ 	dynamic_debug_remove(info.debug);
+  unlock:
+@@ -3034,7 +3034,7 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
+ 		blocking_notifier_call_chain(&module_notify_list,
+ 					     MODULE_STATE_GOING, mod);
+ 		free_module(mod);
+-		wake_up(&module_wq);
++		wake_up_all(&module_wq);
+ 		return ret;
+ 	}
+ 	if (ret > 0) {
+@@ -3046,9 +3046,8 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
+ 		dump_stack();
+ 	}
+ 
+-	/* Now it's a first class citizen!  Wake up anyone waiting for it. */
++	/* Now it's a first class citizen! */
+ 	mod->state = MODULE_STATE_LIVE;
+-	wake_up(&module_wq);
+ 	blocking_notifier_call_chain(&module_notify_list,
+ 				     MODULE_STATE_LIVE, mod);
+ 
+@@ -3071,6 +3070,7 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
+ 	mod->init_ro_size = 0;
+ 	mod->init_text_size = 0;
+ 	mutex_unlock(&module_mutex);
++	wake_up_all(&module_wq);
+ 
+ 	return 0;
+ }




More information about the arch-commits mailing list