GithubHelp home page GithubHelp logo

hakavlad / le9-patch Goto Github PK

View Code? Open in Web Editor NEW
183.0 13.0 9.0 158 KB

[PATCH] mm: Protect the working set under memory pressure to prevent thrashing, avoid high latency and prevent livelock in near-OOM conditions

License: Creative Commons Zero v1.0 Universal

oom out-of-memory kernel patch

le9-patch's Introduction

pic

Add sysctl knobs for protecting the working set

Protection of clean file pages (page cache) may be used to prevent thrashing, reducing I/O under memory pressure, avoid high latency and prevent livelock in near-OOM conditions. The current le9 patches are based on patches that were originally created by Mandeep Singh Baines (2010) and Marcus Linsner (2018-2019). Let's give the floor to the original founders:

On ChromiumOS, we do not use swap. When memory is low, the only way to free memory is to reclaim pages from the file list. This results in a lot of thrashing under low memory conditions. We see the system become unresponsive for minutes before it eventually OOMs. We also see very slow browser tab switching under low memory. Instead of an unresponsive system, we'd really like the kernel to OOM as soon as it starts to thrash. If it can't keep the working set in memory, then OOM. Losing one of many tabs is a better behaviour for the user than an unresponsive system.

This patch create a new sysctl, min_filelist_kbytes, which disables reclaim of file-backed pages when when there are less than min_filelist_bytes worth of such pages in the cache. This tunable is handy for low memory systems using solid-state storage where interactive response is more important than not OOMing.

With this patch and min_filelist_kbytes set to 50000, I see very little block layer activity during low memory. The system stays responsive under low memory and browser tab switching is fast. Eventually, a process a gets killed by OOM. Without this patch, the system gets wedged for minutes before it eventually OOMs.

https://lore.kernel.org/lkml/[email protected]/

The attached kernel patch (applied on top of 4.18.5) that I've tried, almost completely eliminates the disk thrashing (the constant reading of executable (and .so) files on every context switch) associated with freezing the OS and so, with this patch, the OOM-killer is triggered within a maximum of 1 second when it is needed, rather than, without this patch, freeze the OS for minutes (or just a long time, it may even auto reboot depending on your kernel .config options set to panic (reboot) on hang after xx seconds) with constant disk reading well before OOM-killer gets triggered.

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/159356/comments/89

Original le9 patches (by Marcus Linsner) protected active file pages. Current versions (le9ec) allow to protect the specified amount of clean file pages and anonymous pages.

le9ec patch

The kernel does not provide a way to protect the working set under memory pressure. A certain amount of anonymous and clean file pages is required by the userspace for normal operation. First of all, the userspace needs a cache of shared libraries and executable binaries. If the amount of the clean file pages falls below a certain level, then thrashing and even livelock can take place.

The patch provides sysctl knobs for protecting the working set (anonymous and clean file pages) under memory pressure.

The vm.anon_min_kbytes sysctl knob provides hard protection of anonymous pages. The anonymous pages on the current node won't be reclaimed under any conditions when their amount is below vm.anon_min_kbytes. This knob may be used to prevent excessive swap thrashing when anonymous memory is low (for example, when memory is going to be overfilled by compressed data of zram module).

The vm.clean_low_kbytes sysctl knob provides best-effort protection of clean file pages. The file pages on the current node won't be reclaimed under memory pressure when the amount of clean file pages is below vm.clean_low_kbytes unless we threaten to OOM. Protection of clean file pages using this knob may be used when swapping is still possible to

  • prevent disk I/O thrashing under memory pressure;
  • improve performance in disk cache-bound tasks under memory pressure.

The vm.clean_min_kbytes sysctl knob provides hard protection of clean file pages. The file pages on the current node won't be reclaimed under memory pressure when the amount of clean file pages is below vm.clean_min_kbytes. Hard protection of clean file pages using this knob may be used to

  • prevent disk I/O thrashing under memory pressure even with no free swap space;
  • improve performance in disk cache-bound tasks under memory pressure;
  • avoid high latency and prevent livelock in near-OOM conditions.

le9ec patches provide three sysctl knobs (vm.anon_min_kbytes, vm.clean_low_kbytes, vm.clean_min_kbytes) with zero values and does not protect the working set by default (CONFIG_ANON_MIN_KBYTES=0, CONFIG_CLEAN_LOW_KBYTES=0, CONFIG_CLEAN_MIN_KBYTES=0). You can specify other values during kernel build, or change the knob values on the fly.

  • le9ec-4.9.patch may be correctly applied to vanilla Linux 4.9;
  • le9ec-4.14.patch may be correctly applied to vanilla Linux 4.14;
  • le9ec-4.19.patch may be correctly applied to vanilla Linux 4.19;
  • le9ec-5.4.patch may be correctly applied to vanilla Linux 5.4;
  • le9ec-5.10.patch may be correctly applied to vanilla Linux 5.10—5.13;
  • le9ec-5.13-rc2-MGLRU.patch may be correctly applied to Linux 5.13 with mgLRU patchset v3 applied;
  • le9ec-5.14-rc6-MGLRU.patch may be correctly applied to Linux 5.14 with mgLRU patchset v4 applied;
  • le9ec-5.14.patch may be correctly applied to vanilla Linux 5.14;
  • le9ec-5.15.patch may be correctly applied to vanilla Linux 5.15—5.19;
  • le9ec-5.15-MGLRU.patch may be correctly applied to Linux 5.15 with mgLRU patchset v5 applied and may be correctly applied to Linux 5.16-rc8 with mgLRU patchset v6 applied.

