Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
"This is two simple target fixes and one discard related I/O starvation
problem in sd.

The discard problem occurs because the discard page doesn't have a
mempool backing so if the allocation fails due to memory pressure, we
then lose the forward progress we require if the writeout is on the
same device. The fix is to back it with a mempool"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: sd: use mempool for discard special page
scsi: target: iscsi: cxgbit: add missing spin_lock_init()
scsi: target: iscsi: cxgbit: fix csk leak

+24 -5
+19 -4
drivers/scsi/sd.c
··· 133 133 134 134 static struct kmem_cache *sd_cdb_cache; 135 135 static mempool_t *sd_cdb_pool; 136 + static mempool_t *sd_page_pool; 136 137 137 138 static const char *sd_cache_types[] = { 138 139 "write through", "none", "write back", ··· 760 759 unsigned int data_len = 24; 761 760 char *buf; 762 761 763 - rq->special_vec.bv_page = alloc_page(GFP_ATOMIC | __GFP_ZERO); 762 + rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC); 764 763 if (!rq->special_vec.bv_page) 765 764 return BLKPREP_DEFER; 765 + clear_highpage(rq->special_vec.bv_page); 766 766 rq->special_vec.bv_offset = 0; 767 767 rq->special_vec.bv_len = data_len; 768 768 rq->rq_flags |= RQF_SPECIAL_PAYLOAD; ··· 794 792 u32 nr_sectors = blk_rq_sectors(rq) >> (ilog2(sdp->sector_size) - 9); 795 793 u32 data_len = sdp->sector_size; 796 794 797 - rq->special_vec.bv_page = alloc_page(GFP_ATOMIC | __GFP_ZERO); 795 + rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC); 798 796 if (!rq->special_vec.bv_page) 799 797 return BLKPREP_DEFER; 798 + clear_highpage(rq->special_vec.bv_page); 800 799 rq->special_vec.bv_offset = 0; 801 800 rq->special_vec.bv_len = data_len; 802 801 rq->rq_flags |= RQF_SPECIAL_PAYLOAD; ··· 825 822 u32 nr_sectors = blk_rq_sectors(rq) >> (ilog2(sdp->sector_size) - 9); 826 823 u32 data_len = sdp->sector_size; 827 824 828 - rq->special_vec.bv_page = alloc_page(GFP_ATOMIC | __GFP_ZERO); 825 + rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC); 829 826 if (!rq->special_vec.bv_page) 830 827 return BLKPREP_DEFER; 828 + clear_highpage(rq->special_vec.bv_page); 831 829 rq->special_vec.bv_offset = 0; 832 830 rq->special_vec.bv_len = data_len; 833 831 rq->rq_flags |= RQF_SPECIAL_PAYLOAD; ··· 1290 1286 u8 *cmnd; 1291 1287 1292 1288 if (rq->rq_flags & RQF_SPECIAL_PAYLOAD) 1293 - __free_page(rq->special_vec.bv_page); 1289 + mempool_free(rq->special_vec.bv_page, sd_page_pool); 1294 1290 1295 1291 if (SCpnt->cmnd != scsi_req(rq)->cmd) { 1296 1292 cmnd = SCpnt->cmnd; ··· 3627 3623 goto err_out_cache; 3628 3624 } 3629 3625 3626 + sd_page_pool = mempool_create_page_pool(SD_MEMPOOL_SIZE, 0); 3627 + if (!sd_page_pool) { 3628 + printk(KERN_ERR "sd: can't init discard page pool\n"); 3629 + err = -ENOMEM; 3630 + goto err_out_ppool; 3631 + } 3632 + 3630 3633 err = scsi_register_driver(&sd_template.gendrv); 3631 3634 if (err) 3632 3635 goto err_out_driver; ··· 3641 3630 return 0; 3642 3631 3643 3632 err_out_driver: 3633 + mempool_destroy(sd_page_pool); 3634 + 3635 + err_out_ppool: 3644 3636 mempool_destroy(sd_cdb_pool); 3645 3637 3646 3638 err_out_cache: ··· 3670 3656 3671 3657 scsi_unregister_driver(&sd_template.gendrv); 3672 3658 mempool_destroy(sd_cdb_pool); 3659 + mempool_destroy(sd_page_pool); 3673 3660 kmem_cache_destroy(sd_cdb_cache); 3674 3661 3675 3662 class_unregister(&sd_disk_class);
+4 -1
drivers/target/iscsi/cxgbit/cxgbit_cm.c
··· 641 641 642 642 static void cxgbit_arp_failure_discard(void *handle, struct sk_buff *skb) 643 643 { 644 + struct cxgbit_sock *csk = handle; 645 + 644 646 pr_debug("%s cxgbit_device %p\n", __func__, handle); 645 647 kfree_skb(skb); 648 + cxgbit_put_csk(csk); 646 649 } 647 650 648 651 static void cxgbit_abort_arp_failure(void *handle, struct sk_buff *skb) ··· 1209 1206 rpl5->opt0 = cpu_to_be64(opt0); 1210 1207 rpl5->opt2 = cpu_to_be32(opt2); 1211 1208 set_wr_txq(skb, CPL_PRIORITY_SETUP, csk->ctrlq_idx); 1212 - t4_set_arp_err_handler(skb, NULL, cxgbit_arp_failure_discard); 1209 + t4_set_arp_err_handler(skb, csk, cxgbit_arp_failure_discard); 1213 1210 cxgbit_l2t_send(csk->com.cdev, skb, csk->l2t); 1214 1211 } 1215 1212
+1
drivers/target/iscsi/cxgbit/cxgbit_main.c
··· 58 58 return ERR_PTR(-ENOMEM); 59 59 60 60 kref_init(&cdev->kref); 61 + spin_lock_init(&cdev->np_lock); 61 62 62 63 cdev->lldi = *lldi; 63 64