OSDN Git Service

media: atomisp: isp_mmu: don't use kmem_cache
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 20 May 2020 05:55:45 +0000 (07:55 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 20 May 2020 13:02:58 +0000 (15:02 +0200)
Instead of using it only if system memory is below 2GB,
don't use it at all. The problem is that the code there is not
compatible anymore with modern Kernels:

[  179.552797] virt_to_cache: Object is not a Slab page!
[  179.552821] WARNING: CPU: 0 PID: 1414 at mm/slab.h:475 cache_from_obj+0xab/0xf0
[  179.552824] Modules linked in: ccm(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) ip6table_nat(E) ip6table_mangle(E) ip6table_raw(E) ip6table_security(E) iptable_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) libcrc32c(E) nf_defrag_ipv4(E) iptable_mangle(E) iptable_raw(E) iptable_security(E) ip_set(E) nf_tables(E) nfnetlink(E) ip6table_filter(E) ip6_tables(E) iptable_filter(E) cmac(E) bnep(E) sunrpc(E) vfat(E) fat(E) mei_hdcp(E) snd_soc_sst_cht_bsw_rt5645(E) gpio_keys(E) intel_rapl_msr(E) intel_powerclamp(E) coretemp(E) kvm_intel(E) kvm(E) irqbypass(E) crct10dif_pclmul(E) crc32_pclmul(E) asus_nb_wmi(E) ath10k_pci(E) ghash_clmulni_intel(E) ath10k_core(E) intel_cstate(E) wdat_wdt(E) pcspkr(E) ath(E) mac80211(E) intel_chtdc_ti_pwrbtn(E) joydev(E) btusb(E) btrtl(E) btbcm(E) btintel(E) libarc4(E) bluetooth(E) cfg80211(E) ecdh_generic(E) ecc(E) mei_txe(E) mei(E) lpc_ich(E)
[  179.552887]  hid_sensor_accel_3d(E) hid_sensor_gyro_3d(E) hid_sensor_trigger(E) hid_sensor_iio_common(E) industrialio_triggered_buffer(E) kfifo_buf(E) industrialio(E) atomisp_ov2680(CE) snd_soc_rt5645(E) snd_intel_sst_acpi(E) snd_soc_rl6231(E) snd_intel_sst_core(E) snd_soc_sst_atom_hifi2_platform(E) intel_hid(E) snd_soc_acpi_intel_match(E) spi_pxa2xx_platform(E) snd_soc_acpi(E) snd_soc_core(E) snd_compress(E) dw_dmac(E) snd_hdmi_lpe_audio(E) int3400_thermal(E) int3406_thermal(E) snd_seq(E) acpi_thermal_rel(E) int3403_thermal(E) atomisp(CE) snd_seq_device(E) snd_pcm(E) intel_int0002_vgpio(E) soc_button_array(E) acpi_pad(E) intel_xhci_usb_role_switch(E) snd_timer(E) videobuf_vmalloc(E) videobuf_core(E) snd(E) atomisp_gmin_platform(CE) soundcore(E) videodev(E) processor_thermal_device(E) intel_soc_dts_iosf(E) mc(E) intel_rapl_common(E) int340x_thermal_zone(E) ip_tables(E) hid_sensor_hub(E) intel_ishtp_loader(E) intel_ishtp_hid(E) mmc_block(E) hid_multitouch(E) crc32c_intel(E) i915(E)
[  179.552936]  hid_asus(E) i2c_algo_bit(E) asus_wmi(E) sparse_keymap(E) rfkill(E) drm_kms_helper(E) intel_ish_ipc(E) intel_ishtp(E) drm(E) wmi(E) video(E) i2c_hid(E) pwm_lpss_platform(E) pwm_lpss(E) sdhci_acpi(E) sdhci(E) mmc_core(E) fuse(E)
[  179.552961] CPU: 0 PID: 1414 Comm: v4l2grab Tainted: G         C  EL    5.7.0-rc2+ #42
[  179.552963] Hardware name: ASUSTeK COMPUTER INC. T101HA/T101HA, BIOS T101HA.306 04/23/2019
[  179.552968] RIP: 0010:cache_from_obj+0xab/0xf0
[  179.552973] Code: c3 31 c0 80 3d 1c 38 72 01 00 75 f0 48 c7 c6 20 12 06 9f 48 c7 c7 10 f3 37 9f 48 89 04 24 c6 05 01 38 72 01 01 e8 2c 99 e0 ff <0f> 0b 48 8b 04 24 eb ca 48 8b 57 58 48 8b 48 58 48 c7 c6 30 12 06
[  179.552976] RSP: 0018:ffffaf1f00c3fae0 EFLAGS: 00010282
[  179.552980] RAX: 0000000000000029 RBX: 00000000000003ff RCX: 0000000000000007
[  179.552983] RDX: 00000000fffffff8 RSI: 0000000000000082 RDI: ffff9cb6bbc19cc0
[  179.552985] RBP: 0000000001000000 R08: 00000000000005a4 R09: ffffaf1f00c3f970
[  179.552988] R10: 0000000000000005 R11: 0000000000000000 R12: ffffffffc0713da0
[  179.552991] R13: ffff9cb5a7bb1000 R14: 0000000001000000 R15: ffff9cb5a7bb1000
[  179.552995] FS:  0000000000000000(0000) GS:ffff9cb6bbc00000(0000) knlGS:0000000000000000
[  179.552998] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  179.553000] CR2: 00007fe780544400 CR3: 000000002480a000 CR4: 00000000001006f0
[  179.553003] Call Trace:
[  179.553015]  kmem_cache_free+0x19/0x180
[  179.553070]  mmu_l2_unmap+0xd1/0x100 [atomisp]
[  179.553113]  ? __bo_merge+0x8f/0xa0 [atomisp]
[  179.553155]  mmu_unmap+0xd0/0xf0 [atomisp]
[  179.553198]  hmm_bo_unbind+0x62/0xb0 [atomisp]
[  179.553240]  hmm_free+0x44/0x60 [atomisp]

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/atomisp/include/mmu/isp_mmu.h
drivers/staging/media/atomisp/pci/mmu/isp_mmu.c