Effects

  • Improving system responsiveness under low-memory conditions;
  • Improving performance in I/O bound tasks under memory pressure;
  • OOM killer comes faster (with hard protection);
  • Fast system reclaiming after OOM (with hard protection).

Note that the effects depend on the values of the sysctl tunables.

Testing

These tools may be used to monitor memory and PSI metrics during stress tests:

  • mem2log may be used to log memory metrics from /proc/meminfo;
  • psi2log from nohang package may be used to log PSI metrics during stress tests.

Please report your results here.

Demo

  • https://youtu.be/iU3ikgNgp3M - The Linux (with le9 patch) kernel's ability to gracefully handle memory pressure. Boot with mem=4G, no swap space, opening chromium tabs, no hangs. The killer comes without delay. This is how le9 patch fixes the problem described here.
  • https://youtu.be/c5bAOJkX_uc - Linux 5.9 + le9i-5.9.patch, playing supertuxkart with 7 threads while true; do tail /dev/zero; done in background. vm.unevictable_activefile_kbytes=1000000, vm.unevictable_inactivefile_kbytes=0.
  • https://youtu.be/d4Sc80TMEtA - webkit2gtk3 compilation with zram-fraction=1, max-zram-size=8192. No hangs, no heavily freezes, system was responsive for all time during webkit2gtk3 compilation.
  • https://youtu.be/ZrLqUWRodh4 - Debian 11 on VM, Linux 5.14 with le9ec patch, no swap space, playing SuperTux while 1000 tail /dev/zero started simultaneously:
    • No freezes with vm.clean_min_kbytes=300000, I/O pressure was closed to zero, memory pressure was moderate (70-80 some, 12-17 full), all tail processes has been killed in 2 minutes (0:06 - 2:14), it's about 8 processes reaped by oom_reaper per second;
    • Complete UI freeze without the working set protection (since 3:40).
  • https://youtu.be/tsnA6Mx-MpQ - 5.14.3.le9fd, for i in {1..100}; do (tail /dev/zero &); done, swap on zram, MemTotal = SwapTotal = 9.6 GiB.
  • https://youtu.be/1ZwzjxCHFyc - 5.14.2.le9fa, playing SuperTuxKart, 8 terminal emulator windows with while true; do tail /dev/zero; done, no swap space, vm.clean_min_kbytes=260000, low memory and I/O pressure, no UI freeze. The userspace daemon (nohang) running in the background just checks kmsg for OOM events and sends GUI notifications.

Warning

  • These patches were written by an amateur. Use at your own risk.

Review at LKML

What about non-x86?

No data. Testing is encouraged. Please report your results here.

le9 and Multigenerational LRU Framework

  • le9 modifies get_scan_count() to protect the working set.
  • Multigenerational LRU doesn't use get_scan_count().
  • Enabling multi-generational LRU disables le9 effects.
  • vm.anon_min_kbytes, vm.clean_low_kbytes and vm.clean_min_kbytes have no effect when mg-LRU is enabled.
  • mg-lru-helper can be used to easily manage mg-LRU (enable, disable, get status).

User feedback

See USER_FEEDBACK.md.

Resources

See RESOURCES.md.

le9-patch's People

Contributors

hakavlad avatar ikem-krueger avatar tim77 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

le9-patch's Issues

Applying the patch

So, this laptop (not exactly sure how old it is, but it was running XP and system BIOS said it was 2004) I have the 32-bit version installed on it. The kernel version is 4.19 so using the "patch" command I tried to run the patch file. The command line after several minuets still would not print anything. Should I have used some flags?

[DRM/i915] page allocation failure

