Skip to content

Commit

Permalink
CacheFiles: Downgrade the requirements passed to the allocator
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Howells committed Dec 20, 2012
1 parent c4d6d8d commit 5f4f9f4
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 15 deletions.
8 changes: 4 additions & 4 deletions fs/cachefiles/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ static struct fscache_object *cachefiles_alloc_object(

_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)
goto nomem_lookup_data;

/* 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)
goto nomem_object;

Expand All @@ -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
* encoder
*/
buffer = kmalloc((2 + 512) + 3, GFP_KERNEL);
buffer = kmalloc((2 + 512) + 3, cachefiles_gfp);
if (!buffer)
goto nomem_buffer;

Expand Down Expand Up @@ -219,7 +219,7 @@ static void cachefiles_update_object(struct fscache_object *_object)
return;
}

auxdata = kmalloc(2 + 512 + 3, GFP_KERNEL);
auxdata = kmalloc(2 + 512 + 3, cachefiles_gfp);
if (!auxdata) {
_leave(" [nomem]");
return;
Expand Down
2 changes: 2 additions & 0 deletions fs/cachefiles/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ extern unsigned cachefiles_debug;
#define CACHEFILES_DEBUG_KLEAVE 2
#define CACHEFILES_DEBUG_KDEBUG 4

#define cachefiles_gfp (__GFP_WAIT | __GFP_NORETRY | __GFP_NOMEMALLOC)

/*
* node records
*/
Expand Down
2 changes: 1 addition & 1 deletion fs/cachefiles/key.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ char *cachefiles_cook_key(const u8 *raw, int keylen, uint8_t type)

_debug("max: %d", max);

key = kmalloc(max, GFP_KERNEL);
key = kmalloc(max, cachefiles_gfp);
if (!key)
return NULL;

Expand Down
18 changes: 10 additions & 8 deletions fs/cachefiles/rdwr.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ static int cachefiles_read_backing_file_one(struct cachefiles_object *object,
_debug("read back %p{%lu,%d}",
netpage, netpage->index, page_count(netpage));

monitor = kzalloc(sizeof(*monitor), GFP_KERNEL);
monitor = kzalloc(sizeof(*monitor), cachefiles_gfp);
if (!monitor)
goto nomem;

Expand All @@ -257,13 +257,14 @@ static int cachefiles_read_backing_file_one(struct cachefiles_object *object,
goto backing_page_already_present;

if (!newpage) {
newpage = page_cache_alloc_cold(bmapping);
newpage = __page_cache_alloc(cachefiles_gfp |
__GFP_COLD);
if (!newpage)
goto nomem_monitor;
}

ret = add_to_page_cache(newpage, bmapping,
netpage->index, GFP_KERNEL);
netpage->index, cachefiles_gfp);
if (ret == 0)
goto installed_new_backing_page;
if (ret != -EEXIST)
Expand Down Expand Up @@ -481,7 +482,7 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
netpage, netpage->index, page_count(netpage));

if (!monitor) {
monitor = kzalloc(sizeof(*monitor), GFP_KERNEL);
monitor = kzalloc(sizeof(*monitor), cachefiles_gfp);
if (!monitor)
goto nomem;

Expand All @@ -496,13 +497,14 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
goto backing_page_already_present;

if (!newpage) {
newpage = page_cache_alloc_cold(bmapping);
newpage = __page_cache_alloc(cachefiles_gfp |
__GFP_COLD);
if (!newpage)
goto nomem;
}

ret = add_to_page_cache(newpage, bmapping,
netpage->index, GFP_KERNEL);
netpage->index, cachefiles_gfp);
if (ret == 0)
goto installed_new_backing_page;
if (ret != -EEXIST)
Expand Down Expand Up @@ -532,7 +534,7 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
_debug("- monitor add");

ret = add_to_page_cache(netpage, op->mapping, netpage->index,
GFP_KERNEL);
cachefiles_gfp);
if (ret < 0) {
if (ret == -EEXIST) {
page_cache_release(netpage);
Expand Down Expand Up @@ -608,7 +610,7 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
_debug("- uptodate");

ret = add_to_page_cache(netpage, op->mapping, netpage->index,
GFP_KERNEL);
cachefiles_gfp);
if (ret < 0) {
if (ret == -EEXIST) {
page_cache_release(netpage);
Expand Down
2 changes: 1 addition & 1 deletion fs/cachefiles/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ int cachefiles_check_object_xattr(struct cachefiles_object *object,
ASSERT(dentry);
ASSERT(dentry->d_inode);

auxbuf = kmalloc(sizeof(struct cachefiles_xattr) + 512, GFP_KERNEL);
auxbuf = kmalloc(sizeof(struct cachefiles_xattr) + 512, cachefiles_gfp);
if (!auxbuf) {
_leave(" = -ENOMEM");
return -ENOMEM;
Expand Down
2 changes: 1 addition & 1 deletion fs/fscache/page.c
Original file line number Diff line number Diff line change
Expand Up @@ -759,7 +759,7 @@ int __fscache_write_page(struct fscache_cookie *cookie,

fscache_stat(&fscache_n_stores);

op = kzalloc(sizeof(*op), GFP_NOIO);
op = kzalloc(sizeof(*op), GFP_NOIO | __GFP_NOMEMALLOC | __GFP_NORETRY);
if (!op)
goto nomem;

Expand Down

0 comments on commit 5f4f9f4

Please sign in to comment.