linux/drivers/s390/block/scm_blk.c
<<
>>
Prefs
   1/*
   2 * Block driver for s390 storage class memory.
   3 *
   4 * Copyright IBM Corp. 2012
   5 * Author(s): Sebastian Ott <sebott@linux.vnet.ibm.com>
   6 */
   7
   8#define KMSG_COMPONENT "scm_block"
   9#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  10
  11#include <linux/interrupt.h>
  12#include <linux/spinlock.h>
  13#include <linux/mempool.h>
  14#include <linux/module.h>
  15#include <linux/blkdev.h>
  16#include <linux/genhd.h>
  17#include <linux/slab.h>
  18#include <linux/list.h>
  19#include <asm/eadm.h>
  20#include "scm_blk.h"
  21
  22debug_info_t *scm_debug;
  23static int scm_major;
  24static mempool_t *aidaw_pool;
  25static DEFINE_SPINLOCK(list_lock);
  26static LIST_HEAD(inactive_requests);
  27static unsigned int nr_requests = 64;
  28static unsigned int nr_requests_per_io = 8;
  29static atomic_t nr_devices = ATOMIC_INIT(0);
  30module_param(nr_requests, uint, S_IRUGO);
  31MODULE_PARM_DESC(nr_requests, "Number of parallel requests.");
  32
  33module_param(nr_requests_per_io, uint, S_IRUGO);
  34MODULE_PARM_DESC(nr_requests_per_io, "Number of requests per IO.");
  35
  36MODULE_DESCRIPTION("Block driver for s390 storage class memory.");
  37MODULE_LICENSE("GPL");
  38MODULE_ALIAS("scm:scmdev*");
  39
  40static void __scm_free_rq(struct scm_request *scmrq)
  41{
  42        struct aob_rq_header *aobrq = to_aobrq(scmrq);
  43
  44        free_page((unsigned long) scmrq->aob);
  45        __scm_free_rq_cluster(scmrq);
  46        kfree(scmrq->request);
  47        kfree(aobrq);
  48}
  49
  50static void scm_free_rqs(void)
  51{
  52        struct list_head *iter, *safe;
  53        struct scm_request *scmrq;
  54
  55        spin_lock_irq(&list_lock);
  56        list_for_each_safe(iter, safe, &inactive_requests) {
  57                scmrq = list_entry(iter, struct scm_request, list);
  58                list_del(&scmrq->list);
  59                __scm_free_rq(scmrq);
  60        }
  61        spin_unlock_irq(&list_lock);
  62
  63        mempool_destroy(aidaw_pool);
  64}
  65
  66static int __scm_alloc_rq(void)
  67{
  68        struct aob_rq_header *aobrq;
  69        struct scm_request *scmrq;
  70
  71        aobrq = kzalloc(sizeof(*aobrq) + sizeof(*scmrq), GFP_KERNEL);
  72        if (!aobrq)
  73                return -ENOMEM;
  74
  75        scmrq = (void *) aobrq->data;
  76        scmrq->aob = (void *) get_zeroed_page(GFP_DMA);
  77        if (!scmrq->aob)
  78                goto free;
  79
  80        scmrq->request = kcalloc(nr_requests_per_io, sizeof(scmrq->request[0]),
  81                                 GFP_KERNEL);
  82        if (!scmrq->request)
  83                goto free;
  84
  85        if (__scm_alloc_rq_cluster(scmrq))
  86                goto free;
  87
  88        INIT_LIST_HEAD(&scmrq->list);
  89        spin_lock_irq(&list_lock);
  90        list_add(&scmrq->list, &inactive_requests);
  91        spin_unlock_irq(&list_lock);
  92
  93        return 0;
  94free:
  95        __scm_free_rq(scmrq);
  96        return -ENOMEM;
  97}
  98
  99static int scm_alloc_rqs(unsigned int nrqs)
 100{
 101        int ret = 0;
 102
 103        aidaw_pool = mempool_create_page_pool(max(nrqs/8, 1U), 0);
 104        if (!aidaw_pool)
 105                return -ENOMEM;
 106
 107        while (nrqs-- && !ret)
 108                ret = __scm_alloc_rq();
 109
 110        return ret;
 111}
 112
 113static struct scm_request *scm_request_fetch(void)
 114{
 115        struct scm_request *scmrq = NULL;
 116
 117        spin_lock(&list_lock);
 118        if (list_empty(&inactive_requests))
 119                goto out;
 120        scmrq = list_first_entry(&inactive_requests, struct scm_request, list);
 121        list_del(&scmrq->list);
 122out:
 123        spin_unlock(&list_lock);
 124        return scmrq;
 125}
 126
 127static void scm_request_done(struct scm_request *scmrq)
 128{
 129        unsigned long flags;
 130        struct msb *msb;
 131        u64 aidaw;
 132        int i;
 133
 134        for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++) {
 135                msb = &scmrq->aob->msb[i];
 136                aidaw = msb->data_addr;
 137
 138                if ((msb->flags & MSB_FLAG_IDA) && aidaw &&
 139                    IS_ALIGNED(aidaw, PAGE_SIZE))
 140                        mempool_free(virt_to_page(aidaw), aidaw_pool);
 141        }
 142
 143        spin_lock_irqsave(&list_lock, flags);
 144        list_add(&scmrq->list, &inactive_requests);
 145        spin_unlock_irqrestore(&list_lock, flags);
 146}
 147
 148static bool scm_permit_request(struct scm_blk_dev *bdev, struct request *req)
 149{
 150        return rq_data_dir(req) != WRITE || bdev->state != SCM_WR_PROHIBIT;
 151}
 152
 153static inline struct aidaw *scm_aidaw_alloc(void)
 154{
 155        struct page *page = mempool_alloc(aidaw_pool, GFP_ATOMIC);
 156
 157        return page ? page_address(page) : NULL;
 158}
 159
 160static inline unsigned long scm_aidaw_bytes(struct aidaw *aidaw)
 161{
 162        unsigned long _aidaw = (unsigned long) aidaw;
 163        unsigned long bytes = ALIGN(_aidaw, PAGE_SIZE) - _aidaw;
 164
 165        return (bytes / sizeof(*aidaw)) * PAGE_SIZE;
 166}
 167
 168struct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes)
 169{
 170        struct aidaw *aidaw;
 171
 172        if (scm_aidaw_bytes(scmrq->next_aidaw) >= bytes)
 173                return scmrq->next_aidaw;
 174
 175        aidaw = scm_aidaw_alloc();
 176        if (aidaw)
 177                memset(aidaw, 0, PAGE_SIZE);
 178        return aidaw;
 179}
 180
 181static int scm_request_prepare(struct scm_request *scmrq)
 182{
 183        struct scm_blk_dev *bdev = scmrq->bdev;
 184        struct scm_device *scmdev = bdev->gendisk->private_data;
 185        int pos = scmrq->aob->request.msb_count;
 186        struct msb *msb = &scmrq->aob->msb[pos];
 187        struct request *req = scmrq->request[pos];
 188        struct req_iterator iter;
 189        struct aidaw *aidaw;
 190        struct bio_vec bv;
 191
 192        aidaw = scm_aidaw_fetch(scmrq, blk_rq_bytes(req));
 193        if (!aidaw)
 194                return -ENOMEM;
 195
 196        msb->bs = MSB_BS_4K;
 197        scmrq->aob->request.msb_count++;
 198        msb->scm_addr = scmdev->address + ((u64) blk_rq_pos(req) << 9);
 199        msb->oc = (rq_data_dir(req) == READ) ? MSB_OC_READ : MSB_OC_WRITE;
 200        msb->flags |= MSB_FLAG_IDA;
 201        msb->data_addr = (u64) aidaw;
 202
 203        rq_for_each_segment(bv, req, iter) {
 204                WARN_ON(bv.bv_offset);
 205                msb->blk_count += bv.bv_len >> 12;
 206                aidaw->data_addr = (u64) page_address(bv.bv_page);
 207                aidaw++;
 208        }
 209
 210        scmrq->next_aidaw = aidaw;
 211        return 0;
 212}
 213
 214static inline void scm_request_set(struct scm_request *scmrq,
 215                                   struct request *req)
 216{
 217        scmrq->request[scmrq->aob->request.msb_count] = req;
 218}
 219
 220static inline void scm_request_init(struct scm_blk_dev *bdev,
 221                                    struct scm_request *scmrq)
 222{
 223        struct aob_rq_header *aobrq = to_aobrq(scmrq);
 224        struct aob *aob = scmrq->aob;
 225
 226        memset(scmrq->request, 0,
 227               nr_requests_per_io * sizeof(scmrq->request[0]));
 228        memset(aob, 0, sizeof(*aob));
 229        aobrq->scmdev = bdev->scmdev;
 230        aob->request.cmd_code = ARQB_CMD_MOVE;
 231        aob->request.data = (u64) aobrq;
 232        scmrq->bdev = bdev;
 233        scmrq->retries = 4;
 234        scmrq->error = 0;
 235        /* We don't use all msbs - place aidaws at the end of the aob page. */
 236        scmrq->next_aidaw = (void *) &aob->msb[nr_requests_per_io];
 237        scm_request_cluster_init(scmrq);
 238}
 239
 240static void scm_ensure_queue_restart(struct scm_blk_dev *bdev)
 241{
 242        if (atomic_read(&bdev->queued_reqs)) {
 243                /* Queue restart is triggered by the next interrupt. */
 244                return;
 245        }
 246        blk_delay_queue(bdev->rq, SCM_QUEUE_DELAY);
 247}
 248
 249void scm_request_requeue(struct scm_request *scmrq)
 250{
 251        struct scm_blk_dev *bdev = scmrq->bdev;
 252        int i;
 253
 254        scm_release_cluster(scmrq);
 255        for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++)
 256                blk_requeue_request(bdev->rq, scmrq->request[i]);
 257
 258        atomic_dec(&bdev->queued_reqs);
 259        scm_request_done(scmrq);
 260        scm_ensure_queue_restart(bdev);
 261}
 262
 263void scm_request_finish(struct scm_request *scmrq)
 264{
 265        struct scm_blk_dev *bdev = scmrq->bdev;
 266        int i;
 267
 268        scm_release_cluster(scmrq);
 269        for (i = 0; i < nr_requests_per_io && scmrq->request[i]; i++)
 270                blk_end_request_all(scmrq->request[i], scmrq->error);
 271
 272        atomic_dec(&bdev->queued_reqs);
 273        scm_request_done(scmrq);
 274}
 275
 276static int scm_request_start(struct scm_request *scmrq)
 277{
 278        struct scm_blk_dev *bdev = scmrq->bdev;
 279        int ret;
 280
 281        atomic_inc(&bdev->queued_reqs);
 282        if (!scmrq->aob->request.msb_count) {
 283                scm_request_requeue(scmrq);
 284                return -EINVAL;
 285        }
 286
 287        ret = eadm_start_aob(scmrq->aob);
 288        if (ret) {
 289                SCM_LOG(5, "no subchannel");
 290                scm_request_requeue(scmrq);
 291        }
 292        return ret;
 293}
 294
 295static void scm_blk_request(struct request_queue *rq)
 296{
 297        struct scm_device *scmdev = rq->queuedata;
 298        struct scm_blk_dev *bdev = dev_get_drvdata(&scmdev->dev);
 299        struct scm_request *scmrq = NULL;
 300        struct request *req;
 301
 302        while ((req = blk_peek_request(rq))) {
 303                if (req->cmd_type != REQ_TYPE_FS) {
 304                        blk_start_request(req);
 305                        blk_dump_rq_flags(req, KMSG_COMPONENT " bad request");
 306                        __blk_end_request_all(req, -EIO);
 307                        continue;
 308                }
 309
 310                if (!scm_permit_request(bdev, req))
 311                        goto out;
 312
 313                if (!scmrq) {
 314                        scmrq = scm_request_fetch();
 315                        if (!scmrq) {
 316                                SCM_LOG(5, "no request");
 317                                goto out;
 318                        }
 319                        scm_request_init(bdev, scmrq);
 320                }
 321                scm_request_set(scmrq, req);
 322
 323                if (!scm_reserve_cluster(scmrq)) {
 324                        SCM_LOG(5, "cluster busy");
 325                        scm_request_set(scmrq, NULL);
 326                        if (scmrq->aob->request.msb_count)
 327                                goto out;
 328
 329                        scm_request_done(scmrq);
 330                        return;
 331                }
 332
 333                if (scm_need_cluster_request(scmrq)) {
 334                        if (scmrq->aob->request.msb_count) {
 335                                /* Start cluster requests separately. */
 336                                scm_request_set(scmrq, NULL);
 337                                if (scm_request_start(scmrq))
 338                                        return;
 339                        } else {
 340                                atomic_inc(&bdev->queued_reqs);
 341                                blk_start_request(req);
 342                                scm_initiate_cluster_request(scmrq);
 343                        }
 344                        scmrq = NULL;
 345                        continue;
 346                }
 347
 348                if (scm_request_prepare(scmrq)) {
 349                        SCM_LOG(5, "aidaw alloc failed");
 350                        scm_request_set(scmrq, NULL);
 351                        goto out;
 352                }
 353                blk_start_request(req);
 354
 355                if (scmrq->aob->request.msb_count < nr_requests_per_io)
 356                        continue;
 357
 358                if (scm_request_start(scmrq))
 359                        return;
 360
 361                scmrq = NULL;
 362        }
 363out:
 364        if (scmrq)
 365                scm_request_start(scmrq);
 366        else
 367                scm_ensure_queue_restart(bdev);
 368}
 369
 370static void __scmrq_log_error(struct scm_request *scmrq)
 371{
 372        struct aob *aob = scmrq->aob;
 373
 374        if (scmrq->error == -ETIMEDOUT)
 375                SCM_LOG(1, "Request timeout");
 376        else {
 377                SCM_LOG(1, "Request error");
 378                SCM_LOG_HEX(1, &aob->response, sizeof(aob->response));
 379        }
 380        if (scmrq->retries)
 381                SCM_LOG(1, "Retry request");
 382        else
 383                pr_err("An I/O operation to SCM failed with rc=%d\n",
 384                       scmrq->error);
 385}
 386
 387void scm_blk_irq(struct scm_device *scmdev, void *data, int error)
 388{
 389        struct scm_request *scmrq = data;
 390        struct scm_blk_dev *bdev = scmrq->bdev;
 391
 392        scmrq->error = error;
 393        if (error)
 394                __scmrq_log_error(scmrq);
 395
 396        spin_lock(&bdev->lock);
 397        list_add_tail(&scmrq->list, &bdev->finished_requests);
 398        spin_unlock(&bdev->lock);
 399        tasklet_hi_schedule(&bdev->tasklet);
 400}
 401
 402static void scm_blk_handle_error(struct scm_request *scmrq)
 403{
 404        struct scm_blk_dev *bdev = scmrq->bdev;
 405        unsigned long flags;
 406
 407        if (scmrq->error != -EIO)
 408                goto restart;
 409
 410        /* For -EIO the response block is valid. */
 411        switch (scmrq->aob->response.eqc) {
 412        case EQC_WR_PROHIBIT:
 413                spin_lock_irqsave(&bdev->lock, flags);
 414                if (bdev->state != SCM_WR_PROHIBIT)
 415                        pr_info("%lx: Write access to the SCM increment is suspended\n",
 416                                (unsigned long) bdev->scmdev->address);
 417                bdev->state = SCM_WR_PROHIBIT;
 418                spin_unlock_irqrestore(&bdev->lock, flags);
 419                goto requeue;
 420        default:
 421                break;
 422        }
 423
 424restart:
 425        if (!eadm_start_aob(scmrq->aob))
 426                return;
 427
 428requeue:
 429        spin_lock_irqsave(&bdev->rq_lock, flags);
 430        scm_request_requeue(scmrq);
 431        spin_unlock_irqrestore(&bdev->rq_lock, flags);
 432}
 433
 434static void scm_blk_tasklet(struct scm_blk_dev *bdev)
 435{
 436        struct scm_request *scmrq;
 437        unsigned long flags;
 438
 439        spin_lock_irqsave(&bdev->lock, flags);
 440        while (!list_empty(&bdev->finished_requests)) {
 441                scmrq = list_first_entry(&bdev->finished_requests,
 442                                         struct scm_request, list);
 443                list_del(&scmrq->list);
 444                spin_unlock_irqrestore(&bdev->lock, flags);
 445
 446                if (scmrq->error && scmrq->retries-- > 0) {
 447                        scm_blk_handle_error(scmrq);
 448
 449                        /* Request restarted or requeued, handle next. */
 450                        spin_lock_irqsave(&bdev->lock, flags);
 451                        continue;
 452                }
 453
 454                if (scm_test_cluster_request(scmrq)) {
 455                        scm_cluster_request_irq(scmrq);
 456                        spin_lock_irqsave(&bdev->lock, flags);
 457                        continue;
 458                }
 459
 460                scm_request_finish(scmrq);
 461                spin_lock_irqsave(&bdev->lock, flags);
 462        }
 463        spin_unlock_irqrestore(&bdev->lock, flags);
 464        /* Look out for more requests. */
 465        blk_run_queue(bdev->rq);
 466}
 467
 468static const struct block_device_operations scm_blk_devops = {
 469        .owner = THIS_MODULE,
 470};
 471
 472int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 473{
 474        struct request_queue *rq;
 475        int len, ret = -ENOMEM;
 476        unsigned int devindex, nr_max_blk;
 477
 478        devindex = atomic_inc_return(&nr_devices) - 1;
 479        /* scma..scmz + scmaa..scmzz */
 480        if (devindex > 701) {
 481                ret = -ENODEV;
 482                goto out;
 483        }
 484
 485        bdev->scmdev = scmdev;
 486        bdev->state = SCM_OPER;
 487        spin_lock_init(&bdev->rq_lock);
 488        spin_lock_init(&bdev->lock);
 489        INIT_LIST_HEAD(&bdev->finished_requests);
 490        atomic_set(&bdev->queued_reqs, 0);
 491        tasklet_init(&bdev->tasklet,
 492                     (void (*)(unsigned long)) scm_blk_tasklet,
 493                     (unsigned long) bdev);
 494
 495        rq = blk_init_queue(scm_blk_request, &bdev->rq_lock);
 496        if (!rq)
 497                goto out;
 498
 499        bdev->rq = rq;
 500        nr_max_blk = min(scmdev->nr_max_block,
 501                         (unsigned int) (PAGE_SIZE / sizeof(struct aidaw)));
 502
 503        blk_queue_logical_block_size(rq, 1 << 12);
 504        blk_queue_max_hw_sectors(rq, nr_max_blk << 3); /* 8 * 512 = blk_size */
 505        blk_queue_max_segments(rq, nr_max_blk);
 506        queue_flag_set_unlocked(QUEUE_FLAG_NONROT, rq);
 507        queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, rq);
 508        scm_blk_dev_cluster_setup(bdev);
 509
 510        bdev->gendisk = alloc_disk(SCM_NR_PARTS);
 511        if (!bdev->gendisk)
 512                goto out_queue;
 513
 514        rq->queuedata = scmdev;
 515        bdev->gendisk->driverfs_dev = &scmdev->dev;
 516        bdev->gendisk->private_data = scmdev;
 517        bdev->gendisk->fops = &scm_blk_devops;
 518        bdev->gendisk->queue = rq;
 519        bdev->gendisk->major = scm_major;
 520        bdev->gendisk->first_minor = devindex * SCM_NR_PARTS;
 521
 522        len = snprintf(bdev->gendisk->disk_name, DISK_NAME_LEN, "scm");
 523        if (devindex > 25) {
 524                len += snprintf(bdev->gendisk->disk_name + len,
 525                                DISK_NAME_LEN - len, "%c",
 526                                'a' + (devindex / 26) - 1);
 527                devindex = devindex % 26;
 528        }
 529        snprintf(bdev->gendisk->disk_name + len, DISK_NAME_LEN - len, "%c",
 530                 'a' + devindex);
 531
 532        /* 512 byte sectors */
 533        set_capacity(bdev->gendisk, scmdev->size >> 9);
 534        add_disk(bdev->gendisk);
 535        return 0;
 536
 537out_queue:
 538        blk_cleanup_queue(rq);
 539out:
 540        atomic_dec(&nr_devices);
 541        return ret;
 542}
 543
 544void scm_blk_dev_cleanup(struct scm_blk_dev *bdev)
 545{
 546        tasklet_kill(&bdev->tasklet);
 547        del_gendisk(bdev->gendisk);
 548        blk_cleanup_queue(bdev->gendisk->queue);
 549        put_disk(bdev->gendisk);
 550}
 551
 552void scm_blk_set_available(struct scm_blk_dev *bdev)
 553{
 554        unsigned long flags;
 555
 556        spin_lock_irqsave(&bdev->lock, flags);
 557        if (bdev->state == SCM_WR_PROHIBIT)
 558                pr_info("%lx: Write access to the SCM increment is restored\n",
 559                        (unsigned long) bdev->scmdev->address);
 560        bdev->state = SCM_OPER;
 561        spin_unlock_irqrestore(&bdev->lock, flags);
 562}
 563
 564static bool __init scm_blk_params_valid(void)
 565{
 566        if (!nr_requests_per_io || nr_requests_per_io > 64)
 567                return false;
 568
 569        return scm_cluster_size_valid();
 570}
 571
 572static int __init scm_blk_init(void)
 573{
 574        int ret = -EINVAL;
 575
 576        if (!scm_blk_params_valid())
 577                goto out;
 578
 579        ret = register_blkdev(0, "scm");
 580        if (ret < 0)
 581                goto out;
 582
 583        scm_major = ret;
 584        ret = scm_alloc_rqs(nr_requests);
 585        if (ret)
 586                goto out_free;
 587
 588        scm_debug = debug_register("scm_log", 16, 1, 16);
 589        if (!scm_debug) {
 590                ret = -ENOMEM;
 591                goto out_free;
 592        }
 593
 594        debug_register_view(scm_debug, &debug_hex_ascii_view);
 595        debug_set_level(scm_debug, 2);
 596
 597        ret = scm_drv_init();
 598        if (ret)
 599                goto out_dbf;
 600
 601        return ret;
 602
 603out_dbf:
 604        debug_unregister(scm_debug);
 605out_free:
 606        scm_free_rqs();
 607        unregister_blkdev(scm_major, "scm");
 608out:
 609        return ret;
 610}
 611module_init(scm_blk_init);
 612
 613static void __exit scm_blk_cleanup(void)
 614{
 615        scm_drv_cleanup();
 616        debug_unregister(scm_debug);
 617        scm_free_rqs();
 618        unregister_blkdev(scm_major, "scm");
 619}
 620module_exit(scm_blk_cleanup);
 621