diff mbox series

mmc: mxcmmc: "Revert mmc: mxcmmc: handle highmem pages"

Message ID 20190317095825.29862-1-shc_work@mail.ru (mailing list archive)
State New, archived
Headers show
Series mmc: mxcmmc: "Revert mmc: mxcmmc: handle highmem pages" | expand

Commit Message

Alexander Shiyan March 17, 2019, 9:58 a.m. UTC
This reverts commit b189e7589f6d3411e85c6b7ae6eef158f08f388f.

Unable to handle kernel paging request at virtual address c8358000
pgd = efa405c3
[c8358000] *pgd=00000000
Internal error: Oops: 805 [#1] PREEMPT ARM
CPU: 0 PID: 711 Comm: kworker/0:2 Not tainted 4.20.0+ #30
Hardware name: Freescale i.MX27 (Device Tree Support)
Workqueue: events mxcmci_datawork
PC is at mxcmci_datawork+0xbc/0x2ac
LR is at mxcmci_datawork+0xac/0x2ac
pc : [<c04e33c8>]    lr : [<c04e33b8>]    psr: 60000013
sp : c6c93f08  ip : 24004180  fp : 00000008
r10: c8358000  r9 : c78b3e24  r8 : c6c92000
r7 : 00000000  r6 : c7bb8680  r5 : c7bb86d4  r4 : c78b3de0
r3 : 00002502  r2 : c090b2e0  r1 : 00000880  r0 : 00000000
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 0005317f  Table: a68a8000  DAC: 00000055
Process kworker/0:2 (pid: 711, stack limit = 0x389543bc)
Stack: (0xc6c93f08 to 0xc6c94000)
3f00:                   c7bb86d4 00000000 00000000 c6cbfde0 c7bb86d4 c7ee4200
3f20: 00000000 c0907ea8 00000000 c7bb86d8 c0907ea8 c012077c c6cbfde0 c7bb86d4
3f40: c6cbfde0 c6c92000 c6cbfdf4 c09280ba c0907ea8 c090b2e0 c0907ebc c0120c18
3f60: c6cbfde0 00000000 00000000 c6cbb580 c7ba7c40 c7837edc c6cbb598 00000000
3f80: c6cbfde0 c01208f8 00000000 c01254fc c7ba7c40 c0125400 00000000 00000000
3fa0: 00000000 00000000 00000000 c01010d0 00000000 00000000 00000000 00000000
3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[<c04e33c8>] (mxcmci_datawork) from [<c012077c>] (process_one_work+0x1f0/0x338)
[<c012077c>] (process_one_work) from [<c0120c18>] (worker_thread+0x320/0x474)
[<c0120c18>] (worker_thread) from [<c01254fc>] (kthread+0xfc/0x118)
[<c01254fc>] (kthread) from [<c01010d0>] (ret_from_fork+0x14/0x24)
Exception stack(0xc6c93fb0 to 0xc6c93ff8)
3fa0:                                     00000000 00000000 00000000 00000000
3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3fe0: 00000000 00000000 00000000 00000000 00000013 00000000
Code: e3500000 1a000059 e5153050 e5933038 (e48a3004)
---[ end trace 54ca629b75f0e737 ]---
note: kworker/0:2[711] exited with preempt_count 1

Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
---
 drivers/mmc/host/mxcmmc.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

Comments

Ulf Hansson March 21, 2019, 10:46 a.m. UTC | #1
On Sun, 17 Mar 2019 at 10:58, Alexander Shiyan <shc_work@mail.ru> wrote:
>
> This reverts commit b189e7589f6d3411e85c6b7ae6eef158f08f388f.
>
> Unable to handle kernel paging request at virtual address c8358000
> pgd = efa405c3
> [c8358000] *pgd=00000000
> Internal error: Oops: 805 [#1] PREEMPT ARM
> CPU: 0 PID: 711 Comm: kworker/0:2 Not tainted 4.20.0+ #30
> Hardware name: Freescale i.MX27 (Device Tree Support)
> Workqueue: events mxcmci_datawork
> PC is at mxcmci_datawork+0xbc/0x2ac
> LR is at mxcmci_datawork+0xac/0x2ac
> pc : [<c04e33c8>]    lr : [<c04e33b8>]    psr: 60000013
> sp : c6c93f08  ip : 24004180  fp : 00000008
> r10: c8358000  r9 : c78b3e24  r8 : c6c92000
> r7 : 00000000  r6 : c7bb8680  r5 : c7bb86d4  r4 : c78b3de0
> r3 : 00002502  r2 : c090b2e0  r1 : 00000880  r0 : 00000000
> Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
> Control: 0005317f  Table: a68a8000  DAC: 00000055
> Process kworker/0:2 (pid: 711, stack limit = 0x389543bc)
> Stack: (0xc6c93f08 to 0xc6c94000)
> 3f00:                   c7bb86d4 00000000 00000000 c6cbfde0 c7bb86d4 c7ee4200
> 3f20: 00000000 c0907ea8 00000000 c7bb86d8 c0907ea8 c012077c c6cbfde0 c7bb86d4
> 3f40: c6cbfde0 c6c92000 c6cbfdf4 c09280ba c0907ea8 c090b2e0 c0907ebc c0120c18
> 3f60: c6cbfde0 00000000 00000000 c6cbb580 c7ba7c40 c7837edc c6cbb598 00000000
> 3f80: c6cbfde0 c01208f8 00000000 c01254fc c7ba7c40 c0125400 00000000 00000000
> 3fa0: 00000000 00000000 00000000 c01010d0 00000000 00000000 00000000 00000000
> 3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 3fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
> [<c04e33c8>] (mxcmci_datawork) from [<c012077c>] (process_one_work+0x1f0/0x338)
> [<c012077c>] (process_one_work) from [<c0120c18>] (worker_thread+0x320/0x474)
> [<c0120c18>] (worker_thread) from [<c01254fc>] (kthread+0xfc/0x118)
> [<c01254fc>] (kthread) from [<c01010d0>] (ret_from_fork+0x14/0x24)
> Exception stack(0xc6c93fb0 to 0xc6c93ff8)
> 3fa0:                                     00000000 00000000 00000000 00000000
> 3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 3fe0: 00000000 00000000 00000000 00000000 00000013 00000000
> Code: e3500000 1a000059 e5153050 e5933038 (e48a3004)
> ---[ end trace 54ca629b75f0e737 ]---
> note: kworker/0:2[711] exited with preempt_count 1
>
> Signed-off-by: Alexander Shiyan <shc_work@mail.ru>

Applied for fixes and by adding a stable tag, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/host/mxcmmc.c | 16 ++++------------
>  1 file changed, 4 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c
> index 4d17032..7b530e5 100644
> --- a/drivers/mmc/host/mxcmmc.c
> +++ b/drivers/mmc/host/mxcmmc.c
> @@ -292,11 +292,8 @@ static void mxcmci_swap_buffers(struct mmc_data *data)
>         struct scatterlist *sg;
>         int i;
>
> -       for_each_sg(data->sg, sg, data->sg_len, i) {
> -               void *buf = kmap_atomic(sg_page(sg) + sg->offset);
> -               buffer_swap32(buf, sg->length);
> -               kunmap_atomic(buf);
> -       }
> +       for_each_sg(data->sg, sg, data->sg_len, i)
> +               buffer_swap32(sg_virt(sg), sg->length);
>  }
>  #else
>  static inline void mxcmci_swap_buffers(struct mmc_data *data) {}
> @@ -613,7 +610,6 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)
>  {
>         struct mmc_data *data = host->req->data;
>         struct scatterlist *sg;
> -       void *buf;
>         int stat, i;
>
>         host->data = data;
> @@ -621,18 +617,14 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)
>
>         if (data->flags & MMC_DATA_READ) {
>                 for_each_sg(data->sg, sg, data->sg_len, i) {
> -                       buf = kmap_atomic(sg_page(sg) + sg->offset);
> -                       stat = mxcmci_pull(host, buf, sg->length);
> -                       kunmap(buf);
> +                       stat = mxcmci_pull(host, sg_virt(sg), sg->length);
>                         if (stat)
>                                 return stat;
>                         host->datasize += sg->length;
>                 }
>         } else {
>                 for_each_sg(data->sg, sg, data->sg_len, i) {
> -                       buf = kmap_atomic(sg_page(sg) + sg->offset);
> -                       stat = mxcmci_push(host, buf, sg->length);
> -                       kunmap(buf);
> +                       stat = mxcmci_push(host, sg_virt(sg), sg->length);
>                         if (stat)
>                                 return stat;
>                         host->datasize += sg->length;
> --
> 2.10.2
>
diff mbox series

Patch

diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c
index 4d17032..7b530e5 100644
--- a/drivers/mmc/host/mxcmmc.c
+++ b/drivers/mmc/host/mxcmmc.c
@@ -292,11 +292,8 @@  static void mxcmci_swap_buffers(struct mmc_data *data)
 	struct scatterlist *sg;
 	int i;
 
-	for_each_sg(data->sg, sg, data->sg_len, i) {
-		void *buf = kmap_atomic(sg_page(sg) + sg->offset);
-		buffer_swap32(buf, sg->length);
-		kunmap_atomic(buf);
-	}
+	for_each_sg(data->sg, sg, data->sg_len, i)
+		buffer_swap32(sg_virt(sg), sg->length);
 }
 #else
 static inline void mxcmci_swap_buffers(struct mmc_data *data) {}
@@ -613,7 +610,6 @@  static int mxcmci_transfer_data(struct mxcmci_host *host)
 {
 	struct mmc_data *data = host->req->data;
 	struct scatterlist *sg;
-	void *buf;
 	int stat, i;
 
 	host->data = data;
@@ -621,18 +617,14 @@  static int mxcmci_transfer_data(struct mxcmci_host *host)
 
 	if (data->flags & MMC_DATA_READ) {
 		for_each_sg(data->sg, sg, data->sg_len, i) {
-			buf = kmap_atomic(sg_page(sg) + sg->offset);
-			stat = mxcmci_pull(host, buf, sg->length);
-			kunmap(buf);
+			stat = mxcmci_pull(host, sg_virt(sg), sg->length);
 			if (stat)
 				return stat;
 			host->datasize += sg->length;
 		}
 	} else {
 		for_each_sg(data->sg, sg, data->sg_len, i) {
-			buf = kmap_atomic(sg_page(sg) + sg->offset);
-			stat = mxcmci_push(host, buf, sg->length);
-			kunmap(buf);
+			stat = mxcmci_push(host, sg_virt(sg), sg->length);
 			if (stat)
 				return stat;
 			host->datasize += sg->length;