struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data,
                              unsigned int nr_secs, unsigned int len,
-                             gfp_t gfp_mask)
+                             int alloc_type, gfp_t gfp_mask)
 {
        struct nvm_tgt_dev *dev = pblk->dev;
-       struct pblk_line_mgmt *l_mg = &pblk->l_mg;
        void *kaddr = data;
        struct page *page;
        struct bio *bio;
        int i, ret;
 
-       if (l_mg->emeta_alloc_type == PBLK_KMALLOC_META)
+       if (alloc_type == PBLK_KMALLOC_META)
                return bio_map_kern(dev->q, kaddr, len, gfp_mask);
 
        bio = bio_kmalloc(gfp_mask, nr_secs);
 {
        struct nvm_tgt_dev *dev = pblk->dev;
        struct nvm_geo *geo = &dev->geo;
+       struct pblk_line_mgmt *l_mg = &pblk->l_mg;
        struct pblk_line_meta *lm = &pblk->lm;
        void *ppa_list, *meta_list;
        struct bio *bio;
        rq_ppas = pblk_calc_secs(pblk, left_ppas, 0);
        rq_len = rq_ppas * geo->sec_size;
 
-       bio = pblk_bio_map_addr(pblk, emeta_buf, rq_ppas, rq_len, GFP_KERNEL);
+       bio = pblk_bio_map_addr(pblk, emeta_buf, rq_ppas, rq_len,
+                                       l_mg->emeta_alloc_type, GFP_KERNEL);
        if (IS_ERR(bio)) {
                ret = PTR_ERR(bio);
                goto free_rqd_dma;
 
 
 static void pblk_gc_free_gc_rq(struct pblk_gc_rq *gc_rq)
 {
-       kfree(gc_rq->data);
+       vfree(gc_rq->data);
        kfree(gc_rq);
 }
 
        unsigned int secs_to_gc;
        int ret = 0;
 
-       data = kmalloc(gc_rq->nr_secs * geo->sec_size, GFP_KERNEL);
+       data = vmalloc(gc_rq->nr_secs * geo->sec_size);
        if (!data) {
                ret = -ENOMEM;
                goto out;
 free_rq:
        kfree(gc_rq);
 free_data:
-       kfree(data);
+       vfree(data);
 out:
        kref_put(&line->ref, pblk_line_put);
        return ret;
 
 {
        struct nvm_tgt_dev *dev = pblk->dev;
        struct nvm_geo *geo = &dev->geo;
-       struct request_queue *q = dev->q;
        struct bio *bio;
        struct nvm_rq rqd;
        int ret, data_len;
                goto out;
 
        data_len = (*secs_to_gc) * geo->sec_size;
-       bio = bio_map_kern(q, data, data_len, GFP_KERNEL);
+       bio = pblk_bio_map_addr(pblk, data, *secs_to_gc, data_len,
+                                               PBLK_KMALLOC_META, GFP_KERNEL);
        if (IS_ERR(bio)) {
                pr_err("pblk: could not allocate GC bio (%lu)\n", PTR_ERR(bio));
                goto err_free_dma;
 
        rq_len = rq_ppas * geo->sec_size;
        data = ((void *)emeta->buf) + emeta->mem;
 
-       bio = pblk_bio_map_addr(pblk, data, rq_ppas, rq_len, GFP_KERNEL);
+       bio = pblk_bio_map_addr(pblk, data, rq_ppas, rq_len,
+                                       l_mg->emeta_alloc_type, GFP_KERNEL);
        if (IS_ERR(bio)) {
                ret = PTR_ERR(bio);
                goto fail_free_rqd;
 
 int pblk_submit_meta_io(struct pblk *pblk, struct pblk_line *meta_line);
 struct bio *pblk_bio_map_addr(struct pblk *pblk, void *data,
                              unsigned int nr_secs, unsigned int len,
-                             gfp_t gfp_mask);
+                             int alloc_type, gfp_t gfp_mask);
 struct pblk_line *pblk_line_get(struct pblk *pblk);
 struct pblk_line *pblk_line_get_first_data(struct pblk *pblk);
 void pblk_line_replace_data(struct pblk *pblk);
  * pblk gc
  */
 #define PBLK_GC_MAX_READERS 8  /* Max number of outstanding GC reader jobs */
-#define PBLK_GC_W_QD 1024      /* Queue depth for inflight GC write I/Os */
+#define PBLK_GC_W_QD 128       /* Queue depth for inflight GC write I/Os */
 #define PBLK_GC_L_QD 4         /* Queue depth for inflight GC lines */
 #define PBLK_GC_RSV_LINE 1     /* Reserved lines for GC */