• Kyle Fortin's avatar
    scsi: libiscsi: use kvzalloc for iscsi_pool_init · bfcc62ed
    Kyle Fortin authored
    iscsiadm session login can fail with the following error:
    
    iscsiadm: Could not login to [iface: default, target: iqn.1986-03.com...
    iscsiadm: initiator reported error (9 - internal error)
    
    When /etc/iscsi/iscsid.conf sets node.session.cmds_max = 4096, it
    results in 64K-sized kmallocs per session.  A system under fragmented
    slab pressure may not have any 64K objects available and fail iscsiadm
    session login. Even though memory objects of a smaller size are
    available, the large order allocation ends up failing.
    
    The kernel prints a warning and does dump_stack, like below:
    
    iscsid: page allocation failure: order:4, mode:0xc0d0
    CPU: 0 PID: 2456 Comm: iscsid Not tainted 4.1.12-61.1.28.el6uek.x86_64 #2
    Call Trace:
     [<ffffffff816c6e40>] dump_stack+0x63/0x83
     [<ffffffff8118e58a>] warn_alloc_failed+0xea/0x140
     [<ffffffff81191df9>] __alloc_pages_slowpath+0x409/0x760
     [<ffffffff81192401>] __alloc_pages_nodemask+0x2b1/0x2d0
     [<ffffffffa048f6c0>] ? dev_attr_host_ipaddress+0x20/0xffffffffffffc722
     [<ffffffff811dc38f>] alloc_pages_current+0xaf/0x170
     [<ffffffff81192581>] alloc_kmem_pages+0x31/0xd0
     [<ffffffffa048f600>] ? iscsi_transport_group+0x20/0xffffffffffffc7e2
     [<ffffffff811ad738>] kmalloc_order+0x18/0x50
     [<ffffffff811ad7a4>] kmalloc_order_trace+0x34/0xe0
     [<ffffffff8146ee30>] ? transport_remove_classdev+0x70/0x70
     [<ffffffff811e843d>] __kmalloc+0x27d/0x2a0
     [<ffffffff810c8cbd>] ? complete_all+0x4d/0x60
     [<ffffffffa04af299>] iscsi_pool_init+0x69/0x160 [libiscsi]
     [<ffffffff81465d90>] ? device_initialize+0xb0/0xd0
     [<ffffffffa04af510>] iscsi_session_setup+0x180/0x2f4 [libiscsi]
     [<ffffffffa04c5a60>] ? iscsi_max_lun+0x20/0xfffffffffffffa9e [iscsi_tcp]
     [<ffffffffa04c531f>] iscsi_sw_tcp_session_create+0xcf/0x150 [iscsi_tcp]
     [<ffffffffa04c5a60>] ? iscsi_max_lun+0x20/0xfffffffffffffa9e [iscsi_tcp]
     [<ffffffffa048a633>] iscsi_if_create_session+0x33/0xd0
     [<ffffffffa04c5a60>] ? iscsi_max_lun+0x20/0xfffffffffffffa9e [iscsi_tcp]
     [<ffffffffa048abd8>] iscsi_if_recv_msg+0x508/0x8c0 [scsi_transport_iscsi]
     [<ffffffff811922eb>] ? __alloc_pages_nodemask+0x19b/0x2d0
     [<ffffffff811e6d69>] ? __kmalloc_node_track_caller+0x209/0x2c0
     [<ffffffffa048b00c>] iscsi_if_rx+0x7c/0x200 [scsi_transport_iscsi]
     [<ffffffff81623dc6>] netlink_unicast+0x126/0x1c0
     [<ffffffff8162468c>] netlink_sendmsg+0x36c/0x400
     [<ffffffff815d2fed>] sock_sendmsg+0x4d/0x60
     [<ffffffff815d596a>] ___sys_sendmsg+0x30a/0x330
     [<ffffffff811bc72c>] ? handle_pte_fault+0x20c/0x230
     [<ffffffff811bc90c>] ? __handle_mm_fault+0x1bc/0x330
     [<ffffffff811bcb32>] ? handle_mm_fault+0xb2/0x1a0
     [<ffffffff815d5b99>] __sys_sendmsg+0x49/0x90
     [<ffffffff815d5bf9>] SyS_sendmsg+0x19/0x20
     [<ffffffff816cbb2e>] system_call_fastpath+0x12/0x71
    
    Use kvzalloc for iscsi_pool in iscsi_pool_init.
    Signed-off-by: default avatarKyle Fortin <kyle.fortin@oracle.com>
    Tested-by: default avatarKyle Fortin <kyle.fortin@oracle.com>
    Reviewed-by: default avatarJoseph Slember <joe.slember@oracle.com>
    Reviewed-by: default avatarLance Hartmann <lance.hartmann@oracle.com>
    Acked-by: default avatarLee Duncan <lduncan@suse.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    bfcc62ed
libiscsi.c 97.3 KB