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>
phys_addr_t base_address;
struct mutex pt_mutex;
- struct kmem_cache *tbl_cache;
};
/* flags for PDE and PTE */
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;
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,
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;
}
}
free_page_table(mmu, l1_pt);
-
- kmem_cache_destroy(mmu->tbl_cache);
}