mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Herbert Xu <herbert@gondor.apana.org.au>
To: Pavel Machek <pavel@suse.cz>
Cc: mochel@digitalimplant.org, linux-kernel@vger.kernel.org, akpm@zip.com.au
Subject: Re: Fix memory leak in swsusp
Date: Fri, 11 Jun 2004 21:03:14 +1000	[thread overview]
Message-ID: <20040611110314.GA8592@gondor.apana.org.au> (raw)
In-Reply-To: <20040611102327.GF13834@elf.ucw.cz>

[-- Attachment #1: Type: text/plain, Size: 497 bytes --]

On Fri, Jun 11, 2004 at 12:23:27PM +0200, Pavel Machek wrote:
> 
> If you want more cleanups, copy_pagedir() should be probably replaced
> by simple memset...

Yes that's a great idea.  Here is the patch to do that.  Again it
relies on all the previous patches in this thread.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email:  Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

[-- Attachment #2: p --]
[-- Type: text/plain, Size: 2609 bytes --]

===== kernel/power/pmdisk.c 1.86 vs edited =====
--- 1.86/kernel/power/pmdisk.c	2004-06-11 18:23:44 +10:00
+++ edited/kernel/power/pmdisk.c	2004-06-11 21:01:41 +10:00
@@ -732,19 +732,6 @@
 
 /* More restore stuff */
 
-/* FIXME: Why not memcpy(to, from, 1<<pagedir_order*PAGE_SIZE)? */
-static void __init copy_pagedir(suspend_pagedir_t *to, suspend_pagedir_t *from)
-{
-	int i;
-	char *topointer=(char *)to, *frompointer=(char *)from;
-
-	for(i=0; i < 1 << pagedir_order; i++) {
-		copy_page(topointer, frompointer);
-		topointer += PAGE_SIZE;
-		frompointer += PAGE_SIZE;
-	}
-}
-
 #define does_collide(addr) does_collide_order(pm_pagedir_nosave, addr, 0)
 
 /*
@@ -792,7 +779,7 @@
 	 * We have to avoid recursion (not to overflow kernel stack),
 	 * and that's why code looks pretty cryptic 
 	 */
-	suspend_pagedir_t *new_pagedir, *old_pagedir = pm_pagedir_nosave;
+	suspend_pagedir_t *old_pagedir = pm_pagedir_nosave;
 	void **eaten_memory = NULL;
 	void **c = eaten_memory, *m, *f;
 	int err;
@@ -808,8 +795,9 @@
 	while ((m = (void *) __get_free_pages(GFP_ATOMIC, pagedir_order))) {
 		if (!does_collide_order(old_pagedir, (unsigned long)m,
 					pagedir_order)) {
-			pm_pagedir_nosave = new_pagedir = m;
-			copy_pagedir(new_pagedir, old_pagedir);
+			pm_pagedir_nosave =
+				memcpy(m, old_pagedir,
+				       PAGE_SIZE << pagedir_order);
 			err = 0;
 			break;
 		}
--- linux-2.5/kernel/power/swsusp.c.orig	2004-06-11 20:54:24.000000000 +1000
+++ linux-2.5/kernel/power/swsusp.c	2004-06-11 21:02:22.000000000 +1000
@@ -863,19 +863,6 @@
 
 /* More restore stuff */
 
-/* FIXME: Why not memcpy(to, from, 1<<pagedir_order*PAGE_SIZE)? */
-static void copy_pagedir(suspend_pagedir_t *to, suspend_pagedir_t *from)
-{
-	int i;
-	char *topointer=(char *)to, *frompointer=(char *)from;
-
-	for(i=0; i < 1 << pagedir_order; i++) {
-		copy_page(topointer, frompointer);
-		topointer += PAGE_SIZE;
-		frompointer += PAGE_SIZE;
-	}
-}
-
 #define does_collide(addr) does_collide_order(pagedir_nosave, addr, 0)
 
 /*
@@ -923,7 +910,7 @@
 	 * We have to avoid recursion (not to overflow kernel stack),
 	 * and that's why code looks pretty cryptic 
 	 */
-	suspend_pagedir_t *new_pagedir, *old_pagedir = pagedir_nosave;
+	suspend_pagedir_t *old_pagedir = pagedir_nosave;
 	void **eaten_memory = NULL;
 	void **c = eaten_memory, *m, *f;
 	int ret = 0;
@@ -948,8 +935,8 @@
 		printk("out of memory\n");
 		ret = -ENOMEM;
 	} else {
-		pagedir_nosave = new_pagedir = m;
-		copy_pagedir(new_pagedir, old_pagedir);
+		pagedir_nosave =
+			memcpy(m, old_pagedir, PAGE_SIZE << pagedir_order);
 	}
 
 	c = eaten_memory;

  reply	other threads:[~2004-06-11 11:03 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-09 13:04 Pavel Machek
2004-06-10 10:50 ` Herbert Xu
2004-06-10 10:56   ` Herbert Xu
2004-06-10 20:08     ` Pavel Machek
2004-06-10 21:24     ` Pavel Machek
2004-06-10 23:37       ` Herbert Xu
2004-06-11  9:48         ` Pavel Machek
2004-06-11 10:16           ` Herbert Xu
2004-06-11 10:23             ` Pavel Machek
2004-06-11 11:03               ` Herbert Xu [this message]
2004-06-12  3:17                 ` Nigel Cunningham
2004-06-12  4:00                   ` Andrew Morton
2004-06-12 11:10                     ` Dave Jones
2004-06-13 15:59                       ` Pavel Machek
2004-06-12 22:07                     ` Nigel Cunningham
2004-06-12 23:32                       ` Jeff Sipek
2004-06-13 15:57                         ` Pavel Machek
2004-06-13  8:15                       ` Herbert Xu
2004-06-12  6:45                   ` Herbert Xu
2004-06-12 10:45 pavel
2004-06-12 22:09 ` Nigel Cunningham

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040611110314.GA8592@gondor.apana.org.au \
    --to=herbert@gondor.apana.org.au \
    --cc=akpm@zip.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mochel@digitalimplant.org \
    --cc=pavel@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®