]> err.no Git - linux-2.6/blobdiff - drivers/scsi/iscsi_tcp.c
[SCSI] iscsi: kill dtask mempools
[linux-2.6] / drivers / scsi / iscsi_tcp.c
index d94038eafb9b7933254478875e66fd283847f6d6..08357a6c7e096dd92cb5cf92ca9e00594ddb83d0 100644 (file)
@@ -67,17 +67,6 @@ MODULE_VERSION("0:4.445");
 static unsigned int iscsi_max_lun = 512;
 module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
 
-/* global data */
-static kmem_cache_t *taskcache;
-
-static inline void
-iscsi_buf_init_virt(struct iscsi_buf *ibuf, char *vbuf, int size)
-{
-       sg_init_one(&ibuf->sg, (u8 *)vbuf, size);
-       ibuf->sent = 0;
-       ibuf->use_sendmsg = 0;
-}
-
 static inline void
 iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size)
 {
@@ -203,16 +192,6 @@ __iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
        if (unlikely(!sc))
                return;
 
-       if (sc->sc_data_direction == DMA_TO_DEVICE) {
-               struct iscsi_data_task *dtask, *n;
-
-               /* WRITE: cleanup Data-Out's if any */
-               list_for_each_entry_safe(dtask, n, &tcp_ctask->dataqueue,
-                                        item) {
-                       list_del(&dtask->item);
-                       mempool_free(dtask, tcp_ctask->datapool);
-               }
-       }
        tcp_ctask->xmstate = XMSTATE_IDLE;
        tcp_ctask->r2t = NULL;
 }
@@ -294,14 +273,10 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
                        struct iscsi_r2t_info *r2t)
 {
        struct iscsi_data *hdr;
-       struct iscsi_data_task *dtask;
        struct scsi_cmnd *sc = ctask->sc;
        struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
 
-       dtask = mempool_alloc(tcp_ctask->datapool, GFP_ATOMIC);
-       BUG_ON(!dtask);
-       INIT_LIST_HEAD(&dtask->item);
-       hdr = &dtask->hdr;
+       hdr = &r2t->dtask.hdr;
        memset(hdr, 0, sizeof(struct iscsi_data));
        hdr->ttt = r2t->ttt;
        hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
@@ -324,11 +299,9 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
 
        r2t->sent = 0;
 
-       iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr,
+       iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,
                           sizeof(struct iscsi_hdr));
 