[  781.479437] [   1402]  1000  1402     5919      449    90112     1019             0 bash
[  781.479439] [   1415]  1000  1415    11131     2623   131072        0             0 python3
[  781.479441] [   1419]  1000  1419     5919      432    86016     1019             0 bash
[  781.479443] [   1425]  1000  1425    11147     2592   131072        0             0 python3
[  781.479445] [   1790]  1000  1790     5967      623    81920     1019             0 bash
[  781.479446] [   1826]     0  1826    49080     2804   155648        0             0 python3
[  781.479448] [   1829]  1000  1829    12145     1483   135168     1220             0 python3
[  781.479450] [   1830]  1000  1830   531268    12481  4292608   507558             0 python3
[  781.479452] [   1831]  1000  1831   513156    19383  4112384   478025             0 python3
[  781.479454] [   1832]  1000  1832   518084    18190  4161536   485420             0 python3
[  781.479456] [   1833]  1000  1833   513924    15207  4120576   483255             0 python3
[  781.479458] [   1834]  1000  1834   519236    16634  4173824   488360             0 python3
[  781.479460] [   1835]  1000  1835   529668    13015  4276224   504979             0 python3
[  781.479462] [   1836]  1000  1836   518916    13501  4165632   491099             0 python3
[  781.479464] [   1837]  1000  1837   513668    15524  4116480   482544             0 python3
[  781.479465] [   1838]  1000  1838   515780    14523  4136960   486183             0 python3
[  781.479467] [   1839]  1000  1839   550034    18410  4362240   508875             0 python3
[  781.479470] [   1840]  1000  1840   516356    16444  4141056   484960             0 python3
[  781.479472] [   1841]  1000  1841   520656    26618  4186112   480134             0 python3
[  781.479473] [   1842]  1000  1842   522053    10847  4202496   497653             0 python3
[  781.479475] [   1843]  1000  1843   499653    18181  3977216   462469             0 python3
[  781.479477] [   1844]  1000  1844   503813    17015  4018176   468781             0 python3
[  781.479480] [   1851]     0  1851    14409      782   155648      117             0 sudo
[  781.479482] [   1852]  1000  1852    49217     1062   147456       85             0 notify-send
[  781.479483] [   1856]  1000  1856   106425     5773   454656      210             0 mate-notificati
[  781.479485] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-4.scope,task=python3,pid=1839,uid=1000
[  781.479500] Out of memory: Killed process 1839 (python3) total-vm:2200136kB, anon-rss:69788kB, file-rss:3852kB, shmem-rss:0kB, UID:1000 pgtables:4260kB oom_score_adj:0
[  781.483760] Xorg: page allocation failure: order:0, mode:0x104cd2(GFP_HIGHUSER|__GFP_RETRY_MAYFAIL|__GFP_RECLAIMABLE), nodemask=(null),cpuset=/,mems_allowed=0
[  781.483768] CPU: 3 PID: 1055 Comm: Xorg Not tainted 5.10.54.le9ea #1
[  781.483769] Hardware name: Acer VAG70_HC/VAG70, BIOS V2.16 01/14/2013
[  781.483770] Call Trace:
[  781.483778]  dump_stack+0x6d/0x88
[  781.483782]  warn_alloc+0xfb/0x160
[  781.483785]  __alloc_pages_slowpath.constprop.107+0xc29/0xd30
[  781.483789]  __alloc_pages_nodemask+0x29b/0x300
[  781.483793]  alloc_pages_vma+0x7c/0x1f0
[  781.483797]  shmem_alloc_page+0x47/0x90
[  781.483801]  shmem_alloc_and_acct_page+0x7a/0x1e0
[  781.483804]  shmem_getpage_gfp+0x17d/0x8a0
[  781.483807]  shmem_read_mapping_page_gfp+0x42/0x80
[  781.483811]  ? _cond_resched+0x16/0x40
[  781.483858]  shmem_get_pages+0x1cb/0x5e0 [i915]
[  781.483864]  ? enqueue_entity+0x114/0x6a0
[  781.483867]  ? enqueue_task_fair+0x109/0x6d0
[  781.483869]  ? psi_task_change+0x90/0xe0
[  781.483905]  __i915_gem_object_get_pages+0x53/0x60 [i915]
[  781.483944]  i915_vma_pin_ww+0x4e5/0x8d0 [i915]
[  781.483948]  ? kmem_cache_alloc+0x3d5/0x7d0
[  781.483952]  ? __mod_memcg_lruvec_state+0x1c/0xe0
[  781.483986]  eb_validate_vmas+0x94/0x700 [i915]
[  781.483990]  ? mutex_lock_interruptible+0xe/0x30
[  781.484023]  i915_gem_do_execbuffer+0x1029/0x1ec0 [i915]
[  781.484030]  ? unix_stream_sendmsg+0x380/0x400
[  781.484063]  i915_gem_execbuffer2_ioctl+0xea/0x200 [i915]
[  781.484095]  ? i915_gem_execbuffer_ioctl+0x2d0/0x2d0 [i915]
[  781.484119]  drm_ioctl_kernel+0xae/0xf0 [drm]
[  781.484135]  drm_ioctl+0x234/0x400 [drm]
[  781.484168]  ? i915_gem_execbuffer_ioctl+0x2d0/0x2d0 [i915]
[  781.484172]  __x64_sys_ioctl+0x8e/0xd0
[  781.484175]  do_syscall_64+0x33/0x80
[  781.484178]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
[  781.484180] RIP: 0033:0x7f77a301c017
[  781.484183] Code: 00 00 00 48 8b 05 81 7e 2b 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 51 7e 2b 00 f7 d8 64 89 01 48
[  781.484184] RSP: 002b:00007ffd84d6ff78 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
[  781.484186] RAX: ffffffffffffffda RBX: 00005556bba7daf0 RCX: 00007f77a301c017
[  781.484188] RDX: 00007ffd84d6ffc0 RSI: 0000000040406469 RDI: 000000000000000e
[  781.484189] RBP: 00007ffd84d6ffc0 R08: 0000000000000000 R09: 0000000000000000
[  781.484190] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000040406469
[  781.484191] R13: 000000000000000e R14: 00005556bbbc8a40 R15: 0000000000000b70
[  781.484193] Mem-Info:
[  781.484198] active_anon:8012 inactive_anon:238493 isolated_anon:216
                active_file:6767 inactive_file:22606 isolated_file:0
                unevictable:13827 dirty:431 writeback:0
                slab_reclaimable:23169 slab_unreclaimable:49009
                mapped:20503 shmem:14112 pagetables:19969 bounce:0
                free:49765 free_pcp:1029 free_cma:0
