2 * Block driver for s390 storage class memory.
4 * Copyright IBM Corp. 2012
5 * Author(s): Sebastian Ott <sebott@linux.vnet.ibm.com>
8 #define KMSG_COMPONENT "scm_block"
9 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11 #include <linux/interrupt.h>
12 #include <linux/spinlock.h>
13 #include <linux/module.h>
14 #include <linux/blkdev.h>
15 #include <linux/genhd.h>
16 #include <linux/slab.h>
17 #include <linux/list.h>
21 debug_info_t
*scm_debug
;
23 static DEFINE_SPINLOCK(list_lock
);
24 static LIST_HEAD(inactive_requests
);
25 static unsigned int nr_requests
= 64;
26 static atomic_t nr_devices
= ATOMIC_INIT(0);
27 module_param(nr_requests
, uint
, S_IRUGO
);
28 MODULE_PARM_DESC(nr_requests
, "Number of parallel requests.");
30 MODULE_DESCRIPTION("Block driver for s390 storage class memory.");
31 MODULE_LICENSE("GPL");
32 MODULE_ALIAS("scm:scmdev*");
34 static void __scm_free_rq(struct scm_request
*scmrq
)
36 struct aob_rq_header
*aobrq
= to_aobrq(scmrq
);
38 free_page((unsigned long) scmrq
->aob
);
39 free_page((unsigned long) scmrq
->aidaw
);
40 __scm_free_rq_cluster(scmrq
);
44 static void scm_free_rqs(void)
46 struct list_head
*iter
, *safe
;
47 struct scm_request
*scmrq
;
49 spin_lock_irq(&list_lock
);
50 list_for_each_safe(iter
, safe
, &inactive_requests
) {
51 scmrq
= list_entry(iter
, struct scm_request
, list
);
52 list_del(&scmrq
->list
);
55 spin_unlock_irq(&list_lock
);
58 static int __scm_alloc_rq(void)
60 struct aob_rq_header
*aobrq
;
61 struct scm_request
*scmrq
;
63 aobrq
= kzalloc(sizeof(*aobrq
) + sizeof(*scmrq
), GFP_KERNEL
);
67 scmrq
= (void *) aobrq
->data
;
68 scmrq
->aidaw
= (void *) get_zeroed_page(GFP_DMA
);
69 scmrq
->aob
= (void *) get_zeroed_page(GFP_DMA
);
70 if (!scmrq
->aob
|| !scmrq
->aidaw
) {
75 if (__scm_alloc_rq_cluster(scmrq
)) {
80 INIT_LIST_HEAD(&scmrq
->list
);
81 spin_lock_irq(&list_lock
);
82 list_add(&scmrq
->list
, &inactive_requests
);
83 spin_unlock_irq(&list_lock
);
88 static int scm_alloc_rqs(unsigned int nrqs
)
92 while (nrqs
-- && !ret
)
93 ret
= __scm_alloc_rq();
98 static struct scm_request
*scm_request_fetch(void)
100 struct scm_request
*scmrq
= NULL
;
102 spin_lock(&list_lock
);
103 if (list_empty(&inactive_requests
))
105 scmrq
= list_first_entry(&inactive_requests
, struct scm_request
, list
);
106 list_del(&scmrq
->list
);
108 spin_unlock(&list_lock
);
112 static void scm_request_done(struct scm_request
*scmrq
)
116 spin_lock_irqsave(&list_lock
, flags
);
117 list_add(&scmrq
->list
, &inactive_requests
);
118 spin_unlock_irqrestore(&list_lock
, flags
);
121 static bool scm_permit_request(struct scm_blk_dev
*bdev
, struct request
*req
)
123 return rq_data_dir(req
) != WRITE
|| bdev
->state
!= SCM_WR_PROHIBIT
;
126 static void scm_request_prepare(struct scm_request
*scmrq
)
128 struct scm_blk_dev
*bdev
= scmrq
->bdev
;
129 struct scm_device
*scmdev
= bdev
->gendisk
->private_data
;
130 struct aidaw
*aidaw
= scmrq
->aidaw
;
131 struct msb
*msb
= &scmrq
->aob
->msb
[0];
132 struct req_iterator iter
;
136 scmrq
->aob
->request
.msb_count
= 1;
137 msb
->scm_addr
= scmdev
->address
+
138 ((u64
) blk_rq_pos(scmrq
->request
) << 9);
139 msb
->oc
= (rq_data_dir(scmrq
->request
) == READ
) ?
140 MSB_OC_READ
: MSB_OC_WRITE
;
141 msb
->flags
|= MSB_FLAG_IDA
;
142 msb
->data_addr
= (u64
) aidaw
;
144 rq_for_each_segment(bv
, scmrq
->request
, iter
) {
145 WARN_ON(bv
.bv_offset
);
146 msb
->blk_count
+= bv
.bv_len
>> 12;
147 aidaw
->data_addr
= (u64
) page_address(bv
.bv_page
);
152 static inline void scm_request_init(struct scm_blk_dev
*bdev
,
153 struct scm_request
*scmrq
,
156 struct aob_rq_header
*aobrq
= to_aobrq(scmrq
);
157 struct aob
*aob
= scmrq
->aob
;
159 memset(aob
, 0, sizeof(*aob
));
160 memset(scmrq
->aidaw
, 0, PAGE_SIZE
);
161 aobrq
->scmdev
= bdev
->scmdev
;
162 aob
->request
.cmd_code
= ARQB_CMD_MOVE
;
163 aob
->request
.data
= (u64
) aobrq
;
164 scmrq
->request
= req
;
168 scm_request_cluster_init(scmrq
);
171 static void scm_ensure_queue_restart(struct scm_blk_dev
*bdev
)
173 if (atomic_read(&bdev
->queued_reqs
)) {
174 /* Queue restart is triggered by the next interrupt. */
177 blk_delay_queue(bdev
->rq
, SCM_QUEUE_DELAY
);
180 void scm_request_requeue(struct scm_request
*scmrq
)
182 struct scm_blk_dev
*bdev
= scmrq
->bdev
;
184 scm_release_cluster(scmrq
);
185 blk_requeue_request(bdev
->rq
, scmrq
->request
);
186 atomic_dec(&bdev
->queued_reqs
);
187 scm_request_done(scmrq
);
188 scm_ensure_queue_restart(bdev
);
191 void scm_request_finish(struct scm_request
*scmrq
)
193 struct scm_blk_dev
*bdev
= scmrq
->bdev
;
195 scm_release_cluster(scmrq
);
196 blk_end_request_all(scmrq
->request
, scmrq
->error
);
197 atomic_dec(&bdev
->queued_reqs
);
198 scm_request_done(scmrq
);
201 static void scm_blk_request(struct request_queue
*rq
)
203 struct scm_device
*scmdev
= rq
->queuedata
;
204 struct scm_blk_dev
*bdev
= dev_get_drvdata(&scmdev
->dev
);
205 struct scm_request
*scmrq
;
209 while ((req
= blk_peek_request(rq
))) {
210 if (req
->cmd_type
!= REQ_TYPE_FS
) {
211 blk_start_request(req
);
212 blk_dump_rq_flags(req
, KMSG_COMPONENT
" bad request");
213 blk_end_request_all(req
, -EIO
);
217 if (!scm_permit_request(bdev
, req
)) {
218 scm_ensure_queue_restart(bdev
);
221 scmrq
= scm_request_fetch();
223 SCM_LOG(5, "no request");
224 scm_ensure_queue_restart(bdev
);
227 scm_request_init(bdev
, scmrq
, req
);
228 if (!scm_reserve_cluster(scmrq
)) {
229 SCM_LOG(5, "cluster busy");
230 scm_request_done(scmrq
);
233 if (scm_need_cluster_request(scmrq
)) {
234 atomic_inc(&bdev
->queued_reqs
);
235 blk_start_request(req
);
236 scm_initiate_cluster_request(scmrq
);
239 scm_request_prepare(scmrq
);
240 atomic_inc(&bdev
->queued_reqs
);
241 blk_start_request(req
);
243 ret
= eadm_start_aob(scmrq
->aob
);
245 SCM_LOG(5, "no subchannel");
246 scm_request_requeue(scmrq
);
252 static void __scmrq_log_error(struct scm_request
*scmrq
)
254 struct aob
*aob
= scmrq
->aob
;
256 if (scmrq
->error
== -ETIMEDOUT
)
257 SCM_LOG(1, "Request timeout");
259 SCM_LOG(1, "Request error");
260 SCM_LOG_HEX(1, &aob
->response
, sizeof(aob
->response
));
263 SCM_LOG(1, "Retry request");
265 pr_err("An I/O operation to SCM failed with rc=%d\n",
269 void scm_blk_irq(struct scm_device
*scmdev
, void *data
, int error
)
271 struct scm_request
*scmrq
= data
;
272 struct scm_blk_dev
*bdev
= scmrq
->bdev
;
274 scmrq
->error
= error
;
276 __scmrq_log_error(scmrq
);
278 spin_lock(&bdev
->lock
);
279 list_add_tail(&scmrq
->list
, &bdev
->finished_requests
);
280 spin_unlock(&bdev
->lock
);
281 tasklet_hi_schedule(&bdev
->tasklet
);
284 static void scm_blk_handle_error(struct scm_request
*scmrq
)
286 struct scm_blk_dev
*bdev
= scmrq
->bdev
;
289 if (scmrq
->error
!= -EIO
)
292 /* For -EIO the response block is valid. */
293 switch (scmrq
->aob
->response
.eqc
) {
294 case EQC_WR_PROHIBIT
:
295 spin_lock_irqsave(&bdev
->lock
, flags
);
296 if (bdev
->state
!= SCM_WR_PROHIBIT
)
297 pr_info("%lx: Write access to the SCM increment is suspended\n",
298 (unsigned long) bdev
->scmdev
->address
);
299 bdev
->state
= SCM_WR_PROHIBIT
;
300 spin_unlock_irqrestore(&bdev
->lock
, flags
);
307 if (!eadm_start_aob(scmrq
->aob
))
311 spin_lock_irqsave(&bdev
->rq_lock
, flags
);
312 scm_request_requeue(scmrq
);
313 spin_unlock_irqrestore(&bdev
->rq_lock
, flags
);
316 static void scm_blk_tasklet(struct scm_blk_dev
*bdev
)
318 struct scm_request
*scmrq
;
321 spin_lock_irqsave(&bdev
->lock
, flags
);
322 while (!list_empty(&bdev
->finished_requests
)) {
323 scmrq
= list_first_entry(&bdev
->finished_requests
,
324 struct scm_request
, list
);
325 list_del(&scmrq
->list
);
326 spin_unlock_irqrestore(&bdev
->lock
, flags
);
328 if (scmrq
->error
&& scmrq
->retries
-- > 0) {
329 scm_blk_handle_error(scmrq
);
331 /* Request restarted or requeued, handle next. */
332 spin_lock_irqsave(&bdev
->lock
, flags
);
336 if (scm_test_cluster_request(scmrq
)) {
337 scm_cluster_request_irq(scmrq
);
338 spin_lock_irqsave(&bdev
->lock
, flags
);
342 scm_request_finish(scmrq
);
343 spin_lock_irqsave(&bdev
->lock
, flags
);
345 spin_unlock_irqrestore(&bdev
->lock
, flags
);
346 /* Look out for more requests. */
347 blk_run_queue(bdev
->rq
);
350 static const struct block_device_operations scm_blk_devops
= {
351 .owner
= THIS_MODULE
,
354 int scm_blk_dev_setup(struct scm_blk_dev
*bdev
, struct scm_device
*scmdev
)
356 struct request_queue
*rq
;
357 int len
, ret
= -ENOMEM
;
358 unsigned int devindex
, nr_max_blk
;
360 devindex
= atomic_inc_return(&nr_devices
) - 1;
361 /* scma..scmz + scmaa..scmzz */
362 if (devindex
> 701) {
367 bdev
->scmdev
= scmdev
;
368 bdev
->state
= SCM_OPER
;
369 spin_lock_init(&bdev
->rq_lock
);
370 spin_lock_init(&bdev
->lock
);
371 INIT_LIST_HEAD(&bdev
->finished_requests
);
372 atomic_set(&bdev
->queued_reqs
, 0);
373 tasklet_init(&bdev
->tasklet
,
374 (void (*)(unsigned long)) scm_blk_tasklet
,
375 (unsigned long) bdev
);
377 rq
= blk_init_queue(scm_blk_request
, &bdev
->rq_lock
);
382 nr_max_blk
= min(scmdev
->nr_max_block
,
383 (unsigned int) (PAGE_SIZE
/ sizeof(struct aidaw
)));
385 blk_queue_logical_block_size(rq
, 1 << 12);
386 blk_queue_max_hw_sectors(rq
, nr_max_blk
<< 3); /* 8 * 512 = blk_size */
387 blk_queue_max_segments(rq
, nr_max_blk
);
388 queue_flag_set_unlocked(QUEUE_FLAG_NONROT
, rq
);
389 queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM
, rq
);
390 scm_blk_dev_cluster_setup(bdev
);
392 bdev
->gendisk
= alloc_disk(SCM_NR_PARTS
);
396 rq
->queuedata
= scmdev
;
397 bdev
->gendisk
->driverfs_dev
= &scmdev
->dev
;
398 bdev
->gendisk
->private_data
= scmdev
;
399 bdev
->gendisk
->fops
= &scm_blk_devops
;
400 bdev
->gendisk
->queue
= rq
;
401 bdev
->gendisk
->major
= scm_major
;
402 bdev
->gendisk
->first_minor
= devindex
* SCM_NR_PARTS
;
404 len
= snprintf(bdev
->gendisk
->disk_name
, DISK_NAME_LEN
, "scm");
406 len
+= snprintf(bdev
->gendisk
->disk_name
+ len
,
407 DISK_NAME_LEN
- len
, "%c",
408 'a' + (devindex
/ 26) - 1);
409 devindex
= devindex
% 26;
411 snprintf(bdev
->gendisk
->disk_name
+ len
, DISK_NAME_LEN
- len
, "%c",
414 /* 512 byte sectors */
415 set_capacity(bdev
->gendisk
, scmdev
->size
>> 9);
416 add_disk(bdev
->gendisk
);
420 blk_cleanup_queue(rq
);
422 atomic_dec(&nr_devices
);
426 void scm_blk_dev_cleanup(struct scm_blk_dev
*bdev
)
428 tasklet_kill(&bdev
->tasklet
);
429 del_gendisk(bdev
->gendisk
);
430 blk_cleanup_queue(bdev
->gendisk
->queue
);
431 put_disk(bdev
->gendisk
);
434 void scm_blk_set_available(struct scm_blk_dev
*bdev
)
438 spin_lock_irqsave(&bdev
->lock
, flags
);
439 if (bdev
->state
== SCM_WR_PROHIBIT
)
440 pr_info("%lx: Write access to the SCM increment is restored\n",
441 (unsigned long) bdev
->scmdev
->address
);
442 bdev
->state
= SCM_OPER
;
443 spin_unlock_irqrestore(&bdev
->lock
, flags
);
446 static int __init
scm_blk_init(void)
450 if (!scm_cluster_size_valid())
453 ret
= register_blkdev(0, "scm");
458 ret
= scm_alloc_rqs(nr_requests
);
462 scm_debug
= debug_register("scm_log", 16, 1, 16);
468 debug_register_view(scm_debug
, &debug_hex_ascii_view
);
469 debug_set_level(scm_debug
, 2);
471 ret
= scm_drv_init();
478 debug_unregister(scm_debug
);
481 unregister_blkdev(scm_major
, "scm");
485 module_init(scm_blk_init
);
487 static void __exit
scm_blk_cleanup(void)
490 debug_unregister(scm_debug
);
492 unregister_blkdev(scm_major
, "scm");
494 module_exit(scm_blk_cleanup
);