diff mbox series

[22/29] lustre: osc: fall back to vmalloc for large RPCs

Message ID 1619381316-7719-23-git-send-email-jsimmons@infradead.org (mailing list archive)
State New, archived
Headers show
Series lustre: Update to OpenSFS tree as of April 25, 2020 | expand

Commit Message

James Simmons April 25, 2021, 8:08 p.m. UTC
From: Andreas Dilger <adilger@whamcloud.com>

For large RPC sizes (16MB+) the page array (4096 brw_page) can
become very large (128KB+ with fscrypt) and should fall back to
vmalloc() if kmalloc() fails due to memory fragmentation.

The mdc/mdt allocations are currently limited to 1MB for readdir
RPCs, but it doesn't hurt to prepare them for larger RPCs from
clients in the future if this limit is increased.

Fixes: 5965de814e91 ("staging: lustre: rpc: increase bulk size")
WC-bug-id: https://jira.whamcloud.com/browse/LU-13212
Lustre-commit: 037a9e2cf6d5b8d6f ("LU-13212 osc: fall back to vmalloc for large RPCs")
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/43281
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Wang Shilong <wshilong@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 fs/lustre/mdc/mdc_request.c     | 5 +++--
 fs/lustre/mgc/mgc_request.c     | 5 +++--
 fs/lustre/obdecho/echo_client.c | 5 +++--
 fs/lustre/osc/osc_request.c     | 5 +++--
 4 files changed, 12 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/fs/lustre/mdc/mdc_request.c b/fs/lustre/mdc/mdc_request.c
index 6ac3a39..fb9971f 100644
--- a/fs/lustre/mdc/mdc_request.c
+++ b/fs/lustre/mdc/mdc_request.c
@@ -1312,7 +1312,8 @@  static int mdc_read_page_remote(void *data, struct page *page0)
 	fid = &op_data->op_fid1;
 	LASSERT(inode);
 
-	page_pool = kcalloc(max_pages, sizeof(page), GFP_NOFS);
+	page_pool = kvmalloc_array(max_pages, sizeof(page),
+				   GFP_KERNEL | __GFP_ZERO);
 	if (page_pool) {
 		page_pool[0] = page0;
 	} else {
@@ -1381,7 +1382,7 @@  static int mdc_read_page_remote(void *data, struct page *page0)
 	}
 
 	if (page_pool != &page0)
-		kfree(page_pool);
+		kvfree(page_pool);
 
 	return rc;
 }
diff --git a/fs/lustre/mgc/mgc_request.c b/fs/lustre/mgc/mgc_request.c
index f115479..4b60056a 100644
--- a/fs/lustre/mgc/mgc_request.c
+++ b/fs/lustre/mgc/mgc_request.c
@@ -1350,7 +1350,8 @@  static int mgc_process_recover_log(struct obd_device *obd,
 	if (cfg->cfg_last_idx == 0) /* the first time */
 		nrpages = CONFIG_READ_NRPAGES_INIT;
 
-	pages = kcalloc(nrpages, sizeof(*pages), GFP_KERNEL);
+	pages = kvmalloc_array(nrpages, sizeof(*pages),
+			       GFP_KERNEL | __GFP_ZERO);
 	if (!pages) {
 		rc = -ENOMEM;
 		goto out;
@@ -1474,7 +1475,7 @@  static int mgc_process_recover_log(struct obd_device *obd,
 				break;
 			__free_page(pages[i]);
 		}
-		kfree(pages);
+		kvfree(pages);
 	}
 	return rc;
 }
diff --git a/fs/lustre/obdecho/echo_client.c b/fs/lustre/obdecho/echo_client.c
index 3bee0c2..270226b 100644
--- a/fs/lustre/obdecho/echo_client.c
+++ b/fs/lustre/obdecho/echo_client.c
@@ -1302,7 +1302,8 @@  static int echo_client_kbrw(struct echo_device *ed, int rw, struct obdo *oa,
 	if (!pga)
 		return -ENOMEM;
 
-	pages = kcalloc(npages, sizeof(*pages), GFP_NOFS);
+	pages = kvmalloc_array(npages, sizeof(*pages),
+			       GFP_KERNEL | __GFP_ZERO);
 	if (!pages) {
 		kfree(pga);
 		return -ENOMEM;
@@ -1355,7 +1356,7 @@  static int echo_client_kbrw(struct echo_device *ed, int rw, struct obdo *oa,
 		__free_page(pgp->pg);
 	}
 	kfree(pga);
-	kfree(pages);
+	kvfree(pages);
 	return rc;
 }
 
diff --git a/fs/lustre/osc/osc_request.c b/fs/lustre/osc/osc_request.c
index 1bd0d2c..973c504 100644
--- a/fs/lustre/osc/osc_request.c
+++ b/fs/lustre/osc/osc_request.c
@@ -2323,7 +2323,7 @@  static void sort_brw_pages(struct brw_page **array, int num)
 static void osc_release_ppga(struct brw_page **ppga, u32 count)
 {
 	LASSERT(ppga);
-	kfree(ppga);
+	kvfree(ppga);
 }
 
 static int brw_interpret(const struct lu_env *env,
@@ -2523,7 +2523,8 @@  int osc_build_rpc(const struct lu_env *env, struct client_obd *cli,
 	if (mem_tight)
 		mpflag = memalloc_noreclaim_save();
 
-	pga = kcalloc(page_count, sizeof(*pga), GFP_NOFS);
+	pga = kvmalloc_array(page_count, sizeof(*pga),
+			     GFP_KERNEL | __GFP_ZERO);
 	if (!pga) {
 		rc = -ENOMEM;
 		goto out;