diff for duplicates of <20100713102144.2835.5915.sendpatchset@danny.redhat> diff --git a/a/1.txt b/N1/1.txt index 5b23dde..2e92bb4 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -368,9 +368,3 @@ index 49a62f0..5c8b918 100644 static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt, -- 1.7.1.1 - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N1/content_digest index 7662783..3fcfc17 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -385,12 +385,6 @@ " \n" " static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt,\n" "-- \n" - "1.7.1.1\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" + 1.7.1.1 -f1d74251d8dc385018c166b15f64fcbe4b4aaed9e22cb9e937372cb02c7d2309 +2e5692e416d8af7ca4cd3a8ea0bafcb252a5db1bc6e766d936d86887d7871885
diff --git a/a/1.txt b/N2/1.txt index 5b23dde..8b13789 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,376 +1 @@ ->From 61388a8872071bb5b0015b9f5e3183410a98d949 Mon Sep 17 00:00:00 2001 -From: Xiaotian Feng <dfeng@redhat.com> -Date: Tue, 13 Jul 2010 13:11:13 +0800 -Subject: [PATCH 26/30] nfs: enable swap on NFS -Implement all the new swapfile a_ops for NFS. This will set the NFS socket to -SOCK_MEMALLOC and run socket reconnect under PF_MEMALLOC as well as reset -SOCK_MEMALLOC before engaging the protocol ->connect() method. - -PF_MEMALLOC should allow the allocation of struct socket and related objects -and the early (re)setting of SOCK_MEMALLOC should allow us to receive the -packets required for the TCP connection buildup. - -(swapping continues over a server reset during heavy network traffic) - -Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> -Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de> -Signed-off-by: Xiaotian Feng <dfeng@redhat.com> ---- - fs/nfs/Kconfig | 10 ++++++ - fs/nfs/file.c | 18 +++++++++++ - fs/nfs/write.c | 22 ++++++++++++++ - include/linux/nfs_fs.h | 2 + - include/linux/sunrpc/xprt.h | 5 ++- - mm/page_io.c | 1 + - net/sunrpc/Kconfig | 5 +++ - net/sunrpc/sched.c | 9 ++++- - net/sunrpc/xprtsock.c | 68 +++++++++++++++++++++++++++++++++++++++++++ - 9 files changed, 137 insertions(+), 3 deletions(-) - -diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig -index a43d07e..b022858 100644 ---- a/fs/nfs/Kconfig -+++ b/fs/nfs/Kconfig -@@ -74,6 +74,16 @@ config NFS_V4 - - If unsure, say N. - -+config NFS_SWAP -+ bool "Provide swap over NFS support" -+ default n -+ depends on NFS_FS -+ select SUNRPC_SWAP -+ help -+ This option enables swapon to work on files located on NFS mounts. -+ -+ For more details, see Documentation/network-swap.txt -+ - config NFS_V4_1 - bool "NFS client support for NFSv4.1 (DEVELOPER ONLY)" - depends on NFS_V4 && EXPERIMENTAL -diff --git a/fs/nfs/file.c b/fs/nfs/file.c -index 8f066fe..319c2b3 100644 ---- a/fs/nfs/file.c -+++ b/fs/nfs/file.c -@@ -524,6 +524,18 @@ static int nfs_launder_page(struct page *page) - return nfs_wb_page(inode, page); - } - -+#ifdef CONFIG_NFS_SWAP -+static int nfs_swapon(struct file *file) -+{ -+ return xs_swapper(NFS_CLIENT(file->f_mapping->host)->cl_xprt, 1); -+} -+ -+static int nfs_swapoff(struct file *file) -+{ -+ return xs_swapper(NFS_CLIENT(file->f_mapping->host)->cl_xprt, 0); -+} -+#endif -+ - const struct address_space_operations nfs_file_aops = { - .readpage = nfs_readpage, - .readpages = nfs_readpages, -@@ -538,6 +550,12 @@ const struct address_space_operations nfs_file_aops = { - .migratepage = nfs_migrate_page, - .launder_page = nfs_launder_page, - .error_remove_page = generic_error_remove_page, -+#ifdef CONFIG_NFS_SWAP -+ .swapon = nfs_swapon, -+ .swapoff = nfs_swapoff, -+ .swap_out = nfs_swap_out, -+ .swap_in = nfs_readpage, -+#endif - }; - - /* -diff --git a/fs/nfs/write.c b/fs/nfs/write.c -index 0d7ea95..5852b20 100644 ---- a/fs/nfs/write.c -+++ b/fs/nfs/write.c -@@ -355,6 +355,28 @@ int nfs_writepage(struct page *page, struct writeback_control *wbc) - return ret; - } - -+static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page, -+ unsigned int offset, unsigned int count); -+ -+int nfs_swap_out(struct file *file, struct page *page, -+ struct writeback_control *wbc) -+{ -+ struct nfs_open_context *ctx = nfs_file_open_context(file); -+ int status; -+ -+ status = nfs_writepage_setup(ctx, page, 0, nfs_page_length(page)); -+ if (status < 0) { -+ nfs_set_pageerror(page); -+ goto out; -+ } -+ -+ status = nfs_writepage_locked(page, wbc); -+ -+out: -+ unlock_page(page); -+ return status; -+} -+ - static int nfs_writepages_callback(struct page *page, struct writeback_control *wbc, void *data) - { - int ret; -diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h -index 77c2ae5..fc1bbfb 100644 ---- a/include/linux/nfs_fs.h -+++ b/include/linux/nfs_fs.h -@@ -484,6 +484,8 @@ extern int nfs_writepages(struct address_space *, struct writeback_control *); - extern int nfs_flush_incompatible(struct file *file, struct page *page); - extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); - extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); -+extern int nfs_swap_out(struct file *file, struct page *page, -+ struct writeback_control *wbc); - - /* - * Try to write back everything synchronously (but check the -diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h -index b514703..ba2330d 100644 ---- a/include/linux/sunrpc/xprt.h -+++ b/include/linux/sunrpc/xprt.h -@@ -171,7 +171,9 @@ struct rpc_xprt { - unsigned int max_reqs; /* total slots */ - unsigned long state; /* transport state */ - unsigned char shutdown : 1, /* being shut down */ -- resvport : 1; /* use a reserved port */ -+ resvport : 1, /* use a reserved port */ -+ swapper : 1; /* we're swapping over this -+ transport */ - unsigned int bind_index; /* bind function index */ - - /* -@@ -303,6 +305,7 @@ void xprt_release_rqst_cong(struct rpc_task *task); - void xprt_disconnect_done(struct rpc_xprt *xprt); - void xprt_force_disconnect(struct rpc_xprt *xprt); - void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie); -+int xs_swapper(struct rpc_xprt *xprt, int enable); - - /* - * Reserved bit positions in xprt->state -diff --git a/mm/page_io.c b/mm/page_io.c -index 012b9ef..c8d7d8d 100644 ---- a/mm/page_io.c -+++ b/mm/page_io.c -@@ -94,6 +94,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) - { - struct bio *bio; - int ret = 0, rw = WRITE; -+ struct swap_info_struct *sis = page_swap_info(page); - - if (try_to_free_swap(page)) { - unlock_page(page); -diff --git a/net/sunrpc/Kconfig b/net/sunrpc/Kconfig -index 443c161..521eadb 100644 ---- a/net/sunrpc/Kconfig -+++ b/net/sunrpc/Kconfig -@@ -17,6 +17,11 @@ config SUNRPC_XPRT_RDMA - - If unsure, say N. - -+config SUNRPC_SWAP -+ def_bool n -+ depends on SUNRPC -+ select NETVM -+ - config RPCSEC_GSS_KRB5 - tristate "Secure RPC: Kerberos V mechanism (EXPERIMENTAL)" - depends on SUNRPC && EXPERIMENTAL -diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c -index 4a843b8..6a16dc0 100644 ---- a/net/sunrpc/sched.c -+++ b/net/sunrpc/sched.c -@@ -742,7 +742,10 @@ static void rpc_async_schedule(struct work_struct *work) - void *rpc_malloc(struct rpc_task *task, size_t size) - { - struct rpc_buffer *buf; -- gfp_t gfp = RPC_IS_SWAPPER(task) ? GFP_ATOMIC : GFP_NOWAIT; -+ gfp_t gfp = GFP_NOWAIT; -+ -+ if (RPC_IS_SWAPPER(task)) -+ gfp |= __GFP_MEMALLOC; - - size += sizeof(struct rpc_buffer); - if (size <= RPC_BUFFER_MAXSIZE) -@@ -813,6 +816,8 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta - kref_get(&task->tk_client->cl_kref); - if (task->tk_client->cl_softrtry) - task->tk_flags |= RPC_TASK_SOFT; -+ if (task->tk_client->cl_xprt->swapper) -+ task->tk_flags |= RPC_TASK_SWAPPER; - } - - if (task->tk_ops->rpc_call_prepare != NULL) -@@ -838,7 +843,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta - static struct rpc_task * - rpc_alloc_task(void) - { -- return (struct rpc_task *)mempool_alloc(rpc_task_mempool, GFP_NOFS); -+ return (struct rpc_task *)mempool_alloc(rpc_task_mempool, GFP_NOIO); - } - - /* -diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c -index 49a62f0..5c8b918 100644 ---- a/net/sunrpc/xprtsock.c -+++ b/net/sunrpc/xprtsock.c -@@ -1631,6 +1631,55 @@ static inline void xs_reclassify_socket6(struct socket *sock) - } - #endif - -+#ifdef CONFIG_SUNRPC_SWAP -+static void xs_set_memalloc(struct rpc_xprt *xprt) -+{ -+ struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); -+ -+ if (xprt->swapper) -+ sk_set_memalloc(transport->inet); -+} -+ -+#define RPC_BUF_RESERVE_PAGES \ -+ kmalloc_estimate_objs(sizeof(struct rpc_rqst), GFP_KERNEL, RPC_MAX_SLOT_TABLE) -+#define RPC_RESERVE_PAGES (RPC_BUF_RESERVE_PAGES + TX_RESERVE_PAGES) -+ -+/** -+ * xs_swapper - Tag this transport as being used for swap. -+ * @xprt: transport to tag -+ * @enable: enable/disable -+ * -+ */ -+int xs_swapper(struct rpc_xprt *xprt, int enable) -+{ -+ struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); -+ int err = 0; -+ -+ if (enable) { -+ /* -+ * keep one extra sock reference so the reserve won't dip -+ * when the socket gets reconnected. -+ */ -+ err = sk_adjust_memalloc(1, RPC_RESERVE_PAGES); -+ if (!err) { -+ xprt->swapper = 1; -+ xs_set_memalloc(xprt); -+ } -+ } else if (xprt->swapper) { -+ xprt->swapper = 0; -+ sk_clear_memalloc(transport->inet); -+ sk_adjust_memalloc(-1, -RPC_RESERVE_PAGES); -+ } -+ -+ return err; -+} -+EXPORT_SYMBOL_GPL(xs_swapper); -+#else -+static void xs_set_memalloc(struct rpc_xprt *xprt) -+{ -+} -+#endif -+ - static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) - { - struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); -@@ -1655,6 +1704,8 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) - transport->sock = sock; - transport->inet = sk; - -+ xs_set_memalloc(xprt); -+ - write_unlock_bh(&sk->sk_callback_lock); - } - xs_udp_do_set_buffer_size(xprt); -@@ -1672,11 +1723,15 @@ static void xs_udp_connect_worker4(struct work_struct *work) - container_of(work, struct sock_xprt, connect_worker.work); - struct rpc_xprt *xprt = &transport->xprt; - struct socket *sock = transport->sock; -+ unsigned long pflags = current->flags; - int err, status = -EIO; - - if (xprt->shutdown) - goto out; - -+ if (xprt->swapper) -+ current->flags |= PF_MEMALLOC; -+ - /* Start by resetting any existing state */ - xs_reset_transport(transport); - -@@ -1703,6 +1758,7 @@ static void xs_udp_connect_worker4(struct work_struct *work) - out: - xprt_clear_connecting(xprt); - xprt_wake_pending_tasks(xprt, status); -+ tsk_restore_flags(current, pflags, PF_MEMALLOC); - } - - /** -@@ -1717,11 +1773,15 @@ static void xs_udp_connect_worker6(struct work_struct *work) - container_of(work, struct sock_xprt, connect_worker.work); - struct rpc_xprt *xprt = &transport->xprt; - struct socket *sock = transport->sock; -+ unsigned long pflags = current->flags; - int err, status = -EIO; - - if (xprt->shutdown) - goto out; - -+ if (xprt->swapper) -+ current->flags |= PF_MEMALLOC; -+ - /* Start by resetting any existing state */ - xs_reset_transport(transport); - -@@ -1748,6 +1808,7 @@ static void xs_udp_connect_worker6(struct work_struct *work) - out: - xprt_clear_connecting(xprt); - xprt_wake_pending_tasks(xprt, status); -+ tsk_restore_flags(current, pflags, PF_MEMALLOC); - } - - /* -@@ -1822,6 +1883,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) - if (!xprt_bound(xprt)) - return -ENOTCONN; - -+ xs_set_memalloc(xprt); -+ - /* Tell the socket layer to start connecting... */ - xprt->stat.connect_count++; - xprt->stat.connect_start = jiffies; -@@ -1842,11 +1905,15 @@ static void xs_tcp_setup_socket(struct rpc_xprt *xprt, - struct sock_xprt *)) - { - struct socket *sock = transport->sock; -+ unsigned long pflags = current->flags; - int status = -EIO; - - if (xprt->shutdown) - goto out; - -+ if (xprt->swapper) -+ current->flags |= PF_MEMALLOC; -+ - if (!sock) { - clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); - sock = create_sock(xprt, transport); -@@ -1907,6 +1974,7 @@ out_eagain: - out: - xprt_clear_connecting(xprt); - xprt_wake_pending_tasks(xprt, status); -+ tsk_restore_flags(current, pflags, PF_MEMALLOC); - } - - static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt, --- -1.7.1.1 - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N2/content_digest index 7662783..353d1e1 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -16,381 +16,5 @@ " davem@davemloft.net\0" "\00:1\0" "b\0" - ">From 61388a8872071bb5b0015b9f5e3183410a98d949 Mon Sep 17 00:00:00 2001\n" - "From: Xiaotian Feng <dfeng@redhat.com>\n" - "Date: Tue, 13 Jul 2010 13:11:13 +0800\n" - "Subject: [PATCH 26/30] nfs: enable swap on NFS\n" - "\n" - "Implement all the new swapfile a_ops for NFS. This will set the NFS socket to\n" - "SOCK_MEMALLOC and run socket reconnect under PF_MEMALLOC as well as reset\n" - "SOCK_MEMALLOC before engaging the protocol ->connect() method.\n" - "\n" - "PF_MEMALLOC should allow the allocation of struct socket and related objects\n" - "and the early (re)setting of SOCK_MEMALLOC should allow us to receive the\n" - "packets required for the TCP connection buildup.\n" - "\n" - "(swapping continues over a server reset during heavy network traffic)\n" - "\n" - "Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>\n" - "Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de>\n" - "Signed-off-by: Xiaotian Feng <dfeng@redhat.com>\n" - "---\n" - " fs/nfs/Kconfig | 10 ++++++\n" - " fs/nfs/file.c | 18 +++++++++++\n" - " fs/nfs/write.c | 22 ++++++++++++++\n" - " include/linux/nfs_fs.h | 2 +\n" - " include/linux/sunrpc/xprt.h | 5 ++-\n" - " mm/page_io.c | 1 +\n" - " net/sunrpc/Kconfig | 5 +++\n" - " net/sunrpc/sched.c | 9 ++++-\n" - " net/sunrpc/xprtsock.c | 68 +++++++++++++++++++++++++++++++++++++++++++\n" - " 9 files changed, 137 insertions(+), 3 deletions(-)\n" - "\n" - "diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig\n" - "index a43d07e..b022858 100644\n" - "--- a/fs/nfs/Kconfig\n" - "+++ b/fs/nfs/Kconfig\n" - "@@ -74,6 +74,16 @@ config NFS_V4\n" - " \n" - " \t If unsure, say N.\n" - " \n" - "+config NFS_SWAP\n" - "+\tbool \"Provide swap over NFS support\"\n" - "+\tdefault n\n" - "+\tdepends on NFS_FS\n" - "+\tselect SUNRPC_SWAP\n" - "+\thelp\n" - "+\t This option enables swapon to work on files located on NFS mounts.\n" - "+\n" - "+\t For more details, see Documentation/network-swap.txt\n" - "+\n" - " config NFS_V4_1\n" - " \tbool \"NFS client support for NFSv4.1 (DEVELOPER ONLY)\"\n" - " \tdepends on NFS_V4 && EXPERIMENTAL\n" - "diff --git a/fs/nfs/file.c b/fs/nfs/file.c\n" - "index 8f066fe..319c2b3 100644\n" - "--- a/fs/nfs/file.c\n" - "+++ b/fs/nfs/file.c\n" - "@@ -524,6 +524,18 @@ static int nfs_launder_page(struct page *page)\n" - " \treturn nfs_wb_page(inode, page);\n" - " }\n" - " \n" - "+#ifdef CONFIG_NFS_SWAP\n" - "+static int nfs_swapon(struct file *file)\n" - "+{\n" - "+\treturn xs_swapper(NFS_CLIENT(file->f_mapping->host)->cl_xprt, 1);\n" - "+}\n" - "+\n" - "+static int nfs_swapoff(struct file *file)\n" - "+{\n" - "+\treturn xs_swapper(NFS_CLIENT(file->f_mapping->host)->cl_xprt, 0);\n" - "+}\n" - "+#endif\n" - "+\n" - " const struct address_space_operations nfs_file_aops = {\n" - " \t.readpage = nfs_readpage,\n" - " \t.readpages = nfs_readpages,\n" - "@@ -538,6 +550,12 @@ const struct address_space_operations nfs_file_aops = {\n" - " \t.migratepage = nfs_migrate_page,\n" - " \t.launder_page = nfs_launder_page,\n" - " \t.error_remove_page = generic_error_remove_page,\n" - "+#ifdef CONFIG_NFS_SWAP\n" - "+\t.swapon = nfs_swapon,\n" - "+\t.swapoff = nfs_swapoff,\n" - "+\t.swap_out = nfs_swap_out,\n" - "+\t.swap_in = nfs_readpage,\n" - "+#endif\n" - " };\n" - " \n" - " /*\n" - "diff --git a/fs/nfs/write.c b/fs/nfs/write.c\n" - "index 0d7ea95..5852b20 100644\n" - "--- a/fs/nfs/write.c\n" - "+++ b/fs/nfs/write.c\n" - "@@ -355,6 +355,28 @@ int nfs_writepage(struct page *page, struct writeback_control *wbc)\n" - " \treturn ret;\n" - " }\n" - " \n" - "+static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page,\n" - "+\t\tunsigned int offset, unsigned int count);\n" - "+\n" - "+int nfs_swap_out(struct file *file, struct page *page,\n" - "+\t\t struct writeback_control *wbc)\n" - "+{\n" - "+\tstruct nfs_open_context *ctx = nfs_file_open_context(file);\n" - "+\tint status;\n" - "+\n" - "+\tstatus = nfs_writepage_setup(ctx, page, 0, nfs_page_length(page));\n" - "+\tif (status < 0) {\n" - "+\t\tnfs_set_pageerror(page);\n" - "+\t\tgoto out;\n" - "+\t}\n" - "+\n" - "+\tstatus = nfs_writepage_locked(page, wbc);\n" - "+\n" - "+out:\n" - "+\tunlock_page(page);\n" - "+\treturn status;\n" - "+}\n" - "+\n" - " static int nfs_writepages_callback(struct page *page, struct writeback_control *wbc, void *data)\n" - " {\n" - " \tint ret;\n" - "diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h\n" - "index 77c2ae5..fc1bbfb 100644\n" - "--- a/include/linux/nfs_fs.h\n" - "+++ b/include/linux/nfs_fs.h\n" - "@@ -484,6 +484,8 @@ extern int nfs_writepages(struct address_space *, struct writeback_control *);\n" - " extern int nfs_flush_incompatible(struct file *file, struct page *page);\n" - " extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);\n" - " extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);\n" - "+extern int nfs_swap_out(struct file *file, struct page *page,\n" - "+\t\t\t struct writeback_control *wbc);\n" - " \n" - " /*\n" - " * Try to write back everything synchronously (but check the\n" - "diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h\n" - "index b514703..ba2330d 100644\n" - "--- a/include/linux/sunrpc/xprt.h\n" - "+++ b/include/linux/sunrpc/xprt.h\n" - "@@ -171,7 +171,9 @@ struct rpc_xprt {\n" - " \tunsigned int\t\tmax_reqs;\t/* total slots */\n" - " \tunsigned long\t\tstate;\t\t/* transport state */\n" - " \tunsigned char\t\tshutdown : 1,\t/* being shut down */\n" - "-\t\t\t\tresvport : 1; /* use a reserved port */\n" - "+\t\t\t\tresvport : 1, /* use a reserved port */\n" - "+\t\t\t\tswapper : 1; /* we're swapping over this\n" - "+\t\t\t\t\t\t transport */\n" - " \tunsigned int\t\tbind_index;\t/* bind function index */\n" - " \n" - " \t/*\n" - "@@ -303,6 +305,7 @@ void\t\t\txprt_release_rqst_cong(struct rpc_task *task);\n" - " void\t\t\txprt_disconnect_done(struct rpc_xprt *xprt);\n" - " void\t\t\txprt_force_disconnect(struct rpc_xprt *xprt);\n" - " void\t\t\txprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);\n" - "+int\t\t\txs_swapper(struct rpc_xprt *xprt, int enable);\n" - " \n" - " /*\n" - " * Reserved bit positions in xprt->state\n" - "diff --git a/mm/page_io.c b/mm/page_io.c\n" - "index 012b9ef..c8d7d8d 100644\n" - "--- a/mm/page_io.c\n" - "+++ b/mm/page_io.c\n" - "@@ -94,6 +94,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc)\n" - " {\n" - " \tstruct bio *bio;\n" - " \tint ret = 0, rw = WRITE;\n" - "+\tstruct swap_info_struct *sis = page_swap_info(page);\n" - " \n" - " \tif (try_to_free_swap(page)) {\n" - " \t\tunlock_page(page);\n" - "diff --git a/net/sunrpc/Kconfig b/net/sunrpc/Kconfig\n" - "index 443c161..521eadb 100644\n" - "--- a/net/sunrpc/Kconfig\n" - "+++ b/net/sunrpc/Kconfig\n" - "@@ -17,6 +17,11 @@ config SUNRPC_XPRT_RDMA\n" - " \n" - " \t If unsure, say N.\n" - " \n" - "+config SUNRPC_SWAP\n" - "+\tdef_bool n\n" - "+\tdepends on SUNRPC\n" - "+\tselect NETVM\n" - "+\n" - " config RPCSEC_GSS_KRB5\n" - " \ttristate \"Secure RPC: Kerberos V mechanism (EXPERIMENTAL)\"\n" - " \tdepends on SUNRPC && EXPERIMENTAL\n" - "diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c\n" - "index 4a843b8..6a16dc0 100644\n" - "--- a/net/sunrpc/sched.c\n" - "+++ b/net/sunrpc/sched.c\n" - "@@ -742,7 +742,10 @@ static void rpc_async_schedule(struct work_struct *work)\n" - " void *rpc_malloc(struct rpc_task *task, size_t size)\n" - " {\n" - " \tstruct rpc_buffer *buf;\n" - "-\tgfp_t gfp = RPC_IS_SWAPPER(task) ? GFP_ATOMIC : GFP_NOWAIT;\n" - "+\tgfp_t gfp = GFP_NOWAIT;\n" - "+\n" - "+\tif (RPC_IS_SWAPPER(task))\n" - "+\t\tgfp |= __GFP_MEMALLOC;\n" - " \n" - " \tsize += sizeof(struct rpc_buffer);\n" - " \tif (size <= RPC_BUFFER_MAXSIZE)\n" - "@@ -813,6 +816,8 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta\n" - " \t\tkref_get(&task->tk_client->cl_kref);\n" - " \t\tif (task->tk_client->cl_softrtry)\n" - " \t\t\ttask->tk_flags |= RPC_TASK_SOFT;\n" - "+\t\tif (task->tk_client->cl_xprt->swapper)\n" - "+\t\t\ttask->tk_flags |= RPC_TASK_SWAPPER;\n" - " \t}\n" - " \n" - " \tif (task->tk_ops->rpc_call_prepare != NULL)\n" - "@@ -838,7 +843,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta\n" - " static struct rpc_task *\n" - " rpc_alloc_task(void)\n" - " {\n" - "-\treturn (struct rpc_task *)mempool_alloc(rpc_task_mempool, GFP_NOFS);\n" - "+\treturn (struct rpc_task *)mempool_alloc(rpc_task_mempool, GFP_NOIO);\n" - " }\n" - " \n" - " /*\n" - "diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c\n" - "index 49a62f0..5c8b918 100644\n" - "--- a/net/sunrpc/xprtsock.c\n" - "+++ b/net/sunrpc/xprtsock.c\n" - "@@ -1631,6 +1631,55 @@ static inline void xs_reclassify_socket6(struct socket *sock)\n" - " }\n" - " #endif\n" - " \n" - "+#ifdef CONFIG_SUNRPC_SWAP\n" - "+static void xs_set_memalloc(struct rpc_xprt *xprt)\n" - "+{\n" - "+\tstruct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);\n" - "+\n" - "+\tif (xprt->swapper)\n" - "+\t\tsk_set_memalloc(transport->inet);\n" - "+}\n" - "+\n" - "+#define RPC_BUF_RESERVE_PAGES \\\n" - "+\tkmalloc_estimate_objs(sizeof(struct rpc_rqst), GFP_KERNEL, RPC_MAX_SLOT_TABLE)\n" - "+#define RPC_RESERVE_PAGES\t(RPC_BUF_RESERVE_PAGES + TX_RESERVE_PAGES)\n" - "+\n" - "+/**\n" - "+ * xs_swapper - Tag this transport as being used for swap.\n" - "+ * @xprt: transport to tag\n" - "+ * @enable: enable/disable\n" - "+ *\n" - "+ */\n" - "+int xs_swapper(struct rpc_xprt *xprt, int enable)\n" - "+{\n" - "+\tstruct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);\n" - "+\tint err = 0;\n" - "+\n" - "+\tif (enable) {\n" - "+\t\t/*\n" - "+\t\t * keep one extra sock reference so the reserve won't dip\n" - "+\t\t * when the socket gets reconnected.\n" - "+\t\t */\n" - "+\t\terr = sk_adjust_memalloc(1, RPC_RESERVE_PAGES);\n" - "+\t\tif (!err) {\n" - "+\t\t\txprt->swapper = 1;\n" - "+\t\t\txs_set_memalloc(xprt);\n" - "+\t\t}\n" - "+\t} else if (xprt->swapper) {\n" - "+\t\txprt->swapper = 0;\n" - "+\t\tsk_clear_memalloc(transport->inet);\n" - "+\t\tsk_adjust_memalloc(-1, -RPC_RESERVE_PAGES);\n" - "+\t}\n" - "+\n" - "+\treturn err;\n" - "+}\n" - "+EXPORT_SYMBOL_GPL(xs_swapper);\n" - "+#else\n" - "+static void xs_set_memalloc(struct rpc_xprt *xprt)\n" - "+{\n" - "+}\n" - "+#endif\n" - "+\n" - " static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)\n" - " {\n" - " \tstruct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);\n" - "@@ -1655,6 +1704,8 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)\n" - " \t\ttransport->sock = sock;\n" - " \t\ttransport->inet = sk;\n" - " \n" - "+\t\txs_set_memalloc(xprt);\n" - "+\n" - " \t\twrite_unlock_bh(&sk->sk_callback_lock);\n" - " \t}\n" - " \txs_udp_do_set_buffer_size(xprt);\n" - "@@ -1672,11 +1723,15 @@ static void xs_udp_connect_worker4(struct work_struct *work)\n" - " \t\tcontainer_of(work, struct sock_xprt, connect_worker.work);\n" - " \tstruct rpc_xprt *xprt = &transport->xprt;\n" - " \tstruct socket *sock = transport->sock;\n" - "+\tunsigned long pflags = current->flags;\n" - " \tint err, status = -EIO;\n" - " \n" - " \tif (xprt->shutdown)\n" - " \t\tgoto out;\n" - " \n" - "+\tif (xprt->swapper)\n" - "+\t\tcurrent->flags |= PF_MEMALLOC;\n" - "+\n" - " \t/* Start by resetting any existing state */\n" - " \txs_reset_transport(transport);\n" - " \n" - "@@ -1703,6 +1758,7 @@ static void xs_udp_connect_worker4(struct work_struct *work)\n" - " out:\n" - " \txprt_clear_connecting(xprt);\n" - " \txprt_wake_pending_tasks(xprt, status);\n" - "+\ttsk_restore_flags(current, pflags, PF_MEMALLOC);\n" - " }\n" - " \n" - " /**\n" - "@@ -1717,11 +1773,15 @@ static void xs_udp_connect_worker6(struct work_struct *work)\n" - " \t\tcontainer_of(work, struct sock_xprt, connect_worker.work);\n" - " \tstruct rpc_xprt *xprt = &transport->xprt;\n" - " \tstruct socket *sock = transport->sock;\n" - "+\tunsigned long pflags = current->flags;\n" - " \tint err, status = -EIO;\n" - " \n" - " \tif (xprt->shutdown)\n" - " \t\tgoto out;\n" - " \n" - "+\tif (xprt->swapper)\n" - "+\t\tcurrent->flags |= PF_MEMALLOC;\n" - "+\n" - " \t/* Start by resetting any existing state */\n" - " \txs_reset_transport(transport);\n" - " \n" - "@@ -1748,6 +1808,7 @@ static void xs_udp_connect_worker6(struct work_struct *work)\n" - " out:\n" - " \txprt_clear_connecting(xprt);\n" - " \txprt_wake_pending_tasks(xprt, status);\n" - "+\ttsk_restore_flags(current, pflags, PF_MEMALLOC);\n" - " }\n" - " \n" - " /*\n" - "@@ -1822,6 +1883,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)\n" - " \tif (!xprt_bound(xprt))\n" - " \t\treturn -ENOTCONN;\n" - " \n" - "+\txs_set_memalloc(xprt);\n" - "+\n" - " \t/* Tell the socket layer to start connecting... */\n" - " \txprt->stat.connect_count++;\n" - " \txprt->stat.connect_start = jiffies;\n" - "@@ -1842,11 +1905,15 @@ static void xs_tcp_setup_socket(struct rpc_xprt *xprt,\n" - " \t\t\tstruct sock_xprt *))\n" - " {\n" - " \tstruct socket *sock = transport->sock;\n" - "+\tunsigned long pflags = current->flags;\n" - " \tint status = -EIO;\n" - " \n" - " \tif (xprt->shutdown)\n" - " \t\tgoto out;\n" - " \n" - "+\tif (xprt->swapper)\n" - "+\t\tcurrent->flags |= PF_MEMALLOC;\n" - "+\n" - " \tif (!sock) {\n" - " \t\tclear_bit(XPRT_CONNECTION_ABORT, &xprt->state);\n" - " \t\tsock = create_sock(xprt, transport);\n" - "@@ -1907,6 +1974,7 @@ out_eagain:\n" - " out:\n" - " \txprt_clear_connecting(xprt);\n" - " \txprt_wake_pending_tasks(xprt, status);\n" - "+\ttsk_restore_flags(current, pflags, PF_MEMALLOC);\n" - " }\n" - " \n" - " static struct socket *xs_create_tcp_sock4(struct rpc_xprt *xprt,\n" - "-- \n" - "1.7.1.1\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" -f1d74251d8dc385018c166b15f64fcbe4b4aaed9e22cb9e937372cb02c7d2309 +5fa3bb39e17374cfce04b95d4e757b36c3917a0901cf997149adf21c5ea4e3a2
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.