Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 576087 Details for
Bug 785384
hibernate hangs since kernel version 3.2.2-1.fc16.i686
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Better watermark the number of pages used by hibernation I/O
hibernate-pages-watermark.patch (text/plain), 4.22 KB, created by
Bojan Smojver
on 2012-04-08 23:15:26 UTC
(
hide
)
Description:
Better watermark the number of pages used by hibernation I/O
Filename:
MIME Type:
Creator:
Bojan Smojver
Created:
2012-04-08 23:15:26 UTC
Size:
4.22 KB
patch
obsolete
> kernel/power/swap.c | 46 ++++++++++++++++++++++++++++++++-------------- > 1 files changed, 32 insertions(+), 14 deletions(-) > >diff --git a/kernel/power/swap.c b/kernel/power/swap.c >index 8742fd0..21314b4 100644 >--- a/kernel/power/swap.c >+++ b/kernel/power/swap.c >@@ -6,7 +6,7 @@ > * > * Copyright (C) 1998,2001-2005 Pavel Machek <pavel@ucw.cz> > * Copyright (C) 2006 Rafael J. Wysocki <rjw@sisk.pl> >- * Copyright (C) 2010 Bojan Smojver <bojan@rexursive.com> >+ * Copyright (C) 2010-2012 Bojan Smojver <bojan@rexursive.com> > * > * This file is released under the GPLv2. > * >@@ -51,6 +51,15 @@ > > #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) > >+/* >+ * Number of pages required to be kept free while writing the image. Always >+ * three quarters of all available pages before the writing starts. >+ */ >+static inline unsigned long reqd_free_pages(void) >+{ >+ return (nr_free_pages() / 4) * 3; >+} >+ > struct swap_map_page { > sector_t entries[MAP_PAGE_ENTRIES]; > sector_t next_swap; >@@ -72,7 +81,7 @@ struct swap_map_handle { > sector_t cur_swap; > sector_t first_sector; > unsigned int k; >- unsigned long nr_free_pages, written; >+ unsigned long reqd_free_pages; > u32 crc32; > }; > >@@ -265,14 +274,17 @@ static int write_page(void *buf, sector_t offset, struct bio **bio_chain) > return -ENOSPC; > > if (bio_chain) { >- src = (void *)__get_free_page(__GFP_WAIT | __GFP_HIGH); >+ src = (void *)__get_free_page(__GFP_WAIT | __GFP_NOWARN | >+ __GFP_NORETRY); > if (src) { > copy_page(src, buf); > } else { > ret = hib_wait_on_bio_chain(bio_chain); /* Free pages */ > if (ret) > return ret; >- src = (void *)__get_free_page(__GFP_WAIT | __GFP_HIGH); >+ src = (void *)__get_free_page(__GFP_WAIT | >+ __GFP_NOWARN | >+ __GFP_NORETRY); > if (src) { > copy_page(src, buf); > } else { >@@ -316,8 +328,7 @@ static int get_swap_writer(struct swap_map_handle *handle) > goto err_rel; > } > handle->k = 0; >- handle->nr_free_pages = nr_free_pages() >> 1; >- handle->written = 0; >+ handle->reqd_free_pages = reqd_free_pages(); > handle->first_sector = handle->cur_swap; > return 0; > err_rel: >@@ -352,11 +363,15 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf, > handle->cur_swap = offset; > handle->k = 0; > } >- if (bio_chain && ++handle->written > handle->nr_free_pages) { >+ if (bio_chain && nr_free_pages() <= handle->reqd_free_pages) { > error = hib_wait_on_bio_chain(bio_chain); > if (error) > goto out; >- handle->written = 0; >+ /* >+ * Recalculate the number of required free pages, to make sure >+ * we never take more than a quarter. >+ */ >+ handle->reqd_free_pages = reqd_free_pages(); > } > out: > return error; >@@ -404,7 +419,7 @@ static int swap_writer_finish(struct swap_map_handle *handle, > #define LZO_THREADS 3 > > /* Maximum number of pages for read buffering. */ >-#define LZO_READ_PAGES (MAP_PAGE_ENTRIES * 8) >+#define LZO_READ_PAGES 8192 > > > /** >@@ -615,10 +630,10 @@ static int save_image_lzo(struct swap_map_handle *handle, > } > > /* >- * Adjust number of free pages after all allocations have been done. >- * We don't want to run out of pages when writing. >+ * Adjust the number of required free pages after all allocations have >+ * been done. We don't want to run out of pages when writing. > */ >- handle->nr_free_pages = nr_free_pages() >> 1; >+ handle->reqd_free_pages = reqd_free_pages(); > > /* > * Start the CRC32 thread. >@@ -1129,14 +1144,17 @@ static int load_image_lzo(struct swap_map_handle *handle, > > /* > * Adjust number of pages for read buffering, in case we are short. >+ * Never take more than a quarter of all available pages. > */ >- read_pages = (nr_free_pages() - snapshot_get_image_size()) >> 1; >+ read_pages = (nr_free_pages() - snapshot_get_image_size()) / 4; > read_pages = clamp_val(read_pages, LZO_CMP_PAGES, LZO_READ_PAGES); > > for (i = 0; i < read_pages; i++) { > page[i] = (void *)__get_free_page(i < LZO_CMP_PAGES ? > __GFP_WAIT | __GFP_HIGH : >- __GFP_WAIT); >+ __GFP_WAIT | __GFP_NOWARN | >+ __GFP_NORETRY); >+ > if (!page[i]) { > if (i < LZO_CMP_PAGES) { > ring_size = i;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 785384
:
569728
|
570742
|
571226
|
572081
|
572093
|
572114
|
573466
|
573467
|
573507
|
574743
|
575923
|
576087
|
576205
|
576257
|
576266
|
576333