Merge branch 'k.o/for-4.12' into k.o/for-4.12-rdma-netdevice
Цей коміт міститься в:
@@ -50,6 +50,7 @@
|
||||
#include <linux/kthread.h>
|
||||
#include "cq.h"
|
||||
#include "vt.h"
|
||||
#include "trace.h"
|
||||
|
||||
/**
|
||||
* rvt_cq_enter - add a new entry to the completion queue
|
||||
@@ -93,6 +94,7 @@ void rvt_cq_enter(struct rvt_cq *cq, struct ib_wc *entry, bool solicited)
|
||||
}
|
||||
return;
|
||||
}
|
||||
trace_rvt_cq_enter(cq, entry, head);
|
||||
if (cq->ip) {
|
||||
wc->uqueue[head].wr_id = entry->wr_id;
|
||||
wc->uqueue[head].status = entry->status;
|
||||
@@ -482,6 +484,7 @@ int rvt_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
|
||||
if (tail == wc->head)
|
||||
break;
|
||||
/* The kernel doesn't need a RMB since it has the lock. */
|
||||
trace_rvt_cq_poll(cq, &wc->kqueue[tail], npolled);
|
||||
*entry = wc->kqueue[tail];
|
||||
if (tail >= cq->ibcq.cqe)
|
||||
tail = 0;
|
||||
|
@@ -191,8 +191,9 @@ static int rvt_alloc_lkey(struct rvt_mregion *mr, int dma_region)
|
||||
|
||||
tmr = rcu_access_pointer(dev->dma_mr);
|
||||
if (!tmr) {
|
||||
rcu_assign_pointer(dev->dma_mr, mr);
|
||||
mr->lkey_published = 1;
|
||||
/* Insure published written first */
|
||||
rcu_assign_pointer(dev->dma_mr, mr);
|
||||
rvt_get_mr(mr);
|
||||
}
|
||||
goto success;
|
||||
@@ -224,8 +225,9 @@ static int rvt_alloc_lkey(struct rvt_mregion *mr, int dma_region)
|
||||
mr->lkey |= 1 << 8;
|
||||
rkt->gen++;
|
||||
}
|
||||
rcu_assign_pointer(rkt->table[r], mr);
|
||||
mr->lkey_published = 1;
|
||||
/* Insure published written first */
|
||||
rcu_assign_pointer(rkt->table[r], mr);
|
||||
success:
|
||||
spin_unlock_irqrestore(&rkt->lock, flags);
|
||||
out:
|
||||
@@ -253,23 +255,24 @@ static void rvt_free_lkey(struct rvt_mregion *mr)
|
||||
spin_lock_irqsave(&rkt->lock, flags);
|
||||
if (!lkey) {
|
||||
if (mr->lkey_published) {
|
||||
RCU_INIT_POINTER(dev->dma_mr, NULL);
|
||||
mr->lkey_published = 0;
|
||||
/* insure published is written before pointer */
|
||||
rcu_assign_pointer(dev->dma_mr, NULL);
|
||||
rvt_put_mr(mr);
|
||||
}
|
||||
} else {
|
||||
if (!mr->lkey_published)
|
||||
goto out;
|
||||
r = lkey >> (32 - dev->dparms.lkey_table_size);
|
||||
RCU_INIT_POINTER(rkt->table[r], NULL);
|
||||
mr->lkey_published = 0;
|
||||
/* insure published is written before pointer */
|
||||
rcu_assign_pointer(rkt->table[r], NULL);
|
||||
}
|
||||
mr->lkey_published = 0;
|
||||
freed++;
|
||||
out:
|
||||
spin_unlock_irqrestore(&rkt->lock, flags);
|
||||
if (freed) {
|
||||
synchronize_rcu();
|
||||
if (freed)
|
||||
percpu_ref_kill(&mr->refcount);
|
||||
}
|
||||
}
|
||||
|
||||
static struct rvt_mr *__rvt_alloc_mr(int count, struct ib_pd *pd)
|
||||
@@ -822,16 +825,21 @@ int rvt_lkey_ok(struct rvt_lkey_table *rkt, struct rvt_pd *pd,
|
||||
goto ok;
|
||||
}
|
||||
mr = rcu_dereference(rkt->table[sge->lkey >> rkt->shift]);
|
||||
if (unlikely(!mr || atomic_read(&mr->lkey_invalid) ||
|
||||
mr->lkey != sge->lkey || mr->pd != &pd->ibpd))
|
||||
if (!mr)
|
||||
goto bail;
|
||||
rvt_get_mr(mr);
|
||||
if (!READ_ONCE(mr->lkey_published))
|
||||
goto bail_unref;
|
||||
|
||||
if (unlikely(atomic_read(&mr->lkey_invalid) ||
|
||||
mr->lkey != sge->lkey || mr->pd != &pd->ibpd))
|
||||
goto bail_unref;
|
||||
|
||||
off = sge->addr - mr->user_base;
|
||||
if (unlikely(sge->addr < mr->user_base ||
|
||||
off + sge->length > mr->length ||
|
||||
(mr->access_flags & acc) != acc))
|
||||
goto bail;
|
||||
rvt_get_mr(mr);
|
||||
goto bail_unref;
|
||||
rcu_read_unlock();
|
||||
|
||||
off += mr->offset;
|
||||
@@ -867,6 +875,8 @@ int rvt_lkey_ok(struct rvt_lkey_table *rkt, struct rvt_pd *pd,
|
||||
isge->n = n;
|
||||
ok:
|
||||
return 1;
|
||||
bail_unref:
|
||||
rvt_put_mr(mr);
|
||||
bail:
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
@@ -922,15 +932,20 @@ int rvt_rkey_ok(struct rvt_qp *qp, struct rvt_sge *sge,
|
||||
}
|
||||
|
||||
mr = rcu_dereference(rkt->table[rkey >> rkt->shift]);
|
||||
if (unlikely(!mr || atomic_read(&mr->lkey_invalid) ||
|
||||
mr->lkey != rkey || qp->ibqp.pd != mr->pd))
|
||||
if (!mr)
|
||||
goto bail;
|
||||
rvt_get_mr(mr);
|
||||
/* insure mr read is before test */
|
||||
if (!READ_ONCE(mr->lkey_published))
|
||||
goto bail_unref;
|
||||
if (unlikely(atomic_read(&mr->lkey_invalid) ||
|
||||
mr->lkey != rkey || qp->ibqp.pd != mr->pd))
|
||||
goto bail_unref;
|
||||
|
||||
off = vaddr - mr->iova;
|
||||
if (unlikely(vaddr < mr->iova || off + len > mr->length ||
|
||||
(mr->access_flags & acc) == 0))
|
||||
goto bail;
|
||||
rvt_get_mr(mr);
|
||||
goto bail_unref;
|
||||
rcu_read_unlock();
|
||||
|
||||
off += mr->offset;
|
||||
@@ -966,6 +981,8 @@ int rvt_rkey_ok(struct rvt_qp *qp, struct rvt_sge *sge,
|
||||
sge->n = n;
|
||||
ok:
|
||||
return 1;
|
||||
bail_unref:
|
||||
rvt_put_mr(mr);
|
||||
bail:
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright(c) 2016 Intel Corporation.
|
||||
* Copyright(c) 2016, 2017 Intel Corporation.
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
@@ -117,23 +117,6 @@ const int ib_rvt_state_ops[IB_QPS_ERR + 1] = {
|
||||
};
|
||||
EXPORT_SYMBOL(ib_rvt_state_ops);
|
||||
|
||||
/*
|
||||
* Translate ib_wr_opcode into ib_wc_opcode.
|
||||
*/
|
||||
const enum ib_wc_opcode ib_rvt_wc_opcode[] = {
|
||||
[IB_WR_RDMA_WRITE] = IB_WC_RDMA_WRITE,
|
||||
[IB_WR_RDMA_WRITE_WITH_IMM] = IB_WC_RDMA_WRITE,
|
||||
[IB_WR_SEND] = IB_WC_SEND,
|
||||
[IB_WR_SEND_WITH_IMM] = IB_WC_SEND,
|
||||
[IB_WR_RDMA_READ] = IB_WC_RDMA_READ,
|
||||
[IB_WR_ATOMIC_CMP_AND_SWP] = IB_WC_COMP_SWAP,
|
||||
[IB_WR_ATOMIC_FETCH_AND_ADD] = IB_WC_FETCH_ADD,
|
||||
[IB_WR_SEND_WITH_INV] = IB_WC_SEND,
|
||||
[IB_WR_LOCAL_INV] = IB_WC_LOCAL_INV,
|
||||
[IB_WR_REG_MR] = IB_WC_REG_MR
|
||||
};
|
||||
EXPORT_SYMBOL(ib_rvt_wc_opcode);
|
||||
|
||||
static void get_map_page(struct rvt_qpn_table *qpt,
|
||||
struct rvt_qpn_map *map,
|
||||
gfp_t gfp)
|
||||
@@ -1789,11 +1772,14 @@ static int rvt_post_one_wr(struct rvt_qp *qp,
|
||||
0);
|
||||
qp->s_next_psn = wqe->lpsn + 1;
|
||||
}
|
||||
trace_rvt_post_one_wr(qp, wqe);
|
||||
if (unlikely(reserved_op))
|
||||
if (unlikely(reserved_op)) {
|
||||
wqe->wr.send_flags |= RVT_SEND_RESERVE_USED;
|
||||
rvt_qp_wqe_reserve(qp, wqe);
|
||||
else
|
||||
} else {
|
||||
wqe->wr.send_flags &= ~RVT_SEND_RESERVE_USED;
|
||||
qp->s_avail--;
|
||||
}
|
||||
trace_rvt_post_one_wr(qp, wqe);
|
||||
smp_wmb(); /* see request builders */
|
||||
qp->s_head = next;
|
||||
|
||||
@@ -2069,8 +2055,12 @@ static void rvt_rc_timeout(unsigned long arg)
|
||||
spin_lock_irqsave(&qp->r_lock, flags);
|
||||
spin_lock(&qp->s_lock);
|
||||
if (qp->s_flags & RVT_S_TIMER) {
|
||||
struct rvt_ibport *rvp = rdi->ports[qp->port_num - 1];
|
||||
|
||||
qp->s_flags &= ~RVT_S_TIMER;
|
||||
rvp->n_rc_timeouts++;
|
||||
del_timer(&qp->s_timer);
|
||||
trace_rvt_rc_timeout(qp, qp->s_last_psn + 1);
|
||||
if (rdi->driver_f.notify_restart_rc)
|
||||
rdi->driver_f.notify_restart_rc(qp,
|
||||
qp->s_last_psn + 1,
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright(c) 2016 Intel Corporation.
|
||||
* Copyright(c) 2016, 2017 Intel Corporation.
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
@@ -52,3 +52,5 @@
|
||||
#include "trace_qp.h"
|
||||
#include "trace_tx.h"
|
||||
#include "trace_mr.h"
|
||||
#include "trace_cq.h"
|
||||
#include "trace_rc.h"
|
||||
|
127
drivers/infiniband/sw/rdmavt/trace_cq.h
Звичайний файл
127
drivers/infiniband/sw/rdmavt/trace_cq.h
Звичайний файл
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright(c) 2016 Intel Corporation.
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* - Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#if !defined(__RVT_TRACE_CQ_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __RVT_TRACE_CQ_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/trace_seq.h>
|
||||
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/rdmavt_cq.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM rvt_cq
|
||||
|
||||
#define wc_opcode_name(opcode) { IB_WC_##opcode, #opcode }
|
||||
#define show_wc_opcode(opcode) \
|
||||
__print_symbolic(opcode, \
|
||||
wc_opcode_name(SEND), \
|
||||
wc_opcode_name(RDMA_WRITE), \
|
||||
wc_opcode_name(RDMA_READ), \
|
||||
wc_opcode_name(COMP_SWAP), \
|
||||
wc_opcode_name(FETCH_ADD), \
|
||||
wc_opcode_name(LSO), \
|
||||
wc_opcode_name(LOCAL_INV), \
|
||||
wc_opcode_name(REG_MR), \
|
||||
wc_opcode_name(MASKED_COMP_SWAP), \
|
||||
wc_opcode_name(RECV), \
|
||||
wc_opcode_name(RECV_RDMA_WITH_IMM))
|
||||
|
||||
#define CQ_PRN \
|
||||
"[%s] idx %u wr_id %llx status %u opcode %u,%s length %u qpn %x"
|
||||
|
||||
DECLARE_EVENT_CLASS(
|
||||
rvt_cq_entry_template,
|
||||
TP_PROTO(struct rvt_cq *cq, struct ib_wc *wc, u32 idx),
|
||||
TP_ARGS(cq, wc, idx),
|
||||
TP_STRUCT__entry(
|
||||
RDI_DEV_ENTRY(cq->rdi)
|
||||
__field(u64, wr_id)
|
||||
__field(u32, status)
|
||||
__field(u32, opcode)
|
||||
__field(u32, qpn)
|
||||
__field(u32, length)
|
||||
__field(u32, idx)
|
||||
),
|
||||
TP_fast_assign(
|
||||
RDI_DEV_ASSIGN(cq->rdi)
|
||||
__entry->wr_id = wc->wr_id;
|
||||
__entry->status = wc->status;
|
||||
__entry->opcode = wc->opcode;
|
||||
__entry->length = wc->byte_len;
|
||||
__entry->qpn = wc->qp->qp_num;
|
||||
__entry->idx = idx;
|
||||
),
|
||||
TP_printk(
|
||||
CQ_PRN,
|
||||
__get_str(dev),
|
||||
__entry->idx,
|
||||
__entry->wr_id,
|
||||
__entry->status,
|
||||
__entry->opcode, show_wc_opcode(__entry->opcode),
|
||||
__entry->length,
|
||||
__entry->qpn
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(
|
||||
rvt_cq_entry_template, rvt_cq_enter,
|
||||
TP_PROTO(struct rvt_cq *cq, struct ib_wc *wc, u32 idx),
|
||||
TP_ARGS(cq, wc, idx));
|
||||
|
||||
DEFINE_EVENT(
|
||||
rvt_cq_entry_template, rvt_cq_poll,
|
||||
TP_PROTO(struct rvt_cq *cq, struct ib_wc *wc, u32 idx),
|
||||
TP_ARGS(cq, wc, idx));
|
||||
|
||||
#endif /* __RVT_TRACE_CQ_H */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_cq
|
||||
#include <trace/define_trace.h>
|
109
drivers/infiniband/sw/rdmavt/trace_rc.h
Звичайний файл
109
drivers/infiniband/sw/rdmavt/trace_rc.h
Звичайний файл
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright(c) 2017 Intel Corporation.
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* - Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#if !defined(__RVT_TRACE_RC_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __RVT_TRACE_RC_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/trace_seq.h>
|
||||
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/rdma_vt.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM rvt_rc
|
||||
|
||||
DECLARE_EVENT_CLASS(rvt_rc_template,
|
||||
TP_PROTO(struct rvt_qp *qp, u32 psn),
|
||||
TP_ARGS(qp, psn),
|
||||
TP_STRUCT__entry(
|
||||
RDI_DEV_ENTRY(ib_to_rvt(qp->ibqp.device))
|
||||
__field(u32, qpn)
|
||||
__field(u32, s_flags)
|
||||
__field(u32, psn)
|
||||
__field(u32, s_psn)
|
||||
__field(u32, s_next_psn)
|
||||
__field(u32, s_sending_psn)
|
||||
__field(u32, s_sending_hpsn)
|
||||
__field(u32, r_psn)
|
||||
),
|
||||
TP_fast_assign(
|
||||
RDI_DEV_ASSIGN(ib_to_rvt(qp->ibqp.device))
|
||||
__entry->qpn = qp->ibqp.qp_num;
|
||||
__entry->s_flags = qp->s_flags;
|
||||
__entry->psn = psn;
|
||||
__entry->s_psn = qp->s_psn;
|
||||
__entry->s_next_psn = qp->s_next_psn;
|
||||
__entry->s_sending_psn = qp->s_sending_psn;
|
||||
__entry->s_sending_hpsn = qp->s_sending_hpsn;
|
||||
__entry->r_psn = qp->r_psn;
|
||||
),
|
||||
TP_printk(
|
||||
"[%s] qpn 0x%x s_flags 0x%x psn 0x%x s_psn 0x%x s_next_psn 0x%x s_sending_psn 0x%x sending_hpsn 0x%x r_psn 0x%x",
|
||||
__get_str(dev),
|
||||
__entry->qpn,
|
||||
__entry->s_flags,
|
||||
__entry->psn,
|
||||
__entry->s_psn,
|
||||
__entry->s_next_psn,
|
||||
__entry->s_sending_psn,
|
||||
__entry->s_sending_hpsn,
|
||||
__entry->r_psn
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(rvt_rc_template, rvt_rc_timeout,
|
||||
TP_PROTO(struct rvt_qp *qp, u32 psn),
|
||||
TP_ARGS(qp, psn)
|
||||
);
|
||||
|
||||
#endif /* __RVT_TRACE_RC_H */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_rc
|
||||
#include <trace/define_trace.h>
|
@@ -71,10 +71,20 @@ __print_symbolic(opcode, \
|
||||
wr_opcode_name(RDMA_READ_WITH_INV), \
|
||||
wr_opcode_name(LOCAL_INV), \
|
||||
wr_opcode_name(MASKED_ATOMIC_CMP_AND_SWP), \
|
||||
wr_opcode_name(MASKED_ATOMIC_FETCH_AND_ADD))
|
||||
wr_opcode_name(MASKED_ATOMIC_FETCH_AND_ADD), \
|
||||
wr_opcode_name(RESERVED1), \
|
||||
wr_opcode_name(RESERVED2), \
|
||||
wr_opcode_name(RESERVED3), \
|
||||
wr_opcode_name(RESERVED4), \
|
||||
wr_opcode_name(RESERVED5), \
|
||||
wr_opcode_name(RESERVED6), \
|
||||
wr_opcode_name(RESERVED7), \
|
||||
wr_opcode_name(RESERVED8), \
|
||||
wr_opcode_name(RESERVED9), \
|
||||
wr_opcode_name(RESERVED10))
|
||||
|
||||
#define POS_PRN \
|
||||
"[%s] wr_id %llx qpn %x psn 0x%x lpsn 0x%x length %u opcode 0x%.2x,%s size %u avail %u head %u last %u"
|
||||
"[%s] wqe %p wr_id %llx send_flags %x qpn %x qpt %u psn %x lpsn %x ssn %x length %u opcode 0x%.2x,%s size %u avail %u head %u last %u pid %u num_sge %u"
|
||||
|
||||
TRACE_EVENT(
|
||||
rvt_post_one_wr,
|
||||
@@ -83,7 +93,9 @@ TRACE_EVENT(
|
||||
TP_STRUCT__entry(
|
||||
RDI_DEV_ENTRY(ib_to_rvt(qp->ibqp.device))
|
||||
__field(u64, wr_id)
|
||||
__field(struct rvt_swqe *, wqe)
|
||||
__field(u32, qpn)
|
||||
__field(u32, qpt)
|
||||
__field(u32, psn)
|
||||
__field(u32, lpsn)
|
||||
__field(u32, length)
|
||||
@@ -92,11 +104,17 @@ TRACE_EVENT(
|
||||
__field(u32, avail)
|
||||
__field(u32, head)
|
||||
__field(u32, last)
|
||||
__field(u32, ssn)
|
||||
__field(int, send_flags)
|
||||
__field(pid_t, pid)
|
||||
__field(int, num_sge)
|
||||
),
|
||||
TP_fast_assign(
|
||||
RDI_DEV_ASSIGN(ib_to_rvt(qp->ibqp.device))
|
||||
__entry->wqe = wqe;
|
||||
__entry->wr_id = wqe->wr.wr_id;
|
||||
__entry->qpn = qp->ibqp.qp_num;
|
||||
__entry->qpt = qp->ibqp.qp_type;
|
||||
__entry->psn = wqe->psn;
|
||||
__entry->lpsn = wqe->lpsn;
|
||||
__entry->length = wqe->length;
|
||||
@@ -105,20 +123,30 @@ TRACE_EVENT(
|
||||
__entry->avail = qp->s_avail;
|
||||
__entry->head = qp->s_head;
|
||||
__entry->last = qp->s_last;
|
||||
__entry->pid = qp->pid;
|
||||
__entry->ssn = wqe->ssn;
|
||||
__entry->send_flags = wqe->wr.send_flags;
|
||||
__entry->num_sge = wqe->wr.num_sge;
|
||||
),
|
||||
TP_printk(
|
||||
POS_PRN,
|
||||
__get_str(dev),
|
||||
__entry->wqe,
|
||||
__entry->wr_id,
|
||||
__entry->send_flags,
|
||||
__entry->qpn,
|
||||
__entry->qpt,
|
||||
__entry->psn,
|
||||
__entry->lpsn,
|
||||
__entry->ssn,
|
||||
__entry->length,
|
||||
__entry->opcode, show_wr_opcode(__entry->opcode),
|
||||
__entry->size,
|
||||
__entry->avail,
|
||||
__entry->head,
|
||||
__entry->last
|
||||
__entry->last,
|
||||
__entry->pid,
|
||||
__entry->num_sge
|
||||
)
|
||||
);
|
||||
|
||||
|
Посилання в новій задачі
Заблокувати користувача