dect
/
linux-2.6
Archived
13
0
Fork 0

CacheFiles: Downgrade the requirements passed to the allocator

Downgrade the requirements passed to the allocator in the gfp flags parameter.
FS-Cache/CacheFiles can handle OOM conditions simply by aborting the attempt to
store an object or a page in the cache.

Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
David Howells 2012-12-20 21:52:33 +00:00
parent c4d6d8dbf3
commit 5f4f9f4af1
6 changed files with 19 additions and 15 deletions

View File

@ -41,12 +41,12 @@ static struct fscache_object *cachefiles_alloc_object(
_enter("{%s},%p,", cache->cache.identifier, cookie); _enter("{%s},%p,", cache->cache.identifier, cookie);
lookup_data = kmalloc(sizeof(*lookup_data), GFP_KERNEL); lookup_data = kmalloc(sizeof(*lookup_data), cachefiles_gfp);
if (!lookup_data) if (!lookup_data)
goto nomem_lookup_data; goto nomem_lookup_data;
/* create a new object record and a temporary leaf image */ /* create a new object record and a temporary leaf image */
object = kmem_cache_alloc(cachefiles_object_jar, GFP_KERNEL); object = kmem_cache_alloc(cachefiles_object_jar, cachefiles_gfp);
if (!object) if (!object)
goto nomem_object; goto nomem_object;
@ -63,7 +63,7 @@ static struct fscache_object *cachefiles_alloc_object(
* - stick the length on the front and leave space on the back for the * - stick the length on the front and leave space on the back for the
* encoder * encoder
*/ */
buffer = kmalloc((2 + 512) + 3, GFP_KERNEL); buffer = kmalloc((2 + 512) + 3, cachefiles_gfp);
if (!buffer) if (!buffer)
goto nomem_buffer; goto nomem_buffer;
@ -219,7 +219,7 @@ static void cachefiles_update_object(struct fscache_object *_object)
return; return;
} }
auxdata = kmalloc(2 + 512 + 3, GFP_KERNEL); auxdata = kmalloc(2 + 512 + 3, cachefiles_gfp);
if (!auxdata) { if (!auxdata) {
_leave(" [nomem]"); _leave(" [nomem]");
return; return;

View File

@ -23,6 +23,8 @@ extern unsigned cachefiles_debug;
#define CACHEFILES_DEBUG_KLEAVE 2 #define CACHEFILES_DEBUG_KLEAVE 2
#define CACHEFILES_DEBUG_KDEBUG 4 #define CACHEFILES_DEBUG_KDEBUG 4
#define cachefiles_gfp (__GFP_WAIT | __GFP_NORETRY | __GFP_NOMEMALLOC)
/* /*
* node records * node records
*/ */

View File

@ -78,7 +78,7 @@ char *cachefiles_cook_key(const u8 *raw, int keylen, uint8_t type)
_debug("max: %d", max); _debug("max: %d", max);
key = kmalloc(max, GFP_KERNEL); key = kmalloc(max, cachefiles_gfp);
if (!key) if (!key)
return NULL; return NULL;

View File

@ -238,7 +238,7 @@ static int cachefiles_read_backing_file_one(struct cachefiles_object *object,
_debug("read back %p{%lu,%d}", _debug("read back %p{%lu,%d}",
netpage, netpage->index, page_count(netpage)); netpage, netpage->index, page_count(netpage));
monitor = kzalloc(sizeof(*monitor), GFP_KERNEL); monitor = kzalloc(sizeof(*monitor), cachefiles_gfp);
if (!monitor) if (!monitor)
goto nomem; goto nomem;
@ -257,13 +257,14 @@ static int cachefiles_read_backing_file_one(struct cachefiles_object *object,
goto backing_page_already_present; goto backing_page_already_present;
if (!newpage) { if (!newpage) {
newpage = page_cache_alloc_cold(bmapping); newpage = __page_cache_alloc(cachefiles_gfp |
__GFP_COLD);
if (!newpage) if (!newpage)
goto nomem_monitor; goto nomem_monitor;
} }
ret = add_to_page_cache(newpage, bmapping, ret = add_to_page_cache(newpage, bmapping,
netpage->index, GFP_KERNEL); netpage->index, cachefiles_gfp);
if (ret == 0) if (ret == 0)
goto installed_new_backing_page; goto installed_new_backing_page;
if (ret != -EEXIST) if (ret != -EEXIST)
@ -481,7 +482,7 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
netpage, netpage->index, page_count(netpage)); netpage, netpage->index, page_count(netpage));
if (!monitor) { if (!monitor) {
monitor = kzalloc(sizeof(*monitor), GFP_KERNEL); monitor = kzalloc(sizeof(*monitor), cachefiles_gfp);
if (!monitor) if (!monitor)
goto nomem; goto nomem;
@ -496,13 +497,14 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
goto backing_page_already_present; goto backing_page_already_present;
if (!newpage) { if (!newpage) {
newpage = page_cache_alloc_cold(bmapping); newpage = __page_cache_alloc(cachefiles_gfp |
__GFP_COLD);
if (!newpage) if (!newpage)
goto nomem; goto nomem;
} }
ret = add_to_page_cache(newpage, bmapping, ret = add_to_page_cache(newpage, bmapping,
netpage->index, GFP_KERNEL); netpage->index, cachefiles_gfp);
if (ret == 0) if (ret == 0)
goto installed_new_backing_page; goto installed_new_backing_page;
if (ret != -EEXIST) if (ret != -EEXIST)
@ -532,7 +534,7 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
_debug("- monitor add"); _debug("- monitor add");
ret = add_to_page_cache(netpage, op->mapping, netpage->index, ret = add_to_page_cache(netpage, op->mapping, netpage->index,
GFP_KERNEL); cachefiles_gfp);
if (ret < 0) { if (ret < 0) {
if (ret == -EEXIST) { if (ret == -EEXIST) {
page_cache_release(netpage); page_cache_release(netpage);
@ -608,7 +610,7 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
_debug("- uptodate"); _debug("- uptodate");
ret = add_to_page_cache(netpage, op->mapping, netpage->index, ret = add_to_page_cache(netpage, op->mapping, netpage->index,
GFP_KERNEL); cachefiles_gfp);
if (ret < 0) { if (ret < 0) {
if (ret == -EEXIST) { if (ret == -EEXIST) {
page_cache_release(netpage); page_cache_release(netpage);

View File

@ -174,7 +174,7 @@ int cachefiles_check_object_xattr(struct cachefiles_object *object,
ASSERT(dentry); ASSERT(dentry);
ASSERT(dentry->d_inode); ASSERT(dentry->d_inode);
auxbuf = kmalloc(sizeof(struct cachefiles_xattr) + 512, GFP_KERNEL); auxbuf = kmalloc(sizeof(struct cachefiles_xattr) + 512, cachefiles_gfp);
if (!auxbuf) { if (!auxbuf) {
_leave(" = -ENOMEM"); _leave(" = -ENOMEM");
return -ENOMEM; return -ENOMEM;

View File

@ -759,7 +759,7 @@ int __fscache_write_page(struct fscache_cookie *cookie,
fscache_stat(&fscache_n_stores); fscache_stat(&fscache_n_stores);
op = kzalloc(sizeof(*op), GFP_NOIO); op = kzalloc(sizeof(*op), GFP_NOIO | __GFP_NOMEMALLOC | __GFP_NORETRY);
if (!op) if (!op)
goto nomem; goto nomem;