[  781.484201] Node 0 active_anon:32048kB inactive_anon:953972kB active_file:27068kB inactive_file:90424kB unevictable:55308kB isolated(anon):864kB isolated(file):0kB mapped:82012kB dirty:1724kB writeback:0kB shmem:56448kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB kernel_stack:5504kB all_unreclaimable? no
[  781.484203] Node 0 DMA free:15900kB min:108kB low:132kB high:156kB reserved_highatomic:0KB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15984kB managed:15900kB mlocked:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[  781.484206] lowmem_reserve[]: 0 2308 9768 9768 9768
[  781.484210] Node 0 DMA32 free:75488kB min:46144kB low:49692kB high:53240kB reserved_highatomic:0KB active_anon:13376kB inactive_anon:630344kB active_file:4496kB inactive_file:11440kB unevictable:4608kB writepending:160kB present:2429692kB managed:2364156kB mlocked:436kB pagetables:20080kB bounce:0kB free_pcp:2312kB local_pcp:248kB free_cma:0kB
[  781.484215] lowmem_reserve[]: 0 0 7459 7459 7459
[  781.484219] Node 0 Normal free:107672kB min:173116kB low:186432kB high:199748kB reserved_highatomic:0KB active_anon:18908kB inactive_anon:322772kB active_file:22548kB inactive_file:79656kB unevictable:50148kB writepending:1564kB present:7854080kB managed:7638316kB mlocked:21784kB pagetables:59796kB bounce:0kB free_pcp:1800kB local_pcp:152kB free_cma:0kB
[  781.484223] lowmem_reserve[]: 0 0 0 0 0
[  781.484227] Node 0 DMA: 1*4kB (U) 1*8kB (U) 1*16kB (U) 0*32kB 2*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (M) 3*4096kB (M) = 15900kB
[  781.484243] Node 0 DMA32: 1*4kB (M) 431*8kB (ME) 2852*16kB (ME) 803*32kB (UME) 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 74780kB
[  781.484256] Node 0 Normal: 206*4kB (UME) 746*8kB (UME) 2706*16kB (UME) 1827*32kB (UM) 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 108552kB
[  781.484268] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
[  781.484269] 45562 total pagecache pages
[  781.484279] 636 pages in swap cache
[  781.484280] Swap cache stats: add 30438186, delete 30388222, find 27556/98056
[  781.484281] Free swap  = 30633868kB
[  781.484282] Total swap = 60110228kB
[  781.484283] 2574939 pages RAM
[  781.484284] 0 pages HighMem/MovableOnly
[  781.484285] 70346 pages reserved
[  781.484285] 0 pages hwpoisoned
[  781.486854] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.492055] Purging GPU memory, 0 pages freed, 0 pages still pinned, 4418 pages left available.
[  781.493655] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.494807] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.496171] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.496285] Purging GPU memory, 0 pages freed, 0 pages still pinned, 8837 pages left available.
[  781.497660] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.499793] Purging GPU memory, 0 pages freed, 0 pages still pinned, 8238 pages left available.
[  781.517599] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.518344] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.519570] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.530424] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10918 pages left available.
[  781.532679] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10918 pages left available.
[  781.533290] Purging GPU memory, 0 pages freed, 0 pages still pinned, 8318 pages left available.
[  781.545048] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10918 pages left available.
[  781.549155] Purging GPU memory, 0 pages freed, 0 pages still pinned, 5894 pages left available.
[  781.549834] Purging GPU memory, 0 pages freed, 0 pages still pinned, 138 pages left available.
[  781.570694] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.575322] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.576649] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.577304] Purging GPU memory, 0 pages freed, 0 pages still pinned, 2272 pages left available.
[  781.589137] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.609470] Purging GPU memory, 0 pages freed, 0 pages still pinned, 4418 pages left available.
[  781.617020] Purging GPU memory, 0 pages freed, 0 pages still pinned, 6181 pages left available.
[  781.621610] Purging GPU memory, 0 pages freed, 0 pages still pinned, 5857 pages left available.
[  781.688243] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.691502] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  781.699123] Purging GPU memory, 0 pages freed, 0 pages still pinned, 10382 pages left available.
[  782.206883] oom_reaper: reaped process 1839 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
[  784.374279] nouveau 0000:01:00.0: Enabling HDA controller
[  803.081869] nouveau 0000:01:00.0: Enabling HDA controller

Testing

Put here your results and experience.

[DRM/i915] fatal IO error 11 (Resource temporarily unavailable)

Debian 10, 5.10.8+le9, active_file_reserve_hard_kbytes=250000, noswap.

