If we are using a large directory block size, and memory becomes
fragmented, we can get memory allocation failures trying to
kmem_alloc(64k) for a temporary buffer. However, there is not need
for a directory buffer sized allocation, as the end result ends up
in the inode literal area. This is, at most, slightly less than 2k
of space, and hence we don't need an allocation larger than that
fora temporary buffer.
Signed-off-by: Dave Chinner <email address hidden>
Reviewed-by: Ben Myers <email address hidden>
Signed-off-by: Ben Myers <email address hidden>
It was brought to my attention the following situation:
http:// tracker. ceph.com/ issues/ 6301
Precise kernel does not have XFS fix for kmem_alloc deadlock and users are facing this problem.
Output example:
""" kernel/ hung_task_ timeout_ secs" disables this message. f4a>] ? schedule_ timeout+ 0x1ca/0x270 bf1>] ? native_ sched_clock+ 0x11/0x70 cda>] ? try_to_ wake_up+ 0x1ea/0x270 623>] ? wait_for_ completion+ 0xa3/0x120 d60>] ? try_to_ wake_up+ 0x270/0x270 702>] ? do_coredump+ 0x1b2/0xee0 899>] ? do_coredump+ 0x349/0xee0 0c4>] ? skb_queue_ tail+0x24/ 0x60 73a>] ? unix_dgram_ sendmsg+ 0x5aa/0x640 049>] ? get_signal_ to_deliver+ 0x199/0x5a0 353>] ? do_signal+ 0x63/0x8c0 030>] ? do_send_ sig_info+ 0x60/0x90 c38>] ? do_notify_ resume+ 0x88/0xa0 d6a>] ? int_signal+ 0x12/0x17
NFO: task ceph-osd:17047 blocked for more than 120 seconds.
[153972.073476] "echo 0 > /proc/sys/
[153972.076322] ceph-osd D ffff880869a28a60 0 17047 5423 0x00000000
[153972.076324] ffff880869a28750 0000000000000002 ffff880867788ee8 ffff8807e4e47500
[153972.079259] ffff880517addfd8 ffff880517addfd8 ffff880517addfd8 ffff880869a28750
[153972.082244] 0000000000000004 ffff880517addd48 ffff880517addd50 7fffffffffffffff
[153972.085278] Call Trace:
[153972.088310] [<ffffffff81410
[153972.091371] [<ffffffff8100a
[153972.094386] [<ffffffff81070
[153972.097358] [<ffffffff81412
[153972.100322] [<ffffffff81070
[153972.103292] [<ffffffff811a3
[153972.106212] [<ffffffff811a3
[153972.109085] [<ffffffff8134e
[153972.111954] [<ffffffff813eb
[153972.114839] [<ffffffff81053
[153972.117743] [<ffffffff81002
[153972.120632] [<ffffffff81052
[153972.123521] [<ffffffff81002
[153972.126400] [<ffffffff81414
[153972.299643] XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)
[153972.868782] XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)
[153973.038189] XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)
[153974.309978] XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)
"""
Fix, already included in Utopic, is upstream commit: b3f03bac8132207 a20286d5602eda6 4500c19724
Author: Dave Chinner <email address hidden>
Date: Tue Dec 3 23:50:57 2013 +1100
xfs: xfs_dir2_ block_to_ sf temp buffer allocation fails
If we are using a large directory block size, and memory becomes
fragmented, we can get memory allocation failures trying to
kmem_alloc(64k) for a temporary buffer. However, there is not need
for a directory buffer sized allocation, as the end result ends up
in the inode literal area. This is, at most, slightly less than 2k
of space, and hence we don't need an allocation larger than that
fora temporary buffer.
Signed-off-by: Dave Chinner <email address hidden>
Reviewed-by: Ben Myers <email address hidden>
Signed-off-by: Ben Myers <email address hidden>