Skip to content

Commit ffbfe92

Browse files
Mike ChristieJames Bottomley
authored andcommitted
[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>
1 parent d36ab6f commit ffbfe92

File tree

2 files changed

+10
-88
lines changed

2 files changed

+10
-88
lines changed

drivers/scsi/iscsi_tcp.c

Lines changed: 6 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,6 @@ MODULE_VERSION("0:4.445");
6767
static unsigned int iscsi_max_lun = 512;
6868
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
6969

70-
/* global data */
71-
static kmem_cache_t *taskcache;
72-
7370
static inline void
7471
iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size)
7572
{
@@ -195,16 +192,6 @@ __iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
195192
if (unlikely(!sc))
196193
return;
197194

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-
}
208195
tcp_ctask->xmstate = XMSTATE_IDLE;
209196
tcp_ctask->r2t = NULL;
210197
}
@@ -286,14 +273,10 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
286273
struct iscsi_r2t_info *r2t)
287274
{
288275
struct iscsi_data *hdr;
289-
struct iscsi_data_task *dtask;
290276
struct scsi_cmnd *sc = ctask->sc;
291277
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
292278

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;
297280
memset(hdr, 0, sizeof(struct iscsi_data));
298281
hdr->ttt = r2t->ttt;
299282
hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
@@ -319,8 +302,6 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
319302
iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,
320303
sizeof(struct iscsi_hdr));
321304

322-
r2t->dtask = dtask;
323-
324305
if (sc->use_sg) {
325306
int i, sg_count = 0;
326307
struct scatterlist *sg = sc->request_buffer;
@@ -352,8 +333,6 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
352333
iscsi_buf_init_iov(&tcp_ctask->sendbuf,
353334
(char*)sc->request_buffer + r2t->data_offset,
354335
r2t->data_count);
355-
356-
list_add(&dtask->item, &tcp_ctask->dataqueue);
357336
}
358337