Jan 18 10:26:06 user-pc kernel: [   1283]  1000  1283   600631     5402   507904       38             0 Web Content
Jan 18 10:26:06 user-pc kernel: [   1331]  1000  1331   130604    11032   319488        0             0 pluma
Jan 18 10:26:06 user-pc kernel: [   1388]  1000  1388  1641501  1640587 13197312        0             0 tail
Jan 18 10:26:06 user-pc kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-3.scope,task=tail,pid=1388,uid=1000
Jan 18 10:26:06 user-pc kernel: Out of memory: Killed process 1388 (tail) total-vm:6566004kB, anon-rss:6560640kB, file-rss:1708kB, shmem-rss:0kB, UID:1000 pgtables:12888kB oom_score_adj:0
Jan 18 10:26:06 user-pc kernel: Xorg: page allocation failure: order:0, mode:0x104cd2(GFP_HIGHUSER|__GFP_RETRY_MAYFAIL|__GFP_RECLAIMABLE), nodemask=(null),cpuset=/,mems_allowed=0
Jan 18 10:26:06 user-pc kernel: CPU: 1 PID: 618 Comm: Xorg Tainted: G        W   E     5.10.8 #1
Jan 18 10:26:06 user-pc kernel: Hardware name: ASUSTeK COMPUTER INC. X550LN/X550LN, BIOS X550LN.301 04/14/2014
Jan 18 10:26:06 user-pc kernel: Call Trace:
Jan 18 10:26:06 user-pc kernel:  dump_stack+0x6d/0x88
Jan 18 10:26:06 user-pc kernel:  warn_alloc.cold.118+0x78/0xda
Jan 18 10:26:06 user-pc kernel:  __alloc_pages_slowpath.constprop.109+0xbe1/0xc10
Jan 18 10:26:06 user-pc kernel:  __alloc_pages_nodemask+0x2cc/0x300
Jan 18 10:26:06 user-pc kernel:  alloc_pages_vma+0x74/0x1e0
Jan 18 10:26:06 user-pc kernel:  shmem_alloc_page+0x47/0x90
Jan 18 10:26:06 user-pc kernel:  shmem_alloc_and_acct_page+0x76/0x1c0
Jan 18 10:26:06 user-pc kernel:  shmem_getpage_gfp+0x171/0x8a0
Jan 18 10:26:06 user-pc kernel:  shmem_read_mapping_page_gfp+0x42/0x80
Jan 18 10:26:06 user-pc kernel:  shmem_get_pages+0x166/0x5f0 [i915]
Jan 18 10:26:06 user-pc kernel:  ? recalibrate_cpu_khz+0x10/0x10
Jan 18 10:26:06 user-pc kernel:  ? ktime_get_mono_fast_ns+0x53/0xb0
Jan 18 10:26:06 user-pc kernel:  ? i915_gem_object_set_tiling+0x1f0/0x4e0 [i915]
Jan 18 10:26:06 user-pc kernel:  __i915_gem_object_get_pages+0x53/0x60 [i915]
Jan 18 10:26:06 user-pc kernel:  i915_gem_set_domain_ioctl+0x201/0x260 [i915]
Jan 18 10:26:06 user-pc kernel:  ? i915_gem_object_set_to_cpu_domain+0xa0/0xa0 [i915]
Jan 18 10:26:06 user-pc kernel:  drm_ioctl_kernel+0xac/0xf0 [drm]
Jan 18 10:26:06 user-pc kernel:  drm_ioctl+0x211/0x3c0 [drm]
Jan 18 10:26:06 user-pc kernel:  ? i915_gem_object_set_to_cpu_domain+0xa0/0xa0 [i915]
Jan 18 10:26:06 user-pc kernel:  ? __do_munmap+0x34c/0x4d0
Jan 18 10:26:06 user-pc kernel:  __x64_sys_ioctl+0x84/0xc0
Jan 18 10:26:06 user-pc kernel:  do_syscall_64+0x33/0x80
Jan 18 10:26:06 user-pc kernel:  entry_SYSCALL_64_after_hwframe+0x44/0xa9
Jan 18 10:26:06 user-pc kernel: RIP: 0033:0x7f3f04358427
Jan 18 10:26:06 user-pc kernel: Code: 00 00 90 48 8b 05 69 aa 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 39 aa 0c 00 f7 d8 64 89 01 48
Jan 18 10:26:06 user-pc kernel: RSP: 002b:00007ffcb14ee498 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
Jan 18 10:26:06 user-pc kernel: RAX: ffffffffffffffda RBX: 000055919a9bcd50 RCX: 00007f3f04358427
Jan 18 10:26:06 user-pc kernel: RDX: 00007ffcb14ee514 RSI: 00000000400c645f RDI: 000000000000000e
Jan 18 10:26:06 user-pc kernel: RBP: 00007ffcb14ee514 R08: 000055919b6d86d0 R09: 0000000000000007
Jan 18 10:26:06 user-pc kernel: R10: 000055919a95a010 R11: 0000000000000246 R12: 00000000400c645f
Jan 18 10:26:06 user-pc kernel: R13: 000000000000000e R14: 000055919a9bcce0 R15: 000055919b6d86d0
Jan 18 10:26:06 user-pc kernel: Mem-Info:
Jan 18 10:26:06 user-pc kernel: active_anon:35842 inactive_anon:1768137 isolated_anon:0
                                 active_file:15974 inactive_file:38 isolated_file:0
                                 unevictable:3922 dirty:0 writeback:0
                                 slab_reclaimable:6290 slab_unreclaimable:12703
                                 mapped:19493 shmem:35646 pagetables:6254 bounce:0
                                 free:25353 free_pcp:911 free_cma:0
