Hi Andy,
This patch is for s4bios support in 2.5.59 with acpi-20030123.
This is the 'minimal' requirement. Some devices (especially the
IDE part) are not well resumed. Handle with care..
Note also that the resuming part (I mean IDE) was more stable
with an equivalent patch when I tested with 2.5.54 (grumble grumble)...
I think also that it is a 'good' checker for devices power management
in general...
arch/i386/kernel/acpi_wakeup.S | 35 ++++++++++++++++++++++++++-----
drivers/acpi/acpi_ksyms.c | 1
drivers/acpi/hardware/hwsleep.c | 45 ++++++++++++++++++++++++++++++++++++++++
drivers/acpi/sleep.c | 39 ++++++++++++++++++++++++++++++----
include/acpi/acpixf.h | 4 +++
include/linux/suspend.h | 1
6 files changed, 115 insertions(+), 10 deletions(-)
--- linux-2.5.59-acpi-20030123/arch/i386/kernel/acpi_wakeup.S 2003/01/31 15:37:05 1.1
+++ linux-2.5.59-acpi-20030123/arch/i386/kernel/acpi_wakeup.S 2003/01/31 16:33:25
@@ -160,9 +160,9 @@
ALIGN
-.org 0x2000
+.org 0x800
wakeup_stack:
-.org 0x3000
+.org 0x900
ENTRY(wakeup_end)
.org 0x4000
@@ -274,7 +274,7 @@
ENTRY(do_suspend_lowlevel)
cmpl $0,4(%esp)
- jne .L1432
+ jne ret_point
call save_processor_state
movl %esp, saved_context_esp
@@ -287,7 +287,7 @@
movl %edi, saved_context_edi
pushfl ; popl saved_context_eflags
- movl $.L1432,saved_eip
+ movl $ret_point,saved_eip
movl %esp,saved_esp
movl %ebp,saved_ebp
movl %ebx,saved_ebx
@@ -299,7 +299,7 @@
addl $4,%esp
ret
.p2align 4,,7
-.L1432:
+ret_point:
movl $__KERNEL_DS,%eax
movw %ax, %ds
movl saved_context_esp, %esp
@@ -312,6 +312,31 @@
movl saved_context_edi, %edi
call restore_processor_state
pushl saved_context_eflags ; popfl
+ ret
+
+ENTRY(do_suspend_lowlevel_s4bios)
+ cmpl $0,4(%esp)
+ jne ret_point
+ call save_processor_state
+
+ movl %esp, saved_context_esp
+ movl %eax, saved_context_eax
+ movl %ebx, saved_context_ebx
+ movl %ecx, saved_context_ecx
+ movl %edx, saved_context_edx
+ movl %ebp, saved_context_ebp
+ movl %esi, saved_context_esi
+ movl %edi, saved_context_edi
+ pushfl ; popl saved_context_eflags
+
+ movl $ret_point,saved_eip
+ movl %esp,saved_esp
+ movl %ebp,saved_ebp
+ movl %ebx,saved_ebx
+ movl %edi,saved_edi
+ movl %esi,saved_esi
+
+ call acpi_enter_sleep_state_s4bios
ret
ALIGN
--- linux-2.5.59-acpi-20030123/drivers/acpi/hardware/hwsleep.c 2003/01/31 15:37:10 1.1
+++ linux-2.5.59-acpi-20030123/drivers/acpi/hardware/hwsleep.c 2003/01/31 16:37:27
@@ -316,6 +316,51 @@
return_ACPI_STATUS (AE_OK);
}
+
+/******************************************************************************
+ *
+ * FUNCTION: acpi_enter_sleep_state_s4bios
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform a s4 bios request.
+ * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_enter_sleep_state_s4bios (
+ void)
+{
+ u32 in_value;
+ acpi_status status;
+
+
+ ACPI_FUNCTION_TRACE ("Acpi_enter_sleep_state_s4bios");
+
+ acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_LOCK);
+ acpi_hw_clear_acpi_status();
+
+ acpi_hw_disable_non_wakeup_gpes();
+
+ ACPI_FLUSH_CPU_CACHE();
+
+ status = acpi_os_write_port (acpi_gbl_FADT->smi_cmd, (acpi_integer) acpi_gbl_FADT->S4bios_req, 8);
+
+ do {
+ acpi_os_stall(1000);
+ status = acpi_get_register (ACPI_BITREG_WAKE_STATUS, &in_value, ACPI_MTX_LOCK);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
+ } while (!in_value);
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+
/******************************************************************************
*
* FUNCTION: acpi_leave_sleep_state
--- linux-2.5.59-acpi-20030123/drivers/acpi/sleep.c 2003/01/31 15:37:19 1.1
+++ linux-2.5.59-acpi-20030123/drivers/acpi/sleep.c 2003/01/31 16:29:13
@@ -150,8 +150,10 @@
if (state > ACPI_STATE_S1) {
error = acpi_save_state_mem();
+#if 0
if (!error && (state == ACPI_STATE_S4))
error = acpi_save_state_disk();
+#endif
if (error) {
device_resume(RESUME_RESTORE_STATE);
@@ -223,11 +225,17 @@
status = acpi_enter_sleep_state(state);
break;
- case ACPI_STATE_S2:
#ifdef CONFIG_SOFTWARE_SUSPEND
+ case ACPI_STATE_S2:
case ACPI_STATE_S3:
do_suspend_lowlevel(0);
+ break;
#endif
+ case ACPI_STATE_S4:
+ do_suspend_lowlevel_s4bios(0);
+ break;
+ default:
+ printk(KERN_WARNING PREFIX "don't know how to handle %d state.\n", state);
break;
}
local_irq_restore(flags);
@@ -251,10 +259,20 @@
if (state < ACPI_STATE_S1 || state > ACPI_STATE_S5)
return AE_ERROR;
+ /* Since we handle S4OS via a different path (swsusp), give up if no s4bios. */
+ if (state == ACPI_STATE_S4 && !acpi_gbl_FACS->S4bios_f)
+ return AE_ERROR;
+
+ /*
+ * TBD: S1 can be done without device_suspend. Make a CONFIG_XX
+ * to handle however when S1 failed without device_suspend.
+ */
freeze_processes(); /* device_suspend needs processes to be stopped */
/* do we have a wakeup address for S2 and S3? */
- if (state == ACPI_STATE_S2 || state == ACPI_STATE_S3) {
+ /* Here, we support only S4BIOS, those we set the wakeup address */
+ /* S4OS is only supported for now via swsusp.. */
+ if (state == ACPI_STATE_S2 || state == ACPI_STATE_S3 || ACPI_STATE_S4) {
if (!acpi_wakeup_address)
return AE_ERROR;
acpi_set_firmware_waking_vector((acpi_physical_address) acpi_wakeup_address);
@@ -297,8 +315,11 @@
ACPI_FUNCTION_TRACE("acpi_system_sleep_seq_show");
for (i = 0; i <= ACPI_STATE_S5; i++) {
- if (sleep_states[i])
+ if (sleep_states[i]) {
seq_printf(seq,"S%d ", i);
+ if (i == ACPI_STATE_S4 && acpi_gbl_FACS->S4bios_f)
+ seq_printf(seq, "S4bios ");
+ }
}
seq_puts(seq, "\n");
@@ -337,12 +358,16 @@
if (!sleep_states[state])
return_VALUE(-ENODEV);
+ if (state == 4 && state_string[1] != 'b') {
#ifdef CONFIG_SOFTWARE_SUSPEND
- if (state == 4) {
software_suspend();
return_VALUE(count);
- }
+#else
+ printk(KERN_WARNING PREFIX "no swsusp support!?\n");
+ printk(KERN_WARNING PREFIX "Trying S4bios instead\n");
#endif
+ }
+
status = acpi_suspend(state);
if (ACPI_FAILURE(status))
@@ -661,6 +686,10 @@
if (ACPI_SUCCESS(status)) {
sleep_states[i] = 1;
printk(" S%d", i);
+ }
+ if (i == ACPI_STATE_S4 && acpi_gbl_FACS->S4bios_f) {
+ sleep_states[i] = 1;
+ printk(" S4bios");
}
}
printk(")\n");
--- linux-2.5.59-acpi-20030123/drivers/acpi/acpi_ksyms.c 2003/01/31 15:37:21 1.1
+++ linux-2.5.59-acpi-20030123/drivers/acpi/acpi_ksyms.c 2003/01/31 16:29:39
@@ -86,6 +86,7 @@
EXPORT_SYMBOL(acpi_get_register);
EXPORT_SYMBOL(acpi_set_register);
EXPORT_SYMBOL(acpi_enter_sleep_state);
+EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios);
EXPORT_SYMBOL(acpi_get_system_info);
EXPORT_SYMBOL(acpi_get_devices);
--- linux-2.5.59-acpi-20030123/include/acpi/acpixf.h 2003/01/31 15:38:22 1.1
+++ linux-2.5.59-acpi-20030123/include/acpi/acpixf.h 2003/01/31 16:31:57
@@ -380,6 +380,10 @@
u8 sleep_state);
acpi_status
+acpi_enter_sleep_state_s4bios (
+ void);
+
+acpi_status
acpi_leave_sleep_state (
u8 sleep_state);
--- linux-2.5.59-acpi-20030123/include/linux/suspend.h 2003/01/31 15:37:22 1.1
+++ linux-2.5.59-acpi-20030123/include/linux/suspend.h 2003/01/31 16:30:28
@@ -73,6 +73,7 @@
/* Communication between acpi and arch/i386/suspend.c */
extern void do_suspend_lowlevel(int resume);
+extern void do_suspend_lowlevel_s4bios(int resume);
#else
static inline void software_suspend(void)
Cheers,
--
Ducrot Bruno
http://www.poupinou.org Page profaissionelle
http://toto.tu-me-saoules.com Haume page
> From: Ducrot Bruno [mailto:[email protected]]
> This patch is for s4bios support in 2.5.59 with acpi-20030123.
>
> This is the 'minimal' requirement. Some devices (especially the
> IDE part) are not well resumed. Handle with care..
>
> Note also that the resuming part (I mean IDE) was more stable
> with an equivalent patch when I tested with 2.5.54 (grumble
> grumble)...
>
> I think also that it is a 'good' checker for devices power management
> in general...
I'd really rather just have S4OS (aka swsusp) in 2.5 patches -- if the
OS can do S4 on its own, that is really preferable to S4bios.
Regards -- Andy
Hi!
> > This patch is for s4bios support in 2.5.59 with acpi-20030123.
> >
> > This is the 'minimal' requirement. Some devices (especially the
> > IDE part) are not well resumed. Handle with care..
> >
> > Note also that the resuming part (I mean IDE) was more stable
> > with an equivalent patch when I tested with 2.5.54 (grumble
> > grumble)...
> >
> > I think also that it is a 'good' checker for devices power management
> > in general...
>
> I'd really rather just have S4OS (aka swsusp) in 2.5 patches -- if the
> OS can do S4 on its own, that is really preferable to S4bios.
Well, we already have S4OS, and having S4OS does not mean we can't
have S4bios.
Some people apparently want slower suspend/resume but have all caches
intact when resumed. Thats not easy for swsusp but they can have that
with S4bios. And S4bios is usefull for testing device support; it
seems to behave slightly differently to S3 meaning better testing.
If you already have hibernation partition from factory, which you are
using anyway for w98, S4bios is easier to use and more foolproof
(i.e. you can't boot into wrong kernel which does not resume but does
fsck instead).
Pavel
--
Worst form of spam? Adding advertisment signatures ala sourceforge.net.
What goes next? Inserting advertisment *into* email?
On Tue, Feb 04, 2003 at 11:10:04PM +0100, Pavel Machek wrote:
> Hi!
>
> > > This patch is for s4bios support in 2.5.59 with acpi-20030123.
> > >
> > > This is the 'minimal' requirement. Some devices (especially the
> > > IDE part) are not well resumed. Handle with care..
> > >
> > > Note also that the resuming part (I mean IDE) was more stable
> > > with an equivalent patch when I tested with 2.5.54 (grumble
> > > grumble)...
> > >
> > > I think also that it is a 'good' checker for devices power management
> > > in general...
> >
> > I'd really rather just have S4OS (aka swsusp) in 2.5 patches -- if the
> > OS can do S4 on its own, that is really preferable to S4bios.
>
> Well, we already have S4OS, and having S4OS does not mean we can't
> have S4bios.
>
> Some people apparently want slower suspend/resume but have all caches
> intact when resumed. Thats not easy for swsusp but they can have that
> with S4bios. And S4bios is usefull for testing device support; it
> seems to behave slightly differently to S3 meaning better testing.
>
Yep, correct. The problem is that now I have more trouble with s4bios
in general with 2.5. That worked more reliability with 'older' 2.5 series.
Really don't know why.
Cheers,
--
Ducrot Bruno
-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
On Wed, 2003-02-05 at 11:10, Pavel Machek wrote:
> Some people apparently want slower suspend/resume but have all caches
> intact when resumed. Thats not easy for swsusp but they can have that
> with S4bios. And S4bios is usefull for testing device support; it
> seems to behave slightly differently to S3 meaning better testing.
Whether its slower depends on the hardware; on my 128MB Celeron 933
laptop (17MB/s HDD), I can write an image of about 120MB, reboot and get
back up and running in around a minute and a half. That's about the same
as far as I remember, but has (as you say) the advantage of not still
having to get things swapped back in.
>
> If you already have hibernation partition from factory, which you are
> using anyway for w98, S4bios is easier to use and more foolproof
> (i.e. you can't boot into wrong kernel which does not resume but does
> fsck instead).
It doesn't really matter what kernel is loaded when we start a resume
anyway, does it? Could they not be different versions because one is
going to replace the other anyway?
Regards,
Nigel
On Thu, Feb 06, 2003 at 09:41:44AM +1300, Nigel Cunningham wrote:
> On Wed, 2003-02-05 at 11:10, Pavel Machek wrote:
> > Some people apparently want slower suspend/resume but have all caches
> > intact when resumed. Thats not easy for swsusp but they can have that
> > with S4bios. And S4bios is usefull for testing device support; it
> > seems to behave slightly differently to S3 meaning better testing.
>
> Whether its slower depends on the hardware; on my 128MB Celeron 933
> laptop (17MB/s HDD), I can write an image of about 120MB, reboot and get
> back up and running in around a minute and a half. That's about the same
> as far as I remember, but has (as you say) the advantage of not still
> having to get things swapped back in.
The problem is the speed of the suspending process, not the whole suspend/resume
sequence, especially in case of emergency suspending due to thermal condition,
etc.
--
Ducrot Bruno
-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Hi!
> > Some people apparently want slower suspend/resume but have all caches
> > intact when resumed. Thats not easy for swsusp but they can have that
> > with S4bios. And S4bios is usefull for testing device support; it
> > seems to behave slightly differently to S3 meaning better testing.
>
> Whether its slower depends on the hardware; on my 128MB Celeron 933
> laptop (17MB/s HDD), I can write an image of about 120MB, reboot and get
> back up and running in around a minute and a half. That's about the same
> as far as I remember, but has (as you say) the advantage of not still
> having to get things swapped back in.
>
> > If you already have hibernation partition from factory, which you are
> > using anyway for w98, S4bios is easier to use and more foolproof
> > (i.e. you can't boot into wrong kernel which does not resume but does
> > fsck instead).
>
> It doesn't really matter what kernel is loaded when we start a resume
> anyway, does it? Could they not be different versions because one is
> going to replace the other anyway?
No, no. It has to be exactly the same kernel, otherwise you get a nice
crash (if you are lucky) and ugly data corruption (when you are not);
there's check to prevent that and panic, however.
That's why I call S4bios more foolproof.
Pavel
--
Casualities in World Trade Center: ~3k dead inside the building,
cryptography in U.S.A. and free speech in Czech Republic.
On Thu, 2003-02-06 at 23:16, Ducrot Bruno wrote:
> On Thu, Feb 06, 2003 at 09:41:44AM +1300, Nigel Cunningham wrote:
> > Whether its slower depends on the hardware; on my 128MB Celeron 933
> > laptop (17MB/s HDD), I can write an image of about 120MB, reboot and get
> > back up and running in around a minute and a half. That's about the same
> > as far as I remember, but has (as you say) the advantage of not still
> > having to get things swapped back in.
>
> The problem is the speed of the suspending process, not the whole suspend/resume
> sequence, especially in case of emergency suspending due to thermal condition,
> etc.
Sorry. Perhaps I should have been clearer. I haven't spent a lot of time
doing timings, but there doesn't seem to be any significant difference.
In both versions, the amount of time varies with the amount of memory in
use. When not much memory is in use, both are fast because there's not
much to do anyway. When lots of memory is in use, both are slower. The
old version is slower because it eats as much memory as it can, and this
can take significant amounts of time, then makes a copy of every page
remaining, before saving those pages to disk. The new version doesn't
usually eat any memory, and when it does, not much is eaten. It then
saves all the pages that aren't needed for the suspend process directly
to disk; always more than half, sometimes all but about a few thousand
pages. It then uses this memory for the copy & save of remaining pages.
Thus, in one version, the major portion of time is taken in eating
memory (and post resume, loading pages back in) whereas in the 'new'
version, the time taken is almost purely a function of IO speed.
If you like, I'll do some timings on my 320MB desktop machine and post
them later in the day.
Regards,
Nigel
On Fri, 2003-02-07 at 04:37, Pavel Machek wrote:
> No, no. It has to be exactly the same kernel, otherwise you get a nice
> crash (if you are lucky) and ugly data corruption (when you are not);
> there's check to prevent that and panic, however.
>
> That's why I call S4bios more foolproof.
Oh of course; I'm with you. If you're running a different kernel, you
must have had an entirely different context when you suspended. Humble
apologies; I was only thinking about whether the image would
successfully load, not the difference in contents.
Regards,
Nigel
On Fri, Feb 07, 2003 at 08:41:27AM +1300, Nigel Cunningham wrote:
> On Thu, 2003-02-06 at 23:16, Ducrot Bruno wrote:
> > On Thu, Feb 06, 2003 at 09:41:44AM +1300, Nigel Cunningham wrote:
> > > Whether its slower depends on the hardware; on my 128MB Celeron 933
> > > laptop (17MB/s HDD), I can write an image of about 120MB, reboot and get
> > > back up and running in around a minute and a half. That's about the same
> > > as far as I remember, but has (as you say) the advantage of not still
> > > having to get things swapped back in.
> >
> > The problem is the speed of the suspending process, not the whole suspend/resume
> > sequence, especially in case of emergency suspending due to thermal condition,
> > etc.
>
> Sorry. Perhaps I should have been clearer. I haven't spent a lot of time
> doing timings, but there doesn't seem to be any significant difference.
> In both versions, the amount of time varies with the amount of memory in
Ah ok. I understand now. S4bios is completely different from swsusp.
It's just as if we were comparing APM suspend-to-disk and swsusp (and no, S4bios
is *not* APM suspend-to-disk either).
--
Ducrot Bruno
-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
On Fri, 2003-02-07 at 10:05, Ducrot Bruno wrote:
> On Fri, Feb 07, 2003 at 08:41:27AM +1300, Nigel Cunningham wrote:
> > Sorry. Perhaps I should have been clearer. I haven't spent a lot of time
> > doing timings, but there doesn't seem to be any significant difference.
> > In both versions, the amount of time varies with the amount of memory in
>
> Ah ok. I understand now. S4bios is completely different from swsusp.
> It's just as if we were comparing APM suspend-to-disk and swsusp (and no, S4bios
> is *not* APM suspend-to-disk either).
FWIW, here are the results of some tests, timing
2.4.21-pre3+acpi20030125+swsusp-beta18:
Machine 1: Celeron 933 laptop 17MB/s disk throughput, 128MB RAM
Machine 2: Duron 700 desktop, 30MB/s disk throughput, 320MB RAM
Algorithm 1: Eat as much memory as possible, save remaining in one set
of pages
Algorithm 2: Save memory in two pages, only eating memory if necessary.
Same code base, just different parameters to /proc/sys/kernel/swsusp.
This means that the result for algorithm 1 are exactly the same as
Pavel's code, but should give some idea.
Columns:
(1) Machine
(2) Algorithm
(3) Initial # pages free
(4) Image size written to disk
(5) Approximate time taken (date command run on other computer at same
time as pressing enter to start command, then when computer restarts)
1 2 3 4 5
---------------------------------
1 1 25655/30592 1562 0:07
1 2 26246/30592 4302 0:05
1 1 1005/30592 5165 0:20
1 2 900/30592 30126 0:16
2 1 38604/79755 ? 0:49
2 2 39122/79755 30398 0:21
2 1 1113/79755 ? 0:50
2 2 1109/79755 82149 0:40
The question marks are because the desktop machine didn't successfully
resume using this algorithm, so stats weren't logged (probably driver
problems).
In each case, the new method is slightly faster than the old, so we don't seem to loose anything.
Particularly interesting to me was the fact that the gain was not as
high as we might expect when the memory was heavily used. I guess the
amount of I/O is getting to the point where benefits from not eating
pages are being erroded. It would be interesting to see if a machine
with more memory readed a point where it was faster to eat the memory
instead of write it.
Hope this is helpful.
Nigel
Hi!
> Machine 1: Celeron 933 laptop 17MB/s disk throughput, 128MB RAM
> Machine 2: Duron 700 desktop, 30MB/s disk throughput, 320MB RAM
>
> Algorithm 1: Eat as much memory as possible, save remaining in one set
> of pages
> Algorithm 2: Save memory in two pages, only eating memory if necessary.
>
> Same code base, just different parameters to /proc/sys/kernel/swsusp.
> This means that the result for algorithm 1 are exactly the same as
> Pavel's code, but should give some idea.
>
> Columns:
> (1) Machine
> (2) Algorithm
> (3) Initial # pages free
> (4) Image size written to disk
> (5) Approximate time taken (date command run on other computer at same
> time as pressing enter to start command, then when computer restarts)
>
> 1 2 3 4 5
> ---------------------------------
> 1 1 25655/30592 1562 0:07
> 1 2 26246/30592 4302 0:05
You can suspend and resume your notebook within 5 seconds? Wow!
> 1 1 1005/30592 5165 0:20
> 1 2 900/30592 30126 0:16
> 2 1 38604/79755 ? 0:49
> 2 2 39122/79755 30398 0:21
> 2 1 1113/79755 ? 0:50
> 2 2 1109/79755 82149 0:40
>
> The question marks are because the desktop machine didn't successfully
> resume using this algorithm, so stats weren't logged (probably driver
> problems).
>
> In each case, the new method is slightly faster than the old, so we don't seem to loose anything.
> Particularly interesting to me was the fact that the gain was not as
> high as we might expect when the memory was heavily used. I guess the
> amount of I/O is getting to the point where benefits from not eating
> pages are being erroded. It would be interesting to see if a machine
> with more memory readed a point where it was faster to eat the memory
> instead of write it.
Well, if all the memory is in disk-backed clean pages, it should be
faster to discard then write out...
Anyway... So your method is faster. Good. Now, how much more
complicated is it?
Pavel
--
Worst form of spam? Adding advertisment signatures ala sourceforge.net.
What goes next? Inserting advertisment *into* email?
Hi
On Sat, 2003-02-08 at 05:00, Pavel Machek wrote:
> > 1 2 3 4 5
> > --
> > 1 1 25655/30592 1562 0:07
> > 1 2 26246/30592 4302 0:05
>
> You can suspend and resume your notebook within 5 seconds? Wow!
As requested, these were just the times for suspending.
> Well, if all the memory is in disk-backed clean pages, it should be
> faster to discard then write out...
Yes, I would think so too. Perhaps the differences would probably
disappear if I made the algorithm more like your original (ie simplifed
eat_memory back to the original), but I do remember lots of disk
activity when using the original code as well - perhaps the cause might
be worth further investigation? (Not that I'm volunteering)
> Anyway... So your method is faster. Good. Now, how much more
> complicated is it?
As I've said above, I'm not sure it is right to say it is faster - I
didn't compare your current method with the new one, but rather mine
with parameters making the algorithm as close to yours as possible. My
point was more that if the new method is slower, its not significantly
slower.
Nevertheless, you do have a good point - it is more complicated. But I
think it's worth it and its not a lot more complicated. People who are
using the new method at the moment appreciate the changes. Don't think
for a moment that I don't value your work, Pavel. I couldn't have done
any of my additions without it and consider mine tweaking. This has
simply been a quest to get a more responsive system on resume.
Regards,
Nigel