OES11 SP1: novfsd: page allocation failure: order:4, mode:0xd0.

  • 7014973
  • 29-Apr-2014
  • 02-May-2014

Environment

Novell Open Enterprise Server 11 (OES 11) Linux Support Pack 1
Novell Client for Linux

Situation

When using PureFTP and  the remote server navigation functionality for transferring large amount of files for document scanning purposes, it was observed that after some time, the /var/log/messages file was revealing the following errors :

server1 kernel: [3640039.236414] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [3641236.964750] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1284098.325062] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1284227.694313] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1284539.233347] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1519875.721679] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1829199.027645] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1930451.246620] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [1951902.181650] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [2432756.144625] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [2433953.584233] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [2488320.411632] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [2491912.381610] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [2492511.138797] novfsd: page allocation failure: order:4, mode:0xd0
server1 kernel: [2493110.768599] novfsd: page allocation failure: order:4, mode:0xd0


After a server restart, the Novell Client for Linux memory consumption was behaving properly for some time, until memory consumption started to increase and caused these messages to be logged again.

Resolution

A fix in the Novell Client for Linux (novell-novfsd) was made.

Cause

Every time novfsd was enumerating folders and files, the novfs-kmp module always attempted to allocate 65536 bytes of memory (64KiB, 4 order page allocation).


Additional Information

Kernel maintains memory in 2^n lists (n=0,1,2,3,4,....). When a request for a lower order allocation can not be satisfied, it would attempt to allocate the memory from higher order lists by breaking them up, however if higher order lists would also not be able to satisfy this request, than the  allocation would fail.

Here order 0 expects 4kb memory (2^0=1 page => 1*4kb=4kb).
Generally default page size for Linux 64 bit is 4 kb)
order 1 expects 8kb ( 2^1 = 2page => 2*4kb=8kb)
order 2 expects 16kb
order 3 expects 32kb
order 4 expects 64kb

When novfsd makes the call "NwdQStartEnum" for enumerating folders and files, the novfs-kmp module attempts to allocate up to 65536 bytes (64KiB, 4 order page allocation).
 
Novfs uses kmalloc() for this allocation, and kmalloc() allocations are physically contiguous memory. Now if the kernel memory is fragmented to a point where 16 pages (16*4KiB=64KiB) can not be allocated contiguously, the allocation attempt would fail. So order 4 allocations would normally fail (order 4 because 2^4=16).

In this case there were no available pages of size >=32KB (with the exception of 1*2048KB).
[3643992.773409] Node 0 Normal: 5516*4kB 4*8kB 1*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 1*2048kB 0*4096kB = 24160kB

Even when the kernel had ~364MB memory free, it could not allocate 64KB because most of the available memory existed in the lower order pages (mostly in order 0 - single pages) only.