-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlinux-uek4-block.patch
259 lines (236 loc) · 10.2 KB
/
linux-uek4-block.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
From 3f69bce820fae1f93831381705db9667f2ec836e Mon Sep 17 00:00:00 2001
From: Dongli Zhang <[email protected]>
Date: Thu, 23 Apr 2020 16:51:32 -0700
Subject: [PATCH 1/1] linux uek4 block
v4.1.12-124.16.4
Signed-off-by: Dongli Zhang <[email protected]>
---
block/blk-merge.c | 26 ++++++++++++++
drivers/block/oracleasm/driver.c | 4 +++
drivers/block/xen-blkfront.c | 58 ++++++++++++++++++++++++++++++++
drivers/xen/grant-table.c | 10 ++++++
4 files changed, 98 insertions(+)
diff --git a/block/blk-merge.c b/block/blk-merge.c
index de471fe17d20..990e7bd3e978 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -240,6 +240,32 @@ single_segment:
* map a request to scatterlist, return number of sg entries setup. Caller
* must make sure sg can hold rq->nr_phys_segments entries
*/
+/*
+ * called by:
+ * - arch/um/drivers/ubd_kern.c|1288| <<do_ubd_request>> dev->end_sg = blk_rq_map_sg(q, req, dev->sg);
+ * - block/bsg-lib.c|100| <<bsg_map_buffer>> buf->sg_cnt = blk_rq_map_sg(req->q, req, buf->sg_list);
+ * - drivers/block/DAC960.c|3354| <<DAC960_process_queue>> Command->SegmentCount = blk_rq_map_sg(req_q,
+ * - drivers/block/DAC960.c|3433| <<DAC960_queue_partial_rw>> (void )blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
+ * - drivers/block/cciss.c|3340| <<do_cciss_request>> seg = blk_rq_map_sg(q, creq, tmp_sg);
+ * - drivers/block/cpqarray.c|936| <<do_ida_request>> seg = blk_rq_map_sg(q, creq, tmp_sg);
+ * - drivers/block/mtip32xx/mtip32xx.c|3727| <<mtip_submit_request>> nents = blk_rq_map_sg(hctx->queue, rq, cmd->sg);
+ * - drivers/block/skd_main.c|894| <<skd_preop_sg_list>> n_sg = blk_rq_map_sg(skdev->queue, req, sg);
+ * - drivers/block/sunvdc.c|630| <<__create_rw_desc>> nsg = blk_rq_map_sg(req->q, req, sg);
+ * - drivers/block/sx8.c|873| <<carm_rq_fn>> n_elem = blk_rq_map_sg(q, rq, sg);
+ * - drivers/block/virtio_blk.c|204| <<virtio_queue_rq>> num = blk_rq_map_sg(hctx->queue, vbr->req, vbr->sg);
+ * - drivers/block/xen-blkfront.c|745| <<blkif_queue_rw_req>> num_sg = blk_rq_map_sg(req->q, req, rinfo->shadow[id].sg);
+ * - drivers/ide/ide-io.c|229| <<ide_map_sg>> cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
+ * - drivers/memstick/core/ms_block.c|1907| <<msb_io_work>> blk_rq_map_sg(msb->queue, msb->req, sg);
+ * - drivers/memstick/core/mspro_block.c|707| <<mspro_block_issue_req>> msb->seg_count = blk_rq_map_sg(msb->block_req->q,
+ * - drivers/mmc/card/queue.c|478| <<mmc_queue_packed_map_sg>> sg_len += blk_rq_map_sg(mq->queue, req, __sg);
+ * - drivers/mmc/card/queue.c|504| <<mmc_queue_map_sg>> return blk_rq_map_sg(mq->queue, mqrq->req, mqrq->sg);
+ * - drivers/mmc/card/queue.c|513| <<mmc_queue_map_sg>> sg_len = blk_rq_map_sg(mq->queue, mqrq->req, mqrq->bounce_sg);
+ * - drivers/mtd/ubi/block.c|310| <<ubiblock_do_work>> blk_rq_map_sg(req->q, req, pdu->usgl.sg);
+ * - drivers/nvme/host/pci.c|573| <<nvme_map_data>> iod->nents = blk_rq_map_sg(q, req, iod->sg);
+ * - drivers/scsi/scsi_lib.c|1097| <<scsi_init_sgtable>> count = blk_rq_map_sg(req->q, req, sdb->table.sgl);
+ * - drivers/scsi/scsi_transport_fc.c|3683| <<fc_bsg_map_buffer>> buf->sg_cnt = blk_rq_map_sg(req->q, req, buf->sg_list);
+ * - drivers/staging/i2o/i2o_block.c|324| <<i2o_block_sglist_alloc>> nents = blk_rq_map_sg(ireq->req->q, ireq->req, ireq->sg_table);
+ */
int blk_rq_map_sg(struct request_queue *q, struct request *rq,
struct scatterlist *sglist)
{
diff --git a/drivers/block/oracleasm/driver.c b/drivers/block/oracleasm/driver.c
index 5632ee0f1a51..733fc36e1a34 100644
--- a/drivers/block/oracleasm/driver.c
+++ b/drivers/block/oracleasm/driver.c
@@ -961,6 +961,10 @@ out:
} /* asm_update_user_ioc() */
+/*
+ * called by:
+ * - drivers/block/oracleasm/driver.c|1121| <<asm_submit_io>> r = asm_request_alloc();
+ */
static struct asm_request *asm_request_alloc(void)
{
struct asm_request *r;
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 644522b660b7..c7f17d66af55 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -364,9 +364,18 @@ static struct grant *get_grant(grant_ref_t *gref_head,
if (gnt_list_entry->gref != GRANT_INVALID_REF)
return gnt_list_entry;
+ /*
+ * 如果是persistent上面有可能就return了吧
+ * gfn根本用不到
+ */
+
/* Assign a gref to this page */
gnt_list_entry->gref = gnttab_claim_grant_reference(gref_head);
BUG_ON(gnt_list_entry->gref == -ENOSPC);
+ /*
+ * 如果是persistent就不用把gfn map到grant
+ * 因为要copy
+ */
if (info->feature_persistent)
grant_foreign_access(gnt_list_entry, info);
else {
@@ -584,6 +593,10 @@ struct setup_rw_req {
struct blkif_request *extra_ring_req;
};
+/*
+ * 在以下使用blkif_setup_rw_req_grant():
+ * - drivers/block/xen-blkfront.c|832| <<blkif_queue_rw_req>> blkif_setup_rw_req_grant,
+ */
static void blkif_setup_rw_req_grant(unsigned long gfn, unsigned int offset,
unsigned int len, void *data)
{
@@ -615,22 +628,35 @@ static void blkif_setup_rw_req_grant(unsigned long gfn, unsigned int offset,
if ((ring_req->operation == BLKIF_OP_INDIRECT) &&
(grant_idx % GRANTS_PER_INDIRECT_FRAME == 0)) {
+ /* struct blkif_request_segment *segments; */
if (setup->segments)
kunmap_atomic(setup->segments);
n = grant_idx / GRANTS_PER_INDIRECT_FRAME;
gnt_list_entry = get_indirect_grant(&setup->gref_head, rinfo);
shadow->indirect_grants[n] = gnt_list_entry;
+ /*
+ * struct blkif_request_segment *segments;
+ *
+ * 这里调用kmap因为要用这个page存储struct blkif_request_segment
+ * INDIRECT!!!
+ */
setup->segments = kmap_atomic(gnt_list_entry->page);
ring_req->u.indirect.indirect_grefs[n] = gnt_list_entry->gref;
}
+ /*
+ * 分配struct grant
+ */
gnt_list_entry = get_grant(&setup->gref_head, gfn, rinfo);
ref = gnt_list_entry->gref;
/*
* All the grants are stored in the shadow of the first
* request. Therefore we have to use the global index.
*/
+ /*
+ * struct grant **grants_used;
+ */
shadow->grants_used[setup->grant_idx] = gnt_list_entry;
if (setup->need_copy) {
@@ -692,6 +718,10 @@ static void blkif_setup_extra_req(struct blkif_request *first,
second->operation = first->operation;
}
+/*
+ * called by:
+ * - drivers/block/xen-blkfront.c|866| <<blkif_queue_request>> return blkif_queue_rw_req(req, rinfo);
+ */
static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *rinfo)
{
struct blkfront_info *info = rinfo->dev_info;
@@ -703,6 +733,11 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
.grant_idx = 0,
.segments = NULL,
.rinfo = rinfo,
+ /*
+ * 如果是write需要立刻copy, 否则可以等到完成再copy
+ *
+ * 如果cmd_flags=20000010, rq_data_dir(req)返回0
+ */
.need_copy = rq_data_dir(req) && info->feature_persistent,
};
@@ -740,8 +775,14 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
}
/* Fill out a communications ring structure. */
+ /*
+ * 获得rinfo->shadow[id]和blkif_request
+ */
id = blkif_ring_get_request(rinfo, req, &ring_req);
+ /*
+ * 除了block/bsg-lib.c都是只有driver在调用
+ */
num_sg = blk_rq_map_sg(req->q, req, rinfo->shadow[id].sg);
num_grant = 0;
/* Calculate the number of grant used */
@@ -760,6 +801,9 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
* BLKIF_OP_WRITE
*/
BUG_ON(req->cmd_flags & (REQ_FLUSH | REQ_FUA));
+ /*
+ * !!!! 这里的operation是BLKIF_OP_INDIRECT
+ */
ring_req->operation = BLKIF_OP_INDIRECT;
ring_req->u.indirect.indirect_op = rq_data_dir(req) ?
BLKIF_OP_WRITE : BLKIF_OP_READ;
@@ -769,6 +813,9 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
} else {
ring_req->u.rw.sector_number = (blkif_sector_t)blk_rq_pos(req);
ring_req->u.rw.handle = info->handle;
+ /*
+ * !!!! 这里的operation是BLKIF_OP_READ或者BLKIF_OP_WRITE
+ */
ring_req->operation = rq_data_dir(req) ?
BLKIF_OP_WRITE : BLKIF_OP_READ;
if (req->cmd_flags & (REQ_FLUSH | REQ_FUA)) {
@@ -811,6 +858,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
}
}
+ /* ring_req的类型是struct blkif_request */
setup.ring_req = ring_req;
setup.id = id;
@@ -821,7 +869,16 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
for_each_sg(rinfo->shadow[id].sg, sg, num_sg, i) {
BUG_ON(sg->offset + sg->length > PAGE_SIZE);
+ /*
+ * 如果是write需要立刻copy, 否则可以等到完成再copy
+ *
+ * 如果cmd_flags=20000010, rq_data_dir(req)返回0
+ */
if (setup.need_copy) {
+ /*
+ * 这里没有真正copy, 只是map
+ * copy在blkif_setup_rw_req_grant()完成
+ */
setup.bvec_off = sg->offset;
setup.bvec_data = kmap_atomic(sg_page(sg));
}
@@ -907,6 +964,7 @@ static int blkif_queue_rq(struct blk_mq_hw_ctx *hctx,
if (blkif_queue_request(qd->rq, rinfo))
goto out_busy;
+ /* 用evtchn notify */
flush_requests(rinfo);
spin_unlock_irqrestore(&rinfo->ring_lock, flags);
return BLK_MQ_RQ_QUEUE_OK;
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 7086fb237b50..fff0fe94f146 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -777,6 +777,13 @@ void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count)
}
EXPORT_SYMBOL_GPL(gnttab_batch_copy);
+/*
+ * called by:
+ * - drivers/block/xen-blkfront.c|863| <<blkif_queue_rw_req>> gnttab_foreach_grant_in_range(sg_page(sg),
+ * - drivers/block/xen-blkfront.c|1550| <<blkif_completion>> gnttab_foreach_grant_in_range(sg_page(sg),
+ * - drivers/net/xen-netfront.c|709| <<xennet_make_txreqs>> gnttab_foreach_grant_in_range(page, offset, len,
+ * - include/xen/grant_table.h|264| <<gnttab_for_one_grant>> gnttab_foreach_grant_in_range(page, offset, len, fn, data);
+ */
void gnttab_foreach_grant_in_range(struct page *page,
unsigned int offset,
unsigned int len,
@@ -787,6 +794,9 @@ void gnttab_foreach_grant_in_range(struct page *page,
unsigned int glen;
unsigned long xen_pfn;
+ /*
+ * 当前的page从offset剩下的, 或者len
+ */
len = min_t(unsigned int, PAGE_SIZE - offset, len);
goffset = xen_offset_in_page(offset);
--
2.17.1