Jan 18 10:26:06 user-pc kernel: Node 0 active_anon:143368kB inactive_anon:7072548kB active_file:63896kB inactive_file:152kB unevictable:15688kB isolated(anon):0kB isolated(file):0kB mapped:77972kB dirty:0kB writeback:0kB shmem:142584kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 20480kB writeback_tmp:0kB kernel_stack:7088kB all_unreclaimable? no
Jan 18 10:26:06 user-pc kernel: Node 0 DMA free:15876kB min:156kB low:192kB high:228kB reserved_highatomic:0KB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15988kB managed:15888kB mlocked:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
Jan 18 10:26:06 user-pc kernel: lowmem_reserve[]: 0 2008 6699 6699 6699
Jan 18 10:26:06 user-pc kernel: Node 0 DMA32 free:38520kB min:20216kB low:25268kB high:30320kB reserved_highatomic:0KB active_anon:49156kB inactive_anon:2647980kB active_file:17352kB inactive_file:464kB unevictable:1688kB writepending:0kB present:2828112kB managed:2762576kB mlocked:0kB pagetables:5148kB bounce:0kB free_pcp:1156kB local_pcp:88kB free_cma:0kB
Jan 18 10:26:06 user-pc kernel: lowmem_reserve[]: 0 0 4690 4690 4690
Jan 18 10:26:06 user-pc kernel: Node 0 Normal free:47016kB min:47208kB low:59008kB high:70808kB reserved_highatomic:0KB active_anon:94212kB inactive_anon:4424940kB active_file:46236kB inactive_file:772kB unevictable:13956kB writepending:0kB present:4966400kB managed:4807108kB mlocked:32kB pagetables:19868kB bounce:0kB free_pcp:2484kB local_pcp:196kB free_cma:0kB
Jan 18 10:26:06 user-pc kernel: lowmem_reserve[]: 0 0 0 0 0
Jan 18 10:26:06 user-pc kernel: Node 0 DMA: 1*4kB (U) 2*8kB (U) 3*16kB (U) 0*32kB 3*64kB (U) 2*128kB (U) 0*256kB 0*512kB 1*1024kB (U) 1*2048kB (M) 3*4096kB (M) = 15876kB
Jan 18 10:26:06 user-pc kernel: Node 0 DMA32: 2*4kB (ME) 12*8kB (UE) 17*16kB (UME) 113*32kB (UE) 70*64kB (UE) 52*128kB (UME) 18*256kB (UE) 5*512kB (UE) 0*1024kB 2*2048kB (UE) 3*4096kB (M) = 38680kB
Jan 18 10:26:06 user-pc kernel: Node 0 Normal: 200*4kB (UM) 17*8kB (UME) 263*16kB (UE) 141*32kB (UE) 101*64kB (UE) 74*128kB (UE) 26*256kB (UME) 18*512kB (UME) 5*1024kB (ME) 0*2048kB 0*4096kB = 46584kB
Jan 18 10:26:06 user-pc kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB
Jan 18 10:26:06 user-pc kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
Jan 18 10:26:06 user-pc kernel: 51655 total pagecache pages
Jan 18 10:26:06 user-pc kernel: 0 pages in swap cache
Jan 18 10:26:06 user-pc kernel: Swap cache stats: add 6336828, delete 6348096, find 132748/209321
Jan 18 10:26:06 user-pc kernel: Free swap  = 0kB
Jan 18 10:26:06 user-pc kernel: Total swap = 0kB
Jan 18 10:26:06 user-pc kernel: 1952625 pages RAM
Jan 18 10:26:06 user-pc kernel: 0 pages HighMem/MovableOnly
Jan 18 10:26:06 user-pc kernel: 56232 pages reserved
Jan 18 10:26:06 user-pc kernel: 0 pages hwpoisoned
Jan 18 10:26:06 user-pc notification-ar[985]: notification-area-applet: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
Jan 18 10:26:06 user-pc at-spi-bus-launcher[876]: XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
Jan 18 10:26:06 user-pc at-spi-bus-launcher[876]:       after 617 requests (617 known processed) with 0 events remaining.
Jan 18 10:26:06 user-pc clock-applet[979]: clock-applet: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
Jan 18 10:26:06 user-pc wnck-applet[973]: wnck-applet: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
Jan 18 10:26:06 user-pc pulseaudio[932]: XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
Jan 18 10:26:06 user-pc pulseaudio[932]:       after 19 requests (19 known processed) with 0 events remaining.
Jan 18 10:26:06 user-pc mate-multiload-[977]: mate-multiload-applet: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
Jan 18 10:26:06 user-pc lightdm[770]: pam_unix(lightdm:session): session closed for user user
Jan 18 10:26:06 user-pc mate-system-mon[1069]: mate-system-monitor: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
Jan 18 10:26:06 user-pc polkitd(authority=local)[529]: Unregistered Authentication Agent for unix-session:3 (system bus name :1.32, object path /org/mate/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Jan 18 10:26:06 user-pc systemd-logind[498]: Session 3 logged out. Waiting for processes to exit.
Jan 18 10:26:07 user-pc systemd[775]: pulseaudio.service: Main process exited, code=exited, status=1/FAILURE
Jan 18 10:26:07 user-pc systemd[775]: pulseaudio.service: Failed with result 'exit-code'.
Jan 18 10:26:07 user-pc systemd[775]: pulseaudio.service: Service RestartSec=100ms expired, scheduling restart.
Jan 18 10:26:07 user-pc systemd[775]: pulseaudio.service: Scheduled restart job, restart counter is at 1.
Jan 18 10:26:07 user-pc systemd[775]: Stopped Sound Service.
Jan 18 10:26:07 user-pc systemd[775]: Starting Sound Service...
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Successfully made thread 1390 of process 1390 (n/a) owned by '1000' high priority at nice level -11.
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Supervising 1 threads of 1 processes of 1 users.
Jan 18 10:26:07 user-pc pulseaudio[1390]: W: [pulseaudio] pid.c: Stale PID file, overwriting.
Jan 18 10:26:07 user-pc kernel: oom_reaper: reaped process 1388 (tail), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Supervising 1 threads of 1 processes of 1 users.
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Successfully made thread 1398 of process 1390 (n/a) owned by '1000' RT at priority 5.
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Supervising 2 threads of 1 processes of 1 users.
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Supervising 2 threads of 1 processes of 1 users.
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Successfully made thread 1399 of process 1390 (n/a) owned by '1000' RT at priority 5.
Jan 18 10:26:07 user-pc rtkit-daemon[936]: Supervising 3 threads of 1 processes of 1 users.
Jan 18 10:26:07 user-pc systemd[775]: Started Sound Service.
Jan 18 10:26:07 user-pc kernel: nouveau 0000:04:00.0: Enabling HDA controller
Jan 18 10:26:07 user-pc kernel: nouveau 0000:04:00.0: bus: MMIO read of 00000000 FAULT at 6013d4 [ IBUS ]
Jan 18 10:26:08 user-pc kernel: broken atomic modeset userspace detected, disabling atomic
Jan 18 10:26:08 user-pc kernel: nouveau 0000:04:00.0: bus: MMIO read of 00000000 FAULT at 619444 [ IBUS ]
Jan 18 10:26:09 user-pc lightdm[1408]: pam_unix(lightdm-greeter:session): session opened for user lightdm by (uid=0)
Jan 18 10:26:09 user-pc systemd[1]: Created slice User Slice of UID 114.
Jan 18 10:26:09 user-pc systemd[1]: Starting User Runtime Directory /run/user/114...
Jan 18 10:26:09 user-pc systemd-logind[498]: New session c2 of user lightdm.
Jan 18 10:26:09 user-pc systemd[1]: Started User Runtime Directory /run/user/114.
Jan 18 10:26:09 user-pc systemd[1]: Starting User Manager for UID 114...

[DRM/i915] kernel: BUG: unable to handle page fault / kernel: Oops

фев 26 20:54:29 PC kernel: BUG: unable to handle page fault for address: 0000000000096b15
фев 26 20:54:29 PC kernel: #PF: supervisor read access in kernel mode
фев 26 20:54:29 PC kernel: #PF: error_code(0x0000) - not-present page
фев 26 20:54:29 PC kernel: PGD 0 P4D 0 
фев 26 20:54:29 PC kernel: Oops: 0000 [#1] SMP PTI
фев 26 20:54:29 PC kernel: CPU: 0 PID: 3097 Comm: Xorg Not tainted 5.10.17-le9bb0 #1
фев 26 20:54:29 PC kernel: Hardware name: Acer VAG70_HC/VAG70, BIOS V2.16 01/14/2013
фев 26 20:54:29 PC kernel: RIP: 0010:i915_vma_revoke_mmap+0x3d/0xd0 [i915]
фев 26 20:54:29 PC kernel: Code: c3 53 48 8b 87 08 01 00 00 48 89 fb 48 8b b7 f4 01 00 00 48 8b 97 e8 00 00 00 b9 01 00 00 00 48 03 70 10 48 8b 87 a8 00 00 00 <48> 8b 80 38 01 00 00 48 c1 e6 0c 48 8b 40 78 48 8b 78 30 e8 0b 32
фев 26 20:54:29 PC kernel: RSP: 0018:ffffae450326fcd0 EFLAGS: 00010206
фев 26 20:54:29 PC kernel: RAX: 00000000000969dd RBX: ffffae450029f858 RCX: 0000000000000001
фев 26 20:54:29 PC kernel: RDX: ffff8e4133d07408 RSI: 2271ae10ffffffff RDI: ffffae450029f858
фев 26 20:54:29 PC kernel: RBP: ffff8e412271ae18 R08: 0000000000000000 R09: 0000000000000000
фев 26 20:54:29 PC kernel: R10: 0000000000000007 R11: ffff8e4109038a40 R12: ffff8e411f9e6db8
фев 26 20:54:29 PC kernel: R13: 0000000000000000 R14: ffff8e412271ae18 R15: 0000000000010000
фев 26 20:54:29 PC kernel: FS:  00007f452fac10c0(0000) GS:ffff8e4194000000(0000) knlGS:0000000000000000
фев 26 20:54:29 PC kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
фев 26 20:54:29 PC kernel: CR2: 0000000000096b15 CR3: 00000000067ae006 CR4: 00000000001706f0
фев 26 20:54:29 PC kernel: Call Trace:
фев 26 20:54:29 PC kernel:  __i915_gem_object_release_mmap_gtt+0x43/0x60 [i915]
фев 26 20:54:29 PC kernel:  i915_gem_object_release_mmap_gtt+0x40/0x60 [i915]
фев 26 20:54:29 PC kernel:  i915_gem_object_set_tiling+0x2c7/0x4d0 [i915]
фев 26 20:54:29 PC kernel:  i915_gem_set_tiling_ioctl+0x1b1/0x260 [i915]
фев 26 20:54:29 PC kernel:  ? i915_gem_object_set_tiling+0x4d0/0x4d0 [i915]
фев 26 20:54:29 PC kernel:  drm_ioctl_kernel+0xae/0xf0 [drm]
фев 26 20:54:29 PC kernel:  drm_ioctl+0x304/0x3b0 [drm]
фев 26 20:54:29 PC kernel:  ? i915_gem_object_set_tiling+0x4d0/0x4d0 [i915]
фев 26 20:54:29 PC kernel:  ? __do_munmap+0x352/0x500
фев 26 20:54:29 PC kernel:  __x64_sys_ioctl+0x8e/0xd0
фев 26 20:54:29 PC kernel:  do_syscall_64+0x33/0x80
фев 26 20:54:29 PC kernel:  entry_SYSCALL_64_after_hwframe+0x44/0xa9
фев 26 20:54:29 PC kernel: RIP: 0033:0x7f452d50b017
фев 26 20:54:29 PC kernel: Code: 00 00 00 48 8b 05 81 7e 2b 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 51 7e 2b 00 f7 d8 64 89 01 48
фев 26 20:54:29 PC kernel: RSP: 002b:00007fff64c5eb78 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
фев 26 20:54:29 PC kernel: RAX: ffffffffffffffda RBX: 00005571e9733a80 RCX: 00007f452d50b017
фев 26 20:54:29 PC kernel: RDX: 00007fff64c5eb80 RSI: 00000000c0106461 RDI: 000000000000000e
фев 26 20:54:29 PC kernel: RBP: 0000000000000000 R08: 00005571e9a5bb00 R09: 0000000000000000
фев 26 20:54:29 PC kernel: R10: 00007f452fbce5c8 R11: 0000000000000246 R12: 0000000000000000
фев 26 20:54:29 PC kernel: R13: 00005571e834faf0 R14: 00000000c0106461 R15: 00007fff64c5eb80
фев 26 20:54:29 PC kernel: Modules linked in: ctr ccm nfnetlink_queue nfnetlink_log nfnetlink binfmt_misc nouveau ath3k btusb ath9k btrtl uvcvideo btbcm btintel ath9k_common bluetooth ath9k_hw videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_common videodev jitterentropy_rng drbg ansi_cprng snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_codec_generic mc ecdh_generic ecc ledtrig_audio ath i915 mac80211 iTCO_wdt iTCO_vendor_support intel_rapl_msr intel_rapl_common snd_hda_intel snd_intel_dspcfg x86_pkg_temp_thermal snd_hda_codec intel_powerclamp snd_hda_core mxm_wmi coretemp kvm_intel ttm snd_hwdep snd_pcm drm_kms_helper kvm drm snd_timer cfg80211 irqbypass snd at24 libarc4 soundcore regmap_i2c sg mei_me lpc_ich rapl mei mfd_core i2c_algo_bit joydev intel_cstate intel_uncore evdev serio_raw pcspkr acer_wmi sparse_keymap wmi_bmof rfkill button ac ipt_REJECT nf_reject_ipv4 nf_log_ipv4 nf_log_common xt_LOG xt_limit xt_tcpudp xt_addrtype xt_conntrack ip6_tables nf_conntrack_netbios_ns
фев 26 20:54:30 PC kernel:  nf_conntrack_broadcast nf_nat_ftp nf_nat nf_conntrack_ftp nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 iptable_filter ip_tables x_tables autofs4 ext4 crc16 mbcache jbd2 btrfs blake2b_generic xor zstd_compress raid6_pq libcrc32c crc32c_generic algif_skcipher af_alg dm_crypt cbc encrypted_keys dm_mod hid_generic usbhid hid sr_mod sd_mod cdrom t10_pi crct10dif_pclmul crc32_pclmul crc32c_intel ghash_clmulni_intel ahci libahci xhci_pci libata aesni_intel xhci_hcd ehci_pci crypto_simd cryptd glue_helper ehci_hcd psmouse scsi_mod i2c_i801 usbcore i2c_smbus atl1c thermal wmi battery video [last unloaded: zsmalloc]
фев 26 20:54:30 PC kernel: CR2: 0000000000096b15
фев 26 20:54:30 PC kernel: ---[ end trace a871c9c3d159b4a3 ]---
фев 26 20:54:30 PC kernel: RIP: 0010:i915_vma_revoke_mmap+0x3d/0xd0 [i915]
фев 26 20:54:30 PC kernel: Code: c3 53 48 8b 87 08 01 00 00 48 89 fb 48 8b b7 f4 01 00 00 48 8b 97 e8 00 00 00 b9 01 00 00 00 48 03 70 10 48 8b 87 a8 00 00 00 <48> 8b 80 38 01 00 00 48 c1 e6 0c 48 8b 40 78 48 8b 78 30 e8 0b 32
фев 26 20:54:30 PC kernel: RSP: 0018:ffffae450326fcd0 EFLAGS: 00010206
фев 26 20:54:30 PC kernel: RAX: 00000000000969dd RBX: ffffae450029f858 RCX: 0000000000000001
фев 26 20:54:30 PC kernel: RDX: ffff8e4133d07408 RSI: 2271ae10ffffffff RDI: ffffae450029f858
фев 26 20:54:30 PC kernel: RBP: ffff8e412271ae18 R08: 0000000000000000 R09: 0000000000000000
фев 26 20:54:30 PC kernel: R10: 0000000000000007 R11: ffff8e4109038a40 R12: ffff8e411f9e6db8
фев 26 20:54:30 PC kernel: R13: 0000000000000000 R14: ffff8e412271ae18 R15: 0000000000010000
фев 26 20:54:30 PC kernel: FS:  00007f452fac10c0(0000) GS:ffff8e4194000000(0000) knlGS:0000000000000000
фев 26 20:54:30 PC kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
фев 26 20:54:30 PC kernel: CR2: 0000000000096b15 CR3: 00000000067ae006 CR4: 00000000001706f0

CONFIG_CLEAN_LOW_KBYTES and CONFIG_CLEAN_MIN_KBYTES ?

Hi there,

I've applied the le9db-5.10.patch to my 5.8.18 kernel.
I'm going to run this on Fedora on a 2GB ODroid board (armv7).
Fedora uses zram by default on all of the memory.

What should be sane values for CONFIG_CLEAN_LOW_KBYTES and CONFIG_CLEAN_MIN_KBYTES ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.