index c94df90..d9662c5 100644 (file)
@@ -113,7 +113,6 @@ struct isp_mmu {
        phys_addr_t base_address;
 
        struct mutex pt_mutex;
-       struct kmem_cache *tbl_cache;
 };
 
 /* flags for PDE and PTE */
index 06d907f..8930fd6 100644 (file)
@@ -99,15 +99,8 @@ static phys_addr_t alloc_page_table(struct isp_mmu *mmu)
        phys_addr_t page;
        void *virt;
 
-       /*page table lock may needed here*/
-       /*
-        * The slab allocator(kmem_cache and kmalloc family) doesn't handle
-        * GFP_DMA32 flag, so we have to use buddy allocator.
-        */
-       if (totalram_pages() > (unsigned long)NR_PAGES_2GB)
-               virt = (void *)__get_free_page(GFP_KERNEL | GFP_DMA32);
-       else
-               virt = kmem_cache_zalloc(mmu->tbl_cache, GFP_KERNEL);
+       virt = (void *)__get_free_page(GFP_KERNEL | GFP_DMA32);
+
        if (!virt)
                return (phys_addr_t)NULL_PAGE;
 
@@ -142,10 +135,7 @@ static void free_page_table(struct isp_mmu *mmu, phys_addr_t page)
        set_memory_wb((unsigned long)virt, 1);
 #endif
 
-       if (totalram_pages() > (unsigned long)NR_PAGES_2GB)
-               free_page((unsigned long)virt);
-       else
-               kmem_cache_free(mmu->tbl_cache, virt);
+       free_page((unsigned long)virt);
 }
 
 static void mmu_remap_error(struct isp_mmu *mmu,
@@ -541,12 +531,6 @@ int isp_mmu_init(struct isp_mmu *mmu, struct isp_mmu_client *driver)
 
        mutex_init(&mmu->pt_mutex);
 
-       mmu->tbl_cache = kmem_cache_create("iopte_cache", ISP_PAGE_SIZE,
-                                          ISP_PAGE_SIZE, SLAB_HWCACHE_ALIGN,
-                                          NULL);
-       if (!mmu->tbl_cache)
-               return -ENOMEM;
-
        return 0;
 }
 
@@ -579,6 +563,4 @@ void isp_mmu_exit(struct isp_mmu *mmu)
        }
 
        free_page_table(mmu, l1_pt);
-
-       kmem_cache_destroy(mmu->tbl_cache);
 }