Skip to content

Commit 6832298

Browse files
Christof SchmittJames Bottomley
authored andcommitted
[SCSI] zfcp: Report scatter-gather limits to SCSI and block layer
Instead of dealing with large segments in the scatter-gather lists in zfcp_qdio.c, report the limits to the upper layers. With these limits in place, the code for mapping large data blocks to multiple sbales can be removed. Reviewed-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
1 parent 883c98f commit 6832298

File tree

5 files changed

+19
-34
lines changed

5 files changed

+19
-34
lines changed

drivers/s390/scsi/zfcp_aux.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,10 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device)
545545
&zfcp_sysfs_adapter_attrs))
546546
goto failed;
547547

548+
/* report size limit per scatter-gather segment */
549+
adapter->dma_parms.max_segment_size = ZFCP_QDIO_SBALE_LEN;
550+
adapter->ccw_device->dev.dma_parms = &adapter->dma_parms;
551+
548552
if (!zfcp_adapter_scsi_register(adapter))
549553
return adapter;
550554

drivers/s390/scsi/zfcp_def.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ struct zfcp_adapter {
205205
struct work_struct scan_work;
206206
struct service_level service_level;
207207
struct workqueue_struct *work_queue;
208+
struct device_dma_parameters dma_parms;
208209
};
209210

210211
struct zfcp_port {

drivers/s390/scsi/zfcp_qdio.c

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -206,35 +206,6 @@ static void zfcp_qdio_undo_sbals(struct zfcp_qdio *qdio,
206206
zfcp_qdio_zero_sbals(sbal, first, count);
207207
}
208208

209-
static int zfcp_qdio_fill_sbals(struct zfcp_qdio *qdio,
210-
struct zfcp_qdio_req *q_req,
211-
unsigned int sbtype, void *start_addr,
212-
unsigned int total_length)
213-
{
214-
struct qdio_buffer_element *sbale;
215-
unsigned long remaining, length;
216-
void *addr;
217-
218-
/* split segment up */
219-
for (addr = start_addr, remaining = total_length; remaining > 0;
220-
addr += length, remaining -= length) {
221-
sbale = zfcp_qdio_sbale_next(qdio, q_req, sbtype);
222-
if (!sbale) {
223-
atomic_inc(&qdio->req_q_full);
224-
zfcp_qdio_undo_sbals(qdio, q_req);
225-
return -EINVAL;
226-
}
227-
228-
/* new piece must not exceed next page boundary */
229-
length = min(remaining,
230-
(PAGE_SIZE - ((unsigned long)addr &
231-
(PAGE_SIZE - 1))));
232-
sbale->addr = addr;
233-
sbale->length = length;
234-
}
235-
return 0;
236-
}
237-
238209
/**
239210
* zfcp_qdio_sbals_from_sg - fill SBALs from scatter-gather list
240211
* @fsf_req: request to be processed
@@ -248,7 +219,7 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
248219
int max_sbals)
249220
{
250221
struct qdio_buffer_element *sbale;
251-
int retval, bytes = 0;
222+
int bytes = 0;
252223

253224
/* figure out last allowed SBAL */
254225
zfcp_qdio_sbal_limit(qdio, q_req, max_sbals);
@@ -258,10 +229,16 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
258229
sbale->flags |= sbtype;
259230

260231
for (; sg; sg = sg_next(sg)) {
261-
retval = zfcp_qdio_fill_sbals(qdio, q_req, sbtype,
262-
sg_virt(sg), sg->length);
263-
if (retval < 0)
264-
return retval;
232+
sbale = zfcp_qdio_sbale_next(qdio, q_req, sbtype);
233+
if (!sbale) {
234+
atomic_inc(&qdio->req_q_full);
235+
zfcp_qdio_undo_sbals(qdio, q_req);
236+
return -EINVAL;
237+
}
238+
239+
sbale->addr = sg_virt(sg);
240+
sbale->length = sg->length;
241+
265242
bytes += sg->length;
266243
}
267244

drivers/s390/scsi/zfcp_qdio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#include <asm/qdio.h>
1313

14+
#define ZFCP_QDIO_SBALE_LEN PAGE_SIZE
15+
1416
/**
1517
* struct zfcp_qdio_queue - qdio queue buffer, zfcp index and free count
1618
* @sbal: qdio buffers

drivers/s390/scsi/zfcp_scsi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ struct zfcp_data zfcp_data = {
682682
.use_clustering = 1,
683683
.sdev_attrs = zfcp_sysfs_sdev_attrs,
684684
.max_sectors = (ZFCP_MAX_SBALES_PER_REQ * 8),
685+
.dma_boundary = ZFCP_QDIO_SBALE_LEN - 1,
685686
.shost_attrs = zfcp_sysfs_shost_attrs,
686687
},
687688
};

0 commit comments

Comments
 (0)