Skip to content

Commit 2db01da

Browse files
julianwiedmannVasily Gorbik
authored andcommitted
s390/qdio: fill SBALEs with absolute addresses
sbale->addr holds an absolute address (or for some FCP usage, an opaque request ID), and should only be used with proper virt/phys translation. Signed-off-by: Julian Wiedmann <[email protected]> Reviewed-by: Benjamin Block <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
1 parent e9091ff commit 2db01da

File tree

5 files changed

+21
-20
lines changed

5 files changed

+21
-20
lines changed

arch/s390/include/asm/qdio.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ struct slib {
201201
* @scount: SBAL count
202202
* @sflags: whole SBAL flags
203203
* @length: length
204-
* @addr: address
204+
* @addr: absolute data address
205205
*/
206206
struct qdio_buffer_element {
207207
u8 eflags;
@@ -211,7 +211,7 @@ struct qdio_buffer_element {
211211
u8 scount;
212212
u8 sflags;
213213
u32 length;
214-
void *addr;
214+
u64 addr;
215215
} __attribute__ ((packed, aligned(16)));
216216

217217
/**

drivers/s390/net/qeth_core_main.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,9 +1128,10 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
11281128
qeth_tx_complete_buf(buf, error, budget);
11291129

11301130
for (i = 0; i < queue->max_elements; ++i) {
1131-
if (buf->buffer->element[i].addr && buf->is_header[i])
1132-
kmem_cache_free(qeth_core_header_cache,
1133-
buf->buffer->element[i].addr);
1131+
void *data = phys_to_virt(buf->buffer->element[i].addr);
1132+
1133+
if (data && buf->is_header[i])
1134+
kmem_cache_free(qeth_core_header_cache, data);
11341135
buf->is_header[i] = 0;
11351136
}
11361137

@@ -2641,7 +2642,8 @@ static int qeth_init_input_buffer(struct qeth_card *card,
26412642
buf->pool_entry = pool_entry;
26422643
for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
26432644
buf->buffer->element[i].length = PAGE_SIZE;
2644-
buf->buffer->element[i].addr = pool_entry->elements[i];
2645+
buf->buffer->element[i].addr =
2646+
virt_to_phys(pool_entry->elements[i]);
26452647
if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
26462648
buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;
26472649
else
@@ -3459,9 +3461,8 @@ static void qeth_qdio_cq_handler(struct qeth_card *card, unsigned int qdio_err,
34593461

34603462
while ((e < QDIO_MAX_ELEMENTS_PER_BUFFER) &&
34613463
buffer->element[e].addr) {
3462-
unsigned long phys_aob_addr;
3464+
unsigned long phys_aob_addr = buffer->element[e].addr;
34633465

3464-
phys_aob_addr = (unsigned long) buffer->element[e].addr;
34653466
qeth_qdio_handle_aob(card, phys_aob_addr);
34663467
++e;
34673468
}
@@ -3750,7 +3751,7 @@ static unsigned int __qeth_fill_buffer(struct sk_buff *skb,
37503751
elem_length = min_t(unsigned int, length,
37513752
PAGE_SIZE - offset_in_page(data));
37523753

3753-
buffer->element[element].addr = data;
3754+
buffer->element[element].addr = virt_to_phys(data);
37543755
buffer->element[element].length = elem_length;
37553756
length -= elem_length;
37563757
if (is_first_elem) {
@@ -3780,7 +3781,7 @@ static unsigned int __qeth_fill_buffer(struct sk_buff *skb,
37803781
elem_length = min_t(unsigned int, length,
37813782
PAGE_SIZE - offset_in_page(data));
37823783

3783-
buffer->element[element].addr = data;
3784+
buffer->element[element].addr = virt_to_phys(data);
37843785
buffer->element[element].length = elem_length;
37853786
buffer->element[element].eflags =
37863787
SBAL_EFLAGS_MIDDLE_FRAG;
@@ -3820,7 +3821,7 @@ static unsigned int qeth_fill_buffer(struct qeth_qdio_out_buffer *buf,
38203821
int element = buf->next_element_to_fill;
38213822
is_first_elem = false;
38223823

3823-
buffer->element[element].addr = hdr;
3824+
buffer->element[element].addr = virt_to_phys(hdr);
38243825
buffer->element[element].length = hd_len;
38253826
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
38263827
/* remember to free cache-allocated qeth_hdr: */
@@ -5288,7 +5289,7 @@ static int qeth_extract_skb(struct qeth_card *card,
52885289
offset = 0;
52895290
}
52905291

5291-
hdr = element->addr + offset;
5292+
hdr = phys_to_virt(element->addr) + offset;
52925293
offset += sizeof(*hdr);
52935294
skb = NULL;
52945295

@@ -5387,7 +5388,7 @@ static int qeth_extract_skb(struct qeth_card *card,
53875388
walk_packet:
53885389
while (skb_len) {
53895390
int data_len = min(skb_len, (int)(element->length - offset));
5390-
char *data = element->addr + offset;
5391+
char *data = phys_to_virt(element->addr) + offset;
53915392

53925393
skb_len -= data_len;
53935394
offset += data_len;

drivers/s390/scsi/zfcp_fsf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2510,7 +2510,7 @@ void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx)
25102510
for (idx = 0; idx < QDIO_MAX_ELEMENTS_PER_BUFFER; idx++) {
25112511

25122512
sbale = &sbal->element[idx];
2513-
req_id = (unsigned long) sbale->addr;
2513+
req_id = sbale->addr;
25142514
fsf_req = zfcp_reqlist_find_rm(adapter->req_list, req_id);
25152515

25162516
if (!fsf_req) {

drivers/s390/scsi/zfcp_qdio.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err,
9898
memset(pl, 0,
9999
ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *));
100100
sbale = qdio->res_q[idx]->element;
101-
req_id = (u64) sbale->addr;
101+
req_id = sbale->addr;
102102
scount = min(sbale->scount + 1,
103103
ZFCP_QDIO_MAX_SBALS_PER_REQ + 1);
104104
/* incl. signaling SBAL */
@@ -199,7 +199,7 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
199199
q_req->sbal_number);
200200
return -EINVAL;
201201
}
202-
sbale->addr = sg_virt(sg);
202+
sbale->addr = sg_phys(sg);
203203
sbale->length = sg->length;
204204
}
205205
return 0;
@@ -418,7 +418,7 @@ int zfcp_qdio_open(struct zfcp_qdio *qdio)
418418
sbale->length = 0;
419419
sbale->eflags = SBAL_EFLAGS_LAST_ENTRY;
420420
sbale->sflags = 0;
421-
sbale->addr = NULL;
421+
sbale->addr = 0;
422422
}
423423

424424
if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, 0, QDIO_MAX_BUFFERS_PER_Q))

drivers/s390/scsi/zfcp_qdio.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
122122
% QDIO_MAX_BUFFERS_PER_Q;
123123

124124
sbale = zfcp_qdio_sbale_req(qdio, q_req);
125-
sbale->addr = (void *) req_id;
125+
sbale->addr = req_id;
126126
sbale->eflags = 0;
127127
sbale->sflags = SBAL_SFLAGS0_COMMAND | sbtype;
128128

129129
if (unlikely(!data))
130130
return;
131131
sbale++;
132-
sbale->addr = data;
132+
sbale->addr = virt_to_phys(data);
133133
sbale->length = len;
134134
}
135135

@@ -152,7 +152,7 @@ void zfcp_qdio_fill_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
152152
BUG_ON(q_req->sbale_curr == qdio->max_sbale_per_sbal - 1);
153153
q_req->sbale_curr++;
154154
sbale = zfcp_qdio_sbale_curr(qdio, q_req);
155-
sbale->addr = data;
155+
sbale->addr = virt_to_phys(data);
156156
sbale->length = len;
157157
}
158158

0 commit comments

Comments
 (0)