~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to net/sunrpc/xprtrdma/verbs.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno
  • Date: 2011-06-07 12:14:05 UTC
  • mfrom: (43.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110607121405-i3h1rd7nrnd2b73h
Tags: 2.6.39-2
[ Ben Hutchings ]
* [x86] Enable BACKLIGHT_APPLE, replacing BACKLIGHT_MBP_NVIDIA
  (Closes: #627492)
* cgroups: Disable memory resource controller by default. Allow it
  to be enabled using kernel parameter 'cgroup_enable=memory'.
* rt2800usb: Enable support for more USB devices including
  Linksys WUSB600N (Closes: #596626) (this change was accidentally
  omitted from 2.6.39-1)
* [x86] Remove Celeron from list of processors supporting PAE. Most
  'Celeron M' models do not.
* Update debconf template translations:
  - Swedish (Martin Bagge) (Closes: #628932)
  - French (David Prévot) (Closes: #628191)
* aufs: Update for 2.6.39 (Closes: #627837)
* Add stable 2.6.39.1, including:
  - ext4: dont set PageUptodate in ext4_end_bio()
  - pata_cmd64x: fix boot crash on parisc (Closes: #622997, #622745)
  - ext3: Fix fs corruption when make_indexed_dir() fails
  - netfilter: nf_ct_sip: validate Content-Length in TCP SIP messages
  - sctp: fix race between sctp_bind_addr_free() and
    sctp_bind_addr_conflict()
  - sctp: fix memory leak of the ASCONF queue when free asoc
  - md/bitmap: fix saving of events_cleared and other state
  - cdc_acm: Fix oops when Droids MuIn LCD is connected
  - cx88: Fix conversion from BKL to fine-grained locks (Closes: #619827)
  - keys: Set cred->user_ns in key_replace_session_keyring (CVE-2011-2184)
  - tmpfs: fix race between truncate and writepage
  - nfs41: Correct offset for LAYOUTCOMMIT
  - xen/mmu: fix a race window causing leave_mm BUG()
  - ext4: fix possible use-after-free in ext4_remove_li_request()
  For the complete list of changes, see:
   http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.39.1
* Bump ABI to 2
* netfilter: Enable IP_SET, IP_SET_BITMAP_IP, IP_SET_BITMAP_IPMAC,
  IP_SET_BITMAP_PORT, IP_SET_HASH_IP, IP_SET_HASH_IPPORT,
  IP_SET_HASH_IPPORTIP, IP_SET_HASH_IPPORTNET, IP_SET_HASH_NET,
  IP_SET_HASH_NETPORT, IP_SET_LIST_SET, NETFILTER_XT_SET as modules
  (Closes: #629401)

[ Aurelien Jarno ]
* [mipsel/loongson-2f] Disable_SCSI_LPFC to workaround GCC ICE.

Show diffs side-by-side

added added

removed removed

Lines of Context:
144
144
static inline
145
145
void rpcrdma_event_process(struct ib_wc *wc)
146
146
{
 
147
        struct rpcrdma_mw *frmr;
147
148
        struct rpcrdma_rep *rep =
148
149
                        (struct rpcrdma_rep *)(unsigned long) wc->wr_id;
149
150
 
154
155
                return;
155
156
 
156
157
        if (IB_WC_SUCCESS != wc->status) {
157
 
                dprintk("RPC:       %s: %s WC status %X, connection lost\n",
158
 
                        __func__, (wc->opcode & IB_WC_RECV) ? "recv" : "send",
159
 
                         wc->status);
 
158
                dprintk("RPC:       %s: WC opcode %d status %X, connection lost\n",
 
159
                        __func__, wc->opcode, wc->status);
160
160
                rep->rr_len = ~0U;
161
 
                rpcrdma_schedule_tasklet(rep);
 
161
                if (wc->opcode != IB_WC_FAST_REG_MR && wc->opcode != IB_WC_LOCAL_INV)
 
162
                        rpcrdma_schedule_tasklet(rep);
162
163
                return;
163
164
        }
164
165
 
165
166
        switch (wc->opcode) {
 
167
        case IB_WC_FAST_REG_MR:
 
168
                frmr = (struct rpcrdma_mw *)(unsigned long)wc->wr_id;
 
169
                frmr->r.frmr.state = FRMR_IS_VALID;
 
170
                break;
 
171
        case IB_WC_LOCAL_INV:
 
172
                frmr = (struct rpcrdma_mw *)(unsigned long)wc->wr_id;
 
173
                frmr->r.frmr.state = FRMR_IS_INVALID;
 
174
                break;
166
175
        case IB_WC_RECV:
167
176
                rep->rr_len = wc->byte_len;
168
177
                ib_dma_sync_single_for_cpu(
1450
1459
                seg->mr_dma = ib_dma_map_single(ia->ri_id->device,
1451
1460
                                seg->mr_offset,
1452
1461
                                seg->mr_dmalen, seg->mr_dir);
 
1462
        if (ib_dma_mapping_error(ia->ri_id->device, seg->mr_dma)) {
 
1463
                dprintk("RPC:       %s: mr_dma %llx mr_offset %p mr_dma_len %zu\n",
 
1464
                        __func__,
 
1465
                        (unsigned long long)seg->mr_dma,
 
1466
                        seg->mr_offset, seg->mr_dmalen);
 
1467
        }
1453
1468
}
1454
1469
 
1455
1470
static void
1469
1484
                        struct rpcrdma_xprt *r_xprt)
1470
1485
{
1471
1486
        struct rpcrdma_mr_seg *seg1 = seg;
1472
 
        struct ib_send_wr frmr_wr, *bad_wr;
 
1487
        struct ib_send_wr invalidate_wr, frmr_wr, *bad_wr, *post_wr;
 
1488
 
1473
1489
        u8 key;
1474
1490
        int len, pageoff;
1475
1491
        int i, rc;
1484
1500
                rpcrdma_map_one(ia, seg, writing);
1485
1501
                seg1->mr_chunk.rl_mw->r.frmr.fr_pgl->page_list[i] = seg->mr_dma;
1486
1502
                len += seg->mr_len;
 
1503
                BUG_ON(seg->mr_len > PAGE_SIZE);
1487
1504
                ++seg;
1488
1505
                ++i;
1489
1506
                /* Check for holes */
1494
1511
        dprintk("RPC:       %s: Using frmr %p to map %d segments\n",
1495
1512
                __func__, seg1->mr_chunk.rl_mw, i);
1496
1513
 
 
1514
        if (unlikely(seg1->mr_chunk.rl_mw->r.frmr.state == FRMR_IS_VALID)) {
 
1515
                dprintk("RPC:       %s: frmr %x left valid, posting invalidate.\n",
 
1516
                        __func__,
 
1517
                        seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey);
 
1518
                /* Invalidate before using. */
 
1519
                memset(&invalidate_wr, 0, sizeof invalidate_wr);
 
1520
                invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
 
1521
                invalidate_wr.next = &frmr_wr;
 
1522
                invalidate_wr.opcode = IB_WR_LOCAL_INV;
 
1523
                invalidate_wr.send_flags = IB_SEND_SIGNALED;
 
1524
                invalidate_wr.ex.invalidate_rkey =
 
1525
                        seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
 
1526
                DECR_CQCOUNT(&r_xprt->rx_ep);
 
1527
                post_wr = &invalidate_wr;
 
1528
        } else
 
1529
                post_wr = &frmr_wr;
 
1530
 
1497
1531
        /* Bump the key */
1498
1532
        key = (u8)(seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey & 0x000000FF);
1499
1533
        ib_update_fast_reg_key(seg1->mr_chunk.rl_mw->r.frmr.fr_mr, ++key);
1500
1534
 
1501
1535
        /* Prepare FRMR WR */
1502
1536
        memset(&frmr_wr, 0, sizeof frmr_wr);
 
1537
        frmr_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
1503
1538
        frmr_wr.opcode = IB_WR_FAST_REG_MR;
1504
 
        frmr_wr.send_flags = 0;                 /* unsignaled */
 
1539
        frmr_wr.send_flags = IB_SEND_SIGNALED;
1505
1540
        frmr_wr.wr.fast_reg.iova_start = seg1->mr_dma;
1506
1541
        frmr_wr.wr.fast_reg.page_list = seg1->mr_chunk.rl_mw->r.frmr.fr_pgl;
1507
1542
        frmr_wr.wr.fast_reg.page_list_len = i;
1508
1543
        frmr_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
1509
1544
        frmr_wr.wr.fast_reg.length = i << PAGE_SHIFT;
 
1545
        BUG_ON(frmr_wr.wr.fast_reg.length < len);
1510
1546
        frmr_wr.wr.fast_reg.access_flags = (writing ?
1511
1547
                                IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE :
1512
1548
                                IB_ACCESS_REMOTE_READ);
1513
1549
        frmr_wr.wr.fast_reg.rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
1514
1550
        DECR_CQCOUNT(&r_xprt->rx_ep);
1515
1551
 
1516
 
        rc = ib_post_send(ia->ri_id->qp, &frmr_wr, &bad_wr);
 
1552
        rc = ib_post_send(ia->ri_id->qp, post_wr, &bad_wr);
1517
1553
 
1518
1554
        if (rc) {
1519
1555
                dprintk("RPC:       %s: failed ib_post_send for register,"
1542
1578
                rpcrdma_unmap_one(ia, seg++);
1543
1579
 
1544
1580
        memset(&invalidate_wr, 0, sizeof invalidate_wr);
 
1581
        invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
1545
1582
        invalidate_wr.opcode = IB_WR_LOCAL_INV;
1546
 
        invalidate_wr.send_flags = 0;                   /* unsignaled */
 
1583
        invalidate_wr.send_flags = IB_SEND_SIGNALED;
1547
1584
        invalidate_wr.ex.invalidate_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
1548
1585
        DECR_CQCOUNT(&r_xprt->rx_ep);
1549
1586