Commit ffbfe92533810bf1bb76fd275400825ef8898ed9

Authored by Mike Christie
Committed by James Bottomley
1 parent d36ab6f321

[SCSI] iscsi: kill dtask mempools

Discovered by steven@hayter.me.uk and patch by michaelc@cs.wisc.edu

The dtask mempool is reserving 261120 items per session! Since we are now
sending headers with sendmsg there is no reason for the mempool and that
was causing us to us carzy amounts of mem. We can preallicate a header in
the r2t and task struct and reuse them

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

Showing 2 changed files with 10 additions and 88 deletions Side-by-side Diff

drivers/scsi/iscsi_tcp.c
... ... @@ -67,9 +67,6 @@
67 67 static unsigned int iscsi_max_lun = 512;
68 68 module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
69 69  
70   -/* global data */
71   -static kmem_cache_t *taskcache;
72   -
73 70 static inline void
74 71 iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size)
75 72 {
... ... @@ -195,16 +192,6 @@
195 192 if (unlikely(!sc))
196 193 return;
197 194  
198   - if (sc->sc_data_direction == DMA_TO_DEVICE) {
199   - struct iscsi_data_task *dtask, *n;
200   -
201   - /* WRITE: cleanup Data-Out's if any */
202   - list_for_each_entry_safe(dtask, n, &tcp_ctask->dataqueue,
203   - item) {
204   - list_del(&dtask->item);
205   - mempool_free(dtask, tcp_ctask->datapool);
206   - }
207   - }
208 195 tcp_ctask->xmstate = XMSTATE_IDLE;
209 196 tcp_ctask->r2t = NULL;
210 197 }
211 198  
... ... @@ -286,14 +273,10 @@
286 273 struct iscsi_r2t_info *r2t)
287 274 {
288 275 struct iscsi_data *hdr;
289   - struct iscsi_data_task *dtask;
290 276 struct scsi_cmnd *sc = ctask->sc;
291 277 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
292 278  
293   - dtask = mempool_alloc(tcp_ctask->datapool, GFP_ATOMIC);
294   - BUG_ON(!dtask);
295   - INIT_LIST_HEAD(&dtask->item);
296   - hdr = &dtask->hdr;
  279 + hdr = &r2t->dtask.hdr;
297 280 memset(hdr, 0, sizeof(struct iscsi_data));
298 281 hdr->ttt = r2t->ttt;
299 282 hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
... ... @@ -319,8 +302,6 @@
319 302 iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,
320 303 sizeof(struct iscsi_hdr));
321 304  
322   - r2t->dtask = dtask;
323   -
324 305 if (sc->use_sg) {
325 306 int i, sg_count = 0;
326 307 struct scatterlist *sg = sc->request_buffer;
... ... @@ -352,8 +333,6 @@
352 333 iscsi_buf_init_iov(&tcp_ctask->sendbuf,
353 334 (char*)sc->request_buffer + r2t->data_offset,
354 335 r2t->data_count);
355   -
356   - list_add(&dtask->item, &tcp_ctask->dataqueue);
357 336 }
358 337  
359 338 /**
360 339  
... ... @@ -1229,14 +1208,10 @@
1229 1208 {
1230 1209 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
1231 1210 struct iscsi_data *hdr;
1232   - struct iscsi_data_task *dtask;
1233 1211 struct scsi_cmnd *sc = ctask->sc;
1234 1212 int new_offset;
1235 1213  
1236   - dtask = mempool_alloc(tcp_ctask->datapool, GFP_ATOMIC);
1237   - BUG_ON(!dtask);
1238   - INIT_LIST_HEAD(&dtask->item);
1239   - hdr = &dtask->hdr;
  1214 + hdr = &r2t->dtask.hdr;
1240 1215 memset(hdr, 0, sizeof(struct iscsi_data));
1241 1216 hdr->ttt = r2t->ttt;
1242 1217 hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
... ... @@ -1260,8 +1235,6 @@
1260 1235 iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,
1261 1236 sizeof(struct iscsi_hdr));
1262 1237  
1263   - r2t->dtask = dtask;
1264   -
1265 1238 if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) {
1266 1239 BUG_ON(tcp_ctask->bad_sg == r2t->sg);
1267 1240 iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
... ... @@ -1270,8 +1243,6 @@
1270 1243 iscsi_buf_init_iov(&tcp_ctask->sendbuf,
1271 1244 (char*)sc->request_buffer + new_offset,
1272 1245 r2t->data_count);
1273   -
1274   - list_add(&dtask->item, &tcp_ctask->dataqueue);
1275 1246 }
1276 1247  
1277 1248 static void
1278 1249  
... ... @@ -1280,17 +1251,11 @@
1280 1251 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
1281 1252 struct iscsi_data_task *dtask;
1282 1253  
1283   - dtask = mempool_alloc(tcp_ctask->datapool, GFP_ATOMIC);
1284   - BUG_ON(!dtask);
1285   - INIT_LIST_HEAD(&dtask->item);
1286   -
  1254 + dtask = tcp_ctask->dtask = &tcp_ctask->unsol_dtask;
1287 1255 iscsi_prep_unsolicit_data_pdu(ctask, &dtask->hdr,
1288 1256 tcp_ctask->r2t_data_count);
1289 1257 iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)&dtask->hdr,
1290 1258 sizeof(struct iscsi_hdr));
1291   -
1292   - list_add(&dtask->item, &tcp_ctask->dataqueue);
1293   - tcp_ctask->dtask = dtask;
1294 1259 }
1295 1260  
1296 1261 /**
... ... @@ -1534,7 +1499,6 @@
1534 1499 tcp_ctask->xmstate |= XMSTATE_UNS_DATA;
1535 1500 if (tcp_ctask->xmstate & XMSTATE_UNS_INIT) {
1536 1501 iscsi_unsolicit_data_init(conn, ctask);
1537   - BUG_ON(!tcp_ctask->dtask);
1538 1502 dtask = tcp_ctask->dtask;
1539 1503 if (conn->hdrdgst_en)
1540 1504 iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
... ... @@ -1643,7 +1607,7 @@
1643 1607 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
1644 1608 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
1645 1609 struct iscsi_r2t_info *r2t = tcp_ctask->r2t;
1646   - struct iscsi_data_task *dtask = r2t->dtask;
  1610 + struct iscsi_data_task *dtask = &r2t->dtask;
1647 1611 int left;
1648 1612  
1649 1613 tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
... ... @@ -1857,7 +1821,7 @@
1857 1821 r2t = tcp_ctask->r2t;
1858 1822 if (conn->hdrdgst_en)
1859 1823 iscsi_hdr_digest(conn, &r2t->headbuf,
1860   - (u8*)r2t->dtask->hdrext);
  1824 + (u8*)r2t->dtask.hdrext);
1861 1825 if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) {
1862 1826 tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
1863 1827 tcp_ctask->xmstate |= XMSTATE_SOL_HDR;
... ... @@ -2113,21 +2077,6 @@
2113 2077 (void**)tcp_ctask->r2ts);
2114 2078 goto r2t_alloc_fail;
2115 2079 }
2116   -
2117   - /*
2118   - * number of
2119   - * Data-Out PDU's within R2T-sequence can be quite big;
2120   - * using mempool
2121   - */
2122   - tcp_ctask->datapool = mempool_create_slab_pool(ISCSI_DTASK_DEFAULT_MAX,
2123   - taskcache);
2124   - if (tcp_ctask->datapool == NULL) {
2125   - kfifo_free(tcp_ctask->r2tqueue);
2126   - iscsi_pool_free(&tcp_ctask->r2tpool,
2127   - (void**)tcp_ctask->r2ts);
2128   - goto r2t_alloc_fail;
2129   - }
2130   - INIT_LIST_HEAD(&tcp_ctask->dataqueue);
2131 2080 }
2132 2081  
2133 2082 return 0;
... ... @@ -2137,7 +2086,6 @@
2137 2086 struct iscsi_cmd_task *ctask = session->cmds[i];
2138 2087 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
2139 2088  
2140   - mempool_destroy(tcp_ctask->datapool);
2141 2089 kfifo_free(tcp_ctask->r2tqueue);
2142 2090 iscsi_pool_free(&tcp_ctask->r2tpool,
2143 2091 (void**)tcp_ctask->r2ts);
... ... @@ -2154,7 +2102,6 @@
2154 2102 struct iscsi_cmd_task *ctask = session->cmds[i];
2155 2103 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
2156 2104  
2157   - mempool_destroy(tcp_ctask->datapool);
2158 2105 kfifo_free(tcp_ctask->r2tqueue);
2159 2106 iscsi_pool_free(&tcp_ctask->r2tpool,
2160 2107 (void**)tcp_ctask->r2ts);
... ... @@ -2496,21 +2443,6 @@
2496 2443  
2497 2444 static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session)
2498 2445 {
2499   - struct iscsi_session *session = class_to_transport_session(cls_session);
2500   - struct iscsi_data_task *dtask, *n;
2501   - int cmd_i;
2502   -
2503   - for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
2504   - struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
2505   - struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
2506   -
2507   - list_for_each_entry_safe(dtask, n, &tcp_ctask->dataqueue,
2508   - item) {
2509   - list_del(&dtask->item);
2510   - mempool_free(dtask, tcp_ctask->datapool);
2511   - }
2512   - }
2513   -
2514 2446 iscsi_r2tpool_free(class_to_transport_session(cls_session));
2515 2447 iscsi_session_teardown(cls_session);
2516 2448 }
2517 2449  
... ... @@ -2592,14 +2524,8 @@
2592 2524 }
2593 2525 iscsi_tcp_transport.max_lun = iscsi_max_lun;
2594 2526  
2595   - taskcache = kmem_cache_create("iscsi_taskcache",
2596   - sizeof(struct iscsi_data_task), 0,
2597   - SLAB_HWCACHE_ALIGN, NULL, NULL);
2598   - if (!taskcache)
2599   - return -ENOMEM;
2600   -
2601 2527 if (!iscsi_register_transport(&iscsi_tcp_transport))
2602   - kmem_cache_destroy(taskcache);
  2528 + return -ENODEV;