359338
/**
@@ -1229,14 +1208,10 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
12291208
{
12301209
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
12311210
struct iscsi_data *hdr;
1232-
struct iscsi_data_task *dtask;
12331211
struct scsi_cmnd *sc = ctask->sc;
12341212
int new_offset;
12351213

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;
12401215
memset(hdr, 0, sizeof(struct iscsi_data));
12411216
hdr->ttt = r2t->ttt;
12421217
hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
@@ -1260,8 +1235,6 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
12601235
iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,
12611236
sizeof(struct iscsi_hdr));
12621237

1263-
r2t->dtask = dtask;
1264-
12651238
if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) {
12661239
BUG_ON(tcp_ctask->bad_sg == r2t->sg);
12671240
iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
@@ -1270,8 +1243,6 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
12701243
iscsi_buf_init_iov(&tcp_ctask->sendbuf,
12711244
(char*)sc->request_buffer + new_offset,
12721245
r2t->data_count);
1273-
1274-
list_add(&dtask->item, &tcp_ctask->dataqueue);
12751246
}
12761247

12771248
static void
@@ -1280,17 +1251,11 @@ iscsi_unsolicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
12801251
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
12811252
struct iscsi_data_task *dtask;
12821253

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;
12871255
iscsi_prep_unsolicit_data_pdu(ctask, &dtask->hdr,
12881256
tcp_ctask->r2t_data_count);
12891257
iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)&dtask->hdr,
12901258
sizeof(struct iscsi_hdr));
1291-
1292-
list_add(&dtask->item, &tcp_ctask->dataqueue);
1293-
tcp_ctask->dtask = dtask;
12941259
}
12951260

12961261
/**
@@ -1534,7 +1499,6 @@ handle_xmstate_uns_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
15341499
tcp_ctask->xmstate |= XMSTATE_UNS_DATA;
15351500
if (tcp_ctask->xmstate & XMSTATE_UNS_INIT) {
15361501
iscsi_unsolicit_data_init(conn, ctask);
1537-
BUG_ON(!tcp_ctask->dtask);
15381502
dtask = tcp_ctask->dtask;
15391503
if (conn->hdrdgst_en)
15401504
iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
@@ -1643,7 +1607,7 @@ handle_xmstate_sol_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
16431607
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
16441608
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
16451609
struct iscsi_r2t_info *r2t = tcp_ctask->r2t;
1646-
struct iscsi_data_task *dtask = r2t->dtask;
1610+
struct iscsi_data_task *dtask = &r2t->dtask;
16471611
int left;
16481612

16491613
tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
@@ -1857,7 +1821,7 @@ iscsi_tcp_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
18571821
r2t = tcp_ctask->r2t;
18581822
if (conn->hdrdgst_en)
18591823
iscsi_hdr_digest(conn, &r2t->headbuf,
1860-
(u8*)r2t->dtask->hdrext);
1824+
(u8*)r2t->dtask.hdrext);
18611825
if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) {
18621826
tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
18631827
tcp_ctask->xmstate |= XMSTATE_SOL_HDR;
@@ -2113,21 +2077,6 @@ iscsi_r2tpool_alloc(struct iscsi_session *session)
21132077
(void**)tcp_ctask->r2ts);
21142078
goto r2t_alloc_fail;
21152079
}
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);
21312080
}
21322081

21332082
return 0;
@@ -2137,7 +2086,6 @@ iscsi_r2tpool_alloc(struct iscsi_session *session)
21372086
struct iscsi_cmd_task *ctask = session->cmds[i];
21382087
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
21392088

2140-
mempool_destroy(tcp_ctask->datapool);
21412089
kfifo_free(tcp_ctask->r2tqueue);
21422090
iscsi_pool_free(&tcp_ctask->r2tpool,
21432091
(void**)tcp_ctask->r2ts);
@@ -2154,7 +2102,6 @@ iscsi_r2tpool_free(struct iscsi_session *session)
21542102
struct iscsi_cmd_task *ctask = session->cmds[i];
21552103
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
21562104

2157-
mempool_destroy(tcp_ctask->datapool);
21582105
kfifo_free(tcp_ctask->r2tqueue);
21592106
iscsi_pool_free(&tcp_ctask->r2tpool,
21602107
(void**)tcp_ctask->r2ts);
@@ -2496,21 +2443,6 @@ iscsi_tcp_session_create(struct iscsi_transport *iscsit,
24962443

24972444
static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session)
24982445
{
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-
25142446
iscsi_r2tpool_free(class_to_transport_session(cls_session));
25152447
iscsi_session_teardown(cls_session);
25162448
}
@@ -2592,14 +2524,8 @@ iscsi_tcp_init(void)
25922524
}
25932525
iscsi_tcp_transport.max_lun = iscsi_max_lun;
25942526

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-
26012527
if (!iscsi_register_transport(&iscsi_tcp_transport))
2602-
kmem_cache_destroy(taskcache);
2528+
return -ENODEV;
26032529

26042530
return 0;
26052531
}
@@ -2608,7 +2534,6 @@ static void __exit
26082534
iscsi_tcp_exit(void)
26092535
{
26102536
iscsi_unregister_transport(&iscsi_tcp_transport);
2611-
kmem_cache_destroy(taskcache);
26122537
}
26132538

26142539
module_init(iscsi_tcp_init);

drivers/scsi/iscsi_tcp.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,9 @@ struct iscsi_buf {
118118
struct iscsi_data_task {
119119
struct iscsi_data hdr; /* PDU */
120120
char hdrext[sizeof(__u32)]; /* Header-Digest */
121-
struct list_head item; /* data queue item */
122121
struct iscsi_buf digestbuf; /* digest buffer */
123122
uint32_t digest; /* data digest */
124123
};
125-
#define ISCSI_DTASK_DEFAULT_MAX ISCSI_SG_TABLESIZE * PAGE_SIZE / 512
126124

127125
struct iscsi_tcp_mgmt_task {
128126
struct iscsi_hdr hdr;
@@ -144,7 +142,7 @@ struct iscsi_r2t_info {
144142
int data_count; /* DATA-Out payload progress */
145143
struct scatterlist *sg; /* per-R2T SG list */
146144
int solicit_datasn;
147-
struct iscsi_data_task *dtask; /* which data task */
145+
struct iscsi_data_task dtask; /* which data task */
148146
};
149147

150148
struct iscsi_tcp_cmd_task {
@@ -167,14 +165,13 @@ struct iscsi_tcp_cmd_task {
167165
struct iscsi_queue r2tpool;
168166
struct kfifo *r2tqueue;
169167
struct iscsi_r2t_info **r2ts;
170-
struct list_head dataqueue; /* Data-Out dataqueue */
171-
mempool_t *datapool;
172168
uint32_t datadigest; /* for recover digest */
173169
int digest_count;
174170
uint32_t immdigest; /* for imm data */
175171
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 */
178175
};
179176

180177
#endif /* ISCSI_H */

0 commit comments

Comments
 (0)