-       r2t->dtask = dtask;
-
        if (sc->use_sg) {
                int i, sg_count = 0;
                struct scatterlist *sg = sc->request_buffer;
@@ -360,8 +333,6 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
                iscsi_buf_init_iov(&tcp_ctask->sendbuf,
                            (char*)sc->request_buffer + r2t->data_offset,
                            r2t->data_count);
-
-       list_add(&dtask->item, &tcp_ctask->dataqueue);
 }
 
 /**
@@ -1208,7 +1179,7 @@ iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
        if (final)
                crypto_digest_final(tcp_conn->data_tx_tfm, (u8*)digest);
 
-       iscsi_buf_init_virt(buf, (char*)digest, 4);
+       iscsi_buf_init_iov(buf, (char*)digest, 4);
        rc = iscsi_sendpage(conn, buf, &tcp_ctask->digest_count, &sent);
        if (rc) {
                tcp_ctask->datadigest = *digest;
@@ -1237,14 +1208,10 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
 {
        struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
        struct iscsi_data *hdr;
-       struct iscsi_data_task *dtask;
        struct scsi_cmnd *sc = ctask->sc;
        int new_offset;
 
-       dtask = mempool_alloc(tcp_ctask->datapool, GFP_ATOMIC);
-       BUG_ON(!dtask);
-       INIT_LIST_HEAD(&dtask->item);
-       hdr = &dtask->hdr;
+       hdr = &r2t->dtask.hdr;
        memset(hdr, 0, sizeof(struct iscsi_data));
        hdr->ttt = r2t->ttt;
        hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
@@ -1265,11 +1232,9 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
        }
        conn->dataout_pdus_cnt++;
 
-       iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr,
+       iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,
                           sizeof(struct iscsi_hdr));
 
-       r2t->dtask = dtask;
-
        if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) {
                BUG_ON(tcp_ctask->bad_sg == r2t->sg);
                iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
@@ -1278,8 +1243,6 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
                iscsi_buf_init_iov(&tcp_ctask->sendbuf,
                            (char*)sc->request_buffer + new_offset,
                            r2t->data_count);
-
-       list_add(&dtask->item, &tcp_ctask->dataqueue);
 }
 
 static void
@@ -1288,17 +1251,11 @@ iscsi_unsolicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
        struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
        struct iscsi_data_task *dtask;
 
-       dtask = mempool_alloc(tcp_ctask->datapool, GFP_ATOMIC);
-       BUG_ON(!dtask);
-       INIT_LIST_HEAD(&dtask->item);
-
+       dtask = tcp_ctask->dtask = &tcp_ctask->unsol_dtask;
        iscsi_prep_unsolicit_data_pdu(ctask, &dtask->hdr,
                                      tcp_ctask->r2t_data_count);
-       iscsi_buf_init_virt(&tcp_ctask->headbuf, (char*)&dtask->hdr,
+       iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)&dtask->hdr,
                           sizeof(struct iscsi_hdr));
-
-       list_add(&dtask->item, &tcp_ctask->dataqueue);
-       tcp_ctask->dtask = dtask;
 }
 
 /**
@@ -1361,7 +1318,7 @@ iscsi_tcp_cmd_init(struct iscsi_cmd_task *ctask)
        } else
                tcp_ctask->xmstate = XMSTATE_R_HDR;
 
-       iscsi_buf_init_virt(&tcp_ctask->headbuf, (char*)ctask->hdr,
+       iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr,
                            sizeof(struct iscsi_hdr));
 }
 
@@ -1542,7 +1499,6 @@ handle_xmstate_uns_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
        tcp_ctask->xmstate |= XMSTATE_UNS_DATA;
        if (tcp_ctask->xmstate & XMSTATE_UNS_INIT) {
                iscsi_unsolicit_data_init(conn, ctask);
-               BUG_ON(!tcp_ctask->dtask);
                dtask = tcp_ctask->dtask;
                if (conn->hdrdgst_en)
                        iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
@@ -1651,7 +1607,7 @@ handle_xmstate_sol_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
        struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
        struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
        struct iscsi_r2t_info *r2t = tcp_ctask->r2t;
-       struct iscsi_data_task *dtask = r2t->dtask;
+       struct iscsi_data_task *dtask = &r2t->dtask;
        int left;
 
        tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
@@ -1758,7 +1714,7 @@ handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
        int sent;
 
        tcp_ctask->xmstate &= ~XMSTATE_W_PAD;
-       iscsi_buf_init_virt(&tcp_ctask->sendbuf, (char*)&tcp_ctask->pad,
+       iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)&tcp_ctask->pad,
                            tcp_ctask->pad_count);
        if (iscsi_sendpage(conn, &tcp_ctask->sendbuf, &tcp_ctask->pad_count,
                           &sent)) {
@@ -1865,7 +1821,7 @@ solicit_head_again:
                r2t = tcp_ctask->r2t;
                if (conn->hdrdgst_en)
                        iscsi_hdr_digest(conn, &r2t->headbuf,
-                                       (u8*)r2t->dtask->hdrext);
+                                       (u8*)r2t->dtask.hdrext);
                if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) {
                        tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
                        tcp_ctask->xmstate |= XMSTATE_SOL_HDR;
@@ -2078,8 +2034,8 @@ iscsi_tcp_mgmt_init(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask,
 {
        struct iscsi_tcp_mgmt_task *tcp_mtask = mtask->dd_data;
 
-       iscsi_buf_init_virt(&tcp_mtask->headbuf, (char*)mtask->hdr,
-                                   sizeof(struct iscsi_hdr));
+       iscsi_buf_init_iov(&tcp_mtask->headbuf, (char*)mtask->hdr,
+                          sizeof(struct iscsi_hdr));
        tcp_mtask->xmstate = XMSTATE_IMM_HDR;
 
        if (mtask->data_count)
@@ -2121,21 +2077,6 @@ iscsi_r2tpool_alloc(struct iscsi_session *session)
                                        (void**)tcp_ctask->r2ts);
                        goto r2t_alloc_fail;
                }
-
-               /*
-                * number of
-                * Data-Out PDU's within R2T-sequence can be quite big;
-                * using mempool
-                */
-               tcp_ctask->datapool = mempool_create_slab_pool(ISCSI_DTASK_DEFAULT_MAX,
-                                                              taskcache);
-               if (tcp_ctask->datapool == NULL) {
-                       kfifo_free(tcp_ctask->r2tqueue);
-                       iscsi_pool_free(&tcp_ctask->r2tpool,
-                                       (void**)tcp_ctask->r2ts);
-                       goto r2t_alloc_fail;
-               }
-               INIT_LIST_HEAD(&tcp_ctask->dataqueue);
        }
 
        return 0;
@@ -2145,7 +2086,6 @@ r2t_alloc_fail:
                struct iscsi_cmd_task *ctask = session->cmds[i];
                struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
 
-               mempool_destroy(tcp_ctask->datapool);
                kfifo_free(tcp_ctask->r2tqueue);
                iscsi_pool_free(&tcp_ctask->r2tpool,
                                (void**)tcp_ctask->r2ts);
@@ -2162,7 +2102,6 @@ iscsi_r2tpool_free(struct iscsi_session *session)
                struct iscsi_cmd_task *ctask = session->cmds[i];
                struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
 
-               mempool_destroy(tcp_ctask->datapool);
                kfifo_free(tcp_ctask->r2tqueue);
                iscsi_pool_free(&tcp_ctask->r2tpool,
                                (void**)tcp_ctask->r2ts);
@@ -2504,21 +2443,6 @@ r2tpool_alloc_fail:
 
 static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session)
 {
-       struct iscsi_session *session = class_to_transport_session(cls_session);
-       struct iscsi_data_task *dtask, *n;
-       int cmd_i;
-
-       for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
-               struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
-               struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
-
-               list_for_each_entry_safe(dtask, n, &tcp_ctask->dataqueue,
-                                        item) {
-                       list_del(&dtask->item);
-                       mempool_free(dtask, tcp_ctask->datapool);
-               }
-       }
-
        iscsi_r2tpool_free(class_to_transport_session(cls_session));
        iscsi_session_teardown(cls_session);
 }
@@ -2600,14 +2524,8 @@ iscsi_tcp_init(void)
        }
        iscsi_tcp_transport.max_lun = iscsi_max_lun;
 
-       taskcache = kmem_cache_create("iscsi_taskcache",
-                       sizeof(struct iscsi_data_task), 0,
-                       SLAB_HWCACHE_ALIGN, NULL, NULL);
-       if (!taskcache)
-               return -ENOMEM;
-
        if (!iscsi_register_transport(&iscsi_tcp_transport))
-               kmem_cache_destroy(taskcache);
+               return -ENODEV;
 
        return 0;
 }
@@ -2616,7 +2534,6 @@ static void __exit
 iscsi_tcp_exit(void)
 {
        iscsi_unregister_transport(&iscsi_tcp_transport);
-       kmem_cache_destroy(taskcache);
 }
 
 module_init(iscsi_tcp_init);