2603 2529  
2604 2530 return 0;
2605 2531 }
... ... @@ -2608,7 +2534,6 @@
2608 2534 iscsi_tcp_exit(void)
2609 2535 {
2610 2536 iscsi_unregister_transport(&iscsi_tcp_transport);
2611   - kmem_cache_destroy(taskcache);
2612 2537 }
2613 2538  
2614 2539 module_init(iscsi_tcp_init);
drivers/scsi/iscsi_tcp.h
... ... @@ -118,11 +118,9 @@
118 118 struct iscsi_data_task {
119 119 struct iscsi_data hdr; /* PDU */
120 120 char hdrext[sizeof(__u32)]; /* Header-Digest */
121   - struct list_head item; /* data queue item */
122 121 struct iscsi_buf digestbuf; /* digest buffer */
123 122 uint32_t digest; /* data digest */
124 123 };
125   -#define ISCSI_DTASK_DEFAULT_MAX ISCSI_SG_TABLESIZE * PAGE_SIZE / 512
126 124  
127 125 struct iscsi_tcp_mgmt_task {
128 126 struct iscsi_hdr hdr;
... ... @@ -144,7 +142,7 @@
144 142 int data_count; /* DATA-Out payload progress */
145 143 struct scatterlist *sg; /* per-R2T SG list */
146 144 int solicit_datasn;
147   - struct iscsi_data_task *dtask; /* which data task */
  145 + struct iscsi_data_task dtask; /* which data task */
148 146 };
149 147  
150 148 struct iscsi_tcp_cmd_task {
151 149  
... ... @@ -167,14 +165,13 @@
167 165 struct iscsi_queue r2tpool;
168 166 struct kfifo *r2tqueue;
169 167 struct iscsi_r2t_info **r2ts;
170   - struct list_head dataqueue; /* Data-Out dataqueue */
171   - mempool_t *datapool;
172 168 uint32_t datadigest; /* for recover digest */
173 169 int digest_count;
174 170 uint32_t immdigest; /* for imm data */
175 171 struct iscsi_buf immbuf; /* for imm data digest */
176   - struct iscsi_data_task *dtask; /* data task in progress*/
177   - int digest_offset; /* for partial buff digest */
  172 + struct iscsi_data_task *dtask; /* data task in progress*/
  173 + struct iscsi_data_task unsol_dtask; /* unsol data task */
  174 + int digest_offset; /* for partial buff digest */
178 175 };
179 176  
180 177 #endif /* ISCSI_H */