Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: test: reduce stack usage in mmc_test_nonblock_transfer

The new lockdep annotations for completions cause a warning in the
mmc test module, in a function that now has four 150 byte structures
on the stack:

drivers/mmc/core/mmc_test.c: In function 'mmc_test_nonblock_transfer.constprop':
drivers/mmc/core/mmc_test.c:892:1: error: the frame size of 1360 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]

The mmc_test_ongoing_transfer function evidently had a similar problem,
and worked around it by using dynamic allocation.

This generalizes the approach used by mmc_test_ongoing_transfer() and
applies it to mmc_test_nonblock_transfer() as well.

Fixes: cd8084f91c02 ("locking/lockdep: Apply crossrelease to completions")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Arnd Bergmann and committed by
Ulf Hansson
098dc66a 2f3110cc

+41 -56
+41 -56
drivers/mmc/core/mmc_test.c
··· 800 800 return ret; 801 801 } 802 802 803 + struct mmc_test_req { 804 + struct mmc_request mrq; 805 + struct mmc_command sbc; 806 + struct mmc_command cmd; 807 + struct mmc_command stop; 808 + struct mmc_command status; 809 + struct mmc_data data; 810 + }; 811 + 803 812 /* 804 813 * Tests nonblock transfer with certain parameters 805 814 */ 806 - static void mmc_test_nonblock_reset(struct mmc_request *mrq, 807 - struct mmc_command *cmd, 808 - struct mmc_command *stop, 809 - struct mmc_data *data) 815 + static void mmc_test_req_reset(struct mmc_test_req *rq) 810 816 { 811 - memset(mrq, 0, sizeof(struct mmc_request)); 812 - memset(cmd, 0, sizeof(struct mmc_command)); 813 - memset(data, 0, sizeof(struct mmc_data)); 814 - memset(stop, 0, sizeof(struct mmc_command)); 817 + memset(rq, 0, sizeof(struct mmc_test_req)); 815 818 816 - mrq->cmd = cmd; 817 - mrq->data = data; 818 - mrq->stop = stop; 819 + rq->mrq.cmd = &rq->cmd; 820 + rq->mrq.data = &rq->data; 821 + rq->mrq.stop = &rq->stop; 819 822 } 823 + 824 + static struct mmc_test_req *mmc_test_req_alloc(void) 825 + { 826 + struct mmc_test_req *rq = kmalloc(sizeof(*rq), GFP_KERNEL); 827 + 828 + if (rq) 829 + mmc_test_req_reset(rq); 830 + 831 + return rq; 832 + } 833 + 834 + 820 835 static int mmc_test_nonblock_transfer(struct mmc_test_card *test, 821 836 struct scatterlist *sg, unsigned sg_len, 822 837 unsigned dev_addr, unsigned blocks, 823 838 unsigned blksz, int write, int count) 824 839 { 825 - struct mmc_request mrq1; 826 - struct mmc_command cmd1; 827 - struct mmc_command stop1; 828 - struct mmc_data data1; 829 - 830 - struct mmc_request mrq2; 831 - struct mmc_command cmd2; 832 - struct mmc_command stop2; 833 - struct mmc_data data2; 834 - 840 + struct mmc_test_req *rq1, *rq2; 835 841 struct mmc_test_async_req test_areq[2]; 836 842 struct mmc_async_req *done_areq; 837 843 struct mmc_async_req *cur_areq = &test_areq[0].areq; ··· 849 843 test_areq[0].test = test; 850 844 test_areq[1].test = test; 851 845 852 - mmc_test_nonblock_reset(&mrq1, &cmd1, &stop1, &data1); 853 - mmc_test_nonblock_reset(&mrq2, &cmd2, &stop2, &data2); 846 + rq1 = mmc_test_req_alloc(); 847 + rq2 = mmc_test_req_alloc(); 848 + if (!rq1 || !rq2) { 849 + ret = RESULT_FAIL; 850 + goto err; 851 + } 854 852 855 - cur_areq->mrq = &mrq1; 853 + cur_areq->mrq = &rq1->mrq; 856 854 cur_areq->err_check = mmc_test_check_result_async; 857 - other_areq->mrq = &mrq2; 855 + other_areq->mrq = &rq2->mrq; 858 856 other_areq->err_check = mmc_test_check_result_async; 859 857 860 858 for (i = 0; i < count; i++) { ··· 871 861 goto err; 872 862 } 873 863 874 - if (done_areq) { 875 - if (done_areq->mrq == &mrq2) 876 - mmc_test_nonblock_reset(&mrq2, &cmd2, 877 - &stop2, &data2); 878 - else 879 - mmc_test_nonblock_reset(&mrq1, &cmd1, 880 - &stop1, &data1); 881 - } 864 + if (done_areq) 865 + mmc_test_req_reset(container_of(done_areq->mrq, 866 + struct mmc_test_req, mrq)); 867 + 882 868 swap(cur_areq, other_areq); 883 869 dev_addr += blocks; 884 870 } ··· 883 877 if (status != MMC_BLK_SUCCESS) 884 878 ret = RESULT_FAIL; 885 879 886 - return ret; 887 880 err: 881 + kfree(rq1); 882 + kfree(rq2); 888 883 return ret; 889 884 } 890 885 ··· 2334 2327 return RESULT_UNSUP_HOST; 2335 2328 2336 2329 return RESULT_FAIL; 2337 - } 2338 - 2339 - struct mmc_test_req { 2340 - struct mmc_request mrq; 2341 - struct mmc_command sbc; 2342 - struct mmc_command cmd; 2343 - struct mmc_command stop; 2344 - struct mmc_command status; 2345 - struct mmc_data data; 2346 - }; 2347 - 2348 - static struct mmc_test_req *mmc_test_req_alloc(void) 2349 - { 2350 - struct mmc_test_req *rq = kzalloc(sizeof(*rq), GFP_KERNEL); 2351 - 2352 - if (rq) { 2353 - rq->mrq.cmd = &rq->cmd; 2354 - rq->mrq.data = &rq->data; 2355 - rq->mrq.stop = &rq->stop; 2356 - } 2357 - 2358 - return rq; 2359 2330 } 2360 2331 2361 2332 static int mmc_test_send_status(struct mmc_test_card *test,