Commit 8c7f6e9b3321f5ede7f33974cad06db224661a42
1 parent
4a47d3a1ff
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
target: Fall back to vzalloc upon ->sess_cmd_map kzalloc failure
This patch changes transport_alloc_session_tags() to fall back to use vzalloc when kzalloc fails for big tag_num that end up generating larger order allocations. Also use is_vmalloc_addr() in transport_alloc_session_tags() failure path, and normal transport_free_session() path to determine when vfree() needs to be called instead of kfree(). v2 changes: - Use __GFP_NOWARN | __GFP_REPEAT for sess_cmd_map kzalloc (mst) Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Asias He <asias@redhat.com> Cc: Kent Overstreet <kmo@daterainc.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Showing 1 changed file with 15 additions and 5 deletions Side-by-side Diff
drivers/target/target_core_transport.c
... | ... | @@ -236,17 +236,24 @@ |
236 | 236 | { |
237 | 237 | int rc; |
238 | 238 | |
239 | - se_sess->sess_cmd_map = kzalloc(tag_num * tag_size, GFP_KERNEL); | |
239 | + se_sess->sess_cmd_map = kzalloc(tag_num * tag_size, | |
240 | + GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); | |
240 | 241 | if (!se_sess->sess_cmd_map) { |
241 | - pr_err("Unable to allocate se_sess->sess_cmd_map\n"); | |
242 | - return -ENOMEM; | |
242 | + se_sess->sess_cmd_map = vzalloc(tag_num * tag_size); | |
243 | + if (!se_sess->sess_cmd_map) { | |
244 | + pr_err("Unable to allocate se_sess->sess_cmd_map\n"); | |
245 | + return -ENOMEM; | |
246 | + } | |
243 | 247 | } |
244 | 248 | |
245 | 249 | rc = percpu_ida_init(&se_sess->sess_tag_pool, tag_num); |
246 | 250 | if (rc < 0) { |
247 | 251 | pr_err("Unable to init se_sess->sess_tag_pool," |
248 | 252 | " tag_num: %u\n", tag_num); |
249 | - kfree(se_sess->sess_cmd_map); | |
253 | + if (is_vmalloc_addr(se_sess->sess_cmd_map)) | |
254 | + vfree(se_sess->sess_cmd_map); | |
255 | + else | |
256 | + kfree(se_sess->sess_cmd_map); | |
250 | 257 | se_sess->sess_cmd_map = NULL; |
251 | 258 | return -ENOMEM; |
252 | 259 | } |
... | ... | @@ -412,7 +419,10 @@ |
412 | 419 | { |
413 | 420 | if (se_sess->sess_cmd_map) { |
414 | 421 | percpu_ida_destroy(&se_sess->sess_tag_pool); |
415 | - kfree(se_sess->sess_cmd_map); | |
422 | + if (is_vmalloc_addr(se_sess->sess_cmd_map)) | |
423 | + vfree(se_sess->sess_cmd_map); | |
424 | + else | |
425 | + kfree(se_sess->sess_cmd_map); | |
416 | 426 | } |
417 | 427 | kmem_cache_free(se_sess_cache, se_sess); |
418 | 428 | } |