Thread (8 messages) 8 messages, 5 authors, 2022-05-23

Re: [PATCH v2 6/8] arm64: Import latest memcpy()/memmove() implementation

From: Neil Armstrong <hidden>
Date: 2021-06-08 12:47:24
Also in: linux-arm-kernel

Hi,

On 08/06/2021 14:21, Marek Szyprowski wrote:
+ Kevin

On 08.06.2021 13:37, Robin Murphy wrote:
quoted
Hi Marek,

On 2021-06-08 12:15, Marek Szyprowski wrote:
quoted
Hi Robin,

On 27.05.2021 17:34, Robin Murphy wrote:
quoted
Import the latest implementation of memcpy(), based on the
upstream code of string/aarch64/memcpy.S at commit afd6244 from
https://protect2.fireeye.com/v1/url?k=0e25d630-51beef28-0e245d7f-0cc47a314e9a-b41fdb2d4d06ff75&q=1&e=fcfaf71d-f01a-4bc4-8e16-8ae86e0c0116&u=https%3A%2F%2Fgithub.com%2FARM-software%2Foptimized-routines, 
and subsuming
memmove() in the process.

Note that for simplicity Arm have chosen to contribute this code
to Linux under GPLv2 rather than the original MIT license.

Note also that the needs of the usercopy routines vs. regular memcpy()
have now diverged so far that we abandon the shared template idea
and the damage which that incurred to the tuning of LDP/STP loops.
We'll be back to tackle those routines separately in future.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
This patch landed recently in linux-next as commit 285133040e6c ("arm64:
Import latest memcpy()/memmove() implementation"). Sadly it causes
serious issues on Khadas VIM3 board. Reverting it on top of linux
next-20210607 (together with 6b8f648959e5 and resolving the conflict in
the Makefile) fixes the issue. Here is the kernel log:

Unable to handle kernel paging request at virtual address 
ffff8000136bd204
Mem abort info:
    ESR = 0x96000061
    EC = 0x25: DABT (current EL), IL = 32 bits
    SET = 0, FnV = 0
    EA = 0, S1PTW = 0
Data abort info:
    ISV = 0, ISS = 0x00000061
That's an alignment fault, which implies we're accessing something 
which isn't normal memory.
quoted
    CM = 0, WnR = 1
swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000009da6000
[ffff8000136bd204] pgd=10000000f4806003, p4d=10000000f4806003,
pud=10000000f4805003, pmd=1000000000365003, pte=00680000ffe03713
Internal error: Oops: 96000061 [#1] PREEMPT SMP
Modules linked in: brcmfmac brcmutil cfg80211 dw_hdmi_i2s_audio
meson_gxl hci_uart btqca btbcm bluetooth panfrost ecdh_generic ecc
snd_soc_meson_axg_sound_card crct10dif_ce snd_soc_meson_card_utils
rfkill rtc_hym8563 gpu_sched dwmac_generic rc_khadas meson_gxbb_wdt
meson_ir pwm_meson snd_soc_meson_axg_tdmin snd_soc_meson_g12a_tohdmitx
rtc_meson_vrtc snd_soc_meson_axg_tdmout snd_soc_meson_axg_frddr
reset_meson_audio_arb snd_soc_meson_codec_glue axg_audio meson_rng
sclk_div dwmac_meson8b snd_soc_meson_axg_toddr mdio_mux_meson_g12a
clk_phase stmmac_platform rng_core snd_soc_meson_axg_fifo meson_dw_hdmi
stmmac meson_drm meson_canvas dw_hdmi pcs_xpcs display_connector
snd_soc_meson_axg_tdm_interface nvmem_meson_efuse adc_keys
snd_soc_meson_axg_tdm_formatter
CPU: 4 PID: 135 Comm: kworker/4:3 Not tainted 5.13.0-rc5-next-20210607
#10441
Hardware name: Khadas VIM3 (DT)
Workqueue: events request_firmware_work_func
pstate: 20000005 (nzCv daif -PAN -UAO -TCO BTYPE=--)
pc : __memcpy+0x2c/0x260
lr : sg_copy_buffer+0x90/0x118
...
Call trace:
   __memcpy+0x2c/0x260
   sg_copy_to_buffer+0x14/0x20
   meson_mmc_start_cmd+0xf4/0x2c8
   meson_mmc_request+0x4c/0xb8
   __mmc_start_request+0xa4/0x2a8
   mmc_start_request+0x80/0xa8
   mmc_wait_for_req+0x68/0xd8
   mmc_io_rw_extended+0x1d4/0x2e0
   sdio_io_rw_ext_helper+0xb0/0x1e8
   sdio_memcpy_toio+0x20/0x28
   brcmf_sdiod_skbuff_write.isra.18+0x2c/0x68 [brcmfmac]
   brcmf_sdiod_ramrw+0xe0/0x230 [brcmfmac]
   brcmf_sdio_firmware_callback+0xa8/0x7c8 [brcmfmac]
   brcmf_fw_request_done+0x7c/0x100 [brcmfmac]
   request_firmware_work_func+0x4c/0xd8
   process_one_work+0x2a8/0x718
   worker_thread+0x48/0x460
   kthread+0x12c/0x160
   ret_from_fork+0x10/0x18
Code: 540000c3 a9401c26 a97f348c a9001c06 (a93f34ac)
---[ end trace be83fa283dc82415 ]---

I hope that the above log helps fixing the issue. IIRC the SDHCI driver
on VIM3 board uses internal SRAM for transferring data (instead of DMA),
so the issue is somehow related to that.
Drivers shouldn't be using memcpy() on iomem mappings. Even if they 
happen to have got away with it sometimes ;)

Taking a quick look at that driver,

    host->bounce_buf = host->regs + SD_EMMC_SRAM_DATA_BUF_OFF;

is completely bogus, as Sparse will readily point out.
My bad, what's the correct way to copy data to an iomem mapping ?

Neil
quoted
Robin.
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help