Environment
Novell Open Enterprise Server 11 (OES 11) Linux Support Pack 1
Novell Client for Linux
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.
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)
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.
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.