lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 19 Jan 2007 13:38:47 +0530
From:	"Seshadri, Harinarayanan" <harinarayanan.seshadri@...el.com>
To:	<inux-pm@...ts.osdl.org>
Cc:	<linux-acpi@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
	"Seshadri, Harinarayanan" <harinarayanan.seshadri@...el.com>
Subject: [RFC] [PATCH] Power S3 Resume Optimization Patch. Request for Comment

[RFC][PATCH] Power S3 Resume optimisation 
	Here is a simple patch for optimising the S3 resume. With this
patch the resume time is 0.85. Given the fact that device initialisation
on the resume takes almost 70% of time, By executing the whole
"device_resume()" function on a seperate kernel thread, the resume gets
completed( ie. the user can precieve) by ~0.85 sec.
	To avoid any possible race condition while processing the IO
request and to make sure all the io request are queued till the device
resume thread exits, the IO schedulars (patched cfq and as) checks a for
system_resume flag, which is set when the device resume thread starts,
if the flag is set, it doesnt put the request in the dispatch queue.
Once the flag is cleared i.e when the device resume thread is complete,
the IO-schedular behave as in normal situation.
 I did some validation of this patch on a  NAPA board ( Calistoga
chipset with Dothan Processor with and Without SMP)locally here and
havent noticed any issue so far.  Please review and let me know what
your comments. This patch is against 2.6.18 kernel
thanks
-hari
signed-off-by: hari < harinarayanan.seshadri@...el.com>
-----------------------------------
diff -ruN ../test/linux-vanilla/block/as-iosched.c
linux-2.6.18/block/as-iosched.c---
../test/linux-vanilla/block/as-iosched.c    2007-01-10
13:51:33.000000000 +0530
+++ linux-2.6.18/block/as-iosched.c     2007-01-18 13:37:01.000000000
+0530
@@ -1088,6 +1088,19 @@
        if (list_empty(&ad->fifo_list[adir]))
                return 0;

+       /*
+        * Check here for the System resume flag to be cleared, if flag
is
+       *  still set the resume thread hasnt completed yet, and hence
dont
+       *  takeout any new request from the FIFO
+       */
+       extern int system_resuming;
+       if (system_resuming != 0)
+       {
+#ifdef DEBUG
+               printk("  system resuming still \n");
+#endif
+               return 0;
+       }
        arq = list_entry_fifo(ad->fifo_list[adir].next);

        return time_after(jiffies, arq->expires);
diff -ruN ../test/linux-vanilla/block/cfq-iosched.c
linux-2.6.18/block/cfq-iosched.c
--- ../test/linux-vanilla/block/cfq-iosched.c   2007-01-11
07:59:33.000000000 +0530
+++ linux-2.6.18/block/cfq-iosched.c    2007-01-18 13:35:02.000000000
+0530
@@ -1156,6 +1156,19 @@
        if (!cfqd->busy_queues)
                return 0;

+       /*
+        * Check here for the System resume flag to be cleared, if flag
is s
+       *  still set the resume thread hasnt completed yet, and hence
dont
+       *  move any request from the read/write to dispatch queue
+       */
+       extern int system_resuming;
+       if (system_resuming != 0)
+       {
+#ifdef DEBUG
+               printk("System resuming still \n");
+#endif
+               return 0;
+       }
        if (unlikely(force))
                return cfq_forced_dispatch(cfqd);

diff -ruN ../test/linux-vanilla/kernel/power/main.c
linux-2.6.18/kernel/power/main.c
--- ../test/linux-vanilla/kernel/power/main.c   2007-01-11
08:00:11.000000000 +0530
+++ linux-2.6.18/kernel/power/main.c    2007-01-18 13:31:56.000000000
+0530
@@ -19,6 +19,7 @@

 #include "power.h"

+int system_resuming;
 /*This is just an arbitrary number */
 #define FREE_PAGE_NUMBER (100)

@@ -131,9 +132,29 @@
  *     console that we've allocated. This is not called for
suspend-to-disk.
  */

-static void suspend_finish(suspend_state_t state)
+static int dev_resume_proc(void * data)
{
+       /* Set the global resume flag, this will be checked by the
IO_schedular
+       * before dispatching the IO request
+       */
+       system_resuming =1;
        device_resume();
+       system_resuming = 0;
+#ifdef DEBUG
+       printk(" reseting system_resume \n");
+#endif
+       return (0);
+}
+static void suspend_finish(suspend_state_t state)
+{
+       int thread;
+       system_resuming = 0;
+       thread = kernel_thread(dev_resume_proc,NULL,CLONE_KERNEL);
+       if (thread < 0)
+       {
+               printk ("Suspend resume Cannot create Kernel_thread\n");
+               device_resume();
+       }
        resume_console();
        thaw_processes();
        enable_nonboot_cpus();
--------------------------------------

Download attachment "s3.patch.new" of type "application/octet-stream" (2618 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