Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
Pull rdma updates from Doug Ledford: - a large cleanup of how device capabilities are checked for various features - additional cleanups in the MAD processing - update to the srp driver - creation and use of centralized log message helpers - add const to a number of args to calls and clean up call chain - add support for extended cq create verb - add support for timestamps on cq completion - add support for processing OPA MAD packets * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (92 commits) IB/mad: Add final OPA MAD processing IB/mad: Add partial Intel OPA MAD support IB/mad: Add partial Intel OPA MAD support IB/core: Add OPA MAD core capability flag IB/mad: Add support for additional MAD info to/from drivers IB/mad: Convert allocations from kmem_cache to kzalloc IB/core: Add ability for drivers to report an alternate MAD size. IB/mad: Support alternate Base Versions when creating MADs IB/mad: Create a generic helper for DR forwarding checks IB/mad: Create a generic helper for DR SMP Recv processing IB/mad: Create a generic helper for DR SMP Send processing IB/mad: Split IB SMI handling from MAD Recv handler IB/mad cleanup: Generalize processing of MAD data IB/mad cleanup: Clean up function params -- find_mad_agent IB/mlx4: Add support for CQ time-stamping IB/mlx4: Add mmap call to map the hardware clock IB/core: Pass hardware specific data in query_device IB/core: Add timestamp_mask and hca_core_clock to query_device IB/core: Extend ib_uverbs_create_cq IB/core: Add CQ creation time-stamping flag ...
This commit is contained in:
@@ -1128,7 +1128,7 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv)
|
||||
{
|
||||
struct ipoib_neigh_table *ntbl = &priv->ntbl;
|
||||
struct ipoib_neigh_hash *htbl;
|
||||
struct ipoib_neigh **buckets;
|
||||
struct ipoib_neigh __rcu **buckets;
|
||||
u32 size;
|
||||
|
||||
clear_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags);
|
||||
@@ -1146,7 +1146,7 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv)
|
||||
htbl->size = size;
|
||||
htbl->mask = (size - 1);
|
||||
htbl->buckets = buckets;
|
||||
ntbl->htbl = htbl;
|
||||
RCU_INIT_POINTER(ntbl->htbl, htbl);
|
||||
htbl->ntbl = ntbl;
|
||||
atomic_set(&ntbl->entries, 0);
|
||||
|
||||
@@ -1685,9 +1685,7 @@ static void ipoib_add_one(struct ib_device *device)
|
||||
struct net_device *dev;
|
||||
struct ipoib_dev_priv *priv;
|
||||
int s, e, p;
|
||||
|
||||
if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB)
|
||||
return;
|
||||
int count = 0;
|
||||
|
||||
dev_list = kmalloc(sizeof *dev_list, GFP_KERNEL);
|
||||
if (!dev_list)
|
||||
@@ -1704,15 +1702,21 @@ static void ipoib_add_one(struct ib_device *device)
|
||||
}
|
||||
|
||||
for (p = s; p <= e; ++p) {
|
||||
if (rdma_port_get_link_layer(device, p) != IB_LINK_LAYER_INFINIBAND)
|
||||
if (!rdma_protocol_ib(device, p))
|
||||
continue;
|
||||
dev = ipoib_add_port("ib%d", device, p);
|
||||
if (!IS_ERR(dev)) {
|
||||
priv = netdev_priv(dev);
|
||||
list_add_tail(&priv->list, dev_list);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!count) {
|
||||
kfree(dev_list);
|
||||
return;
|
||||
}
|
||||
|
||||
ib_set_client_data(device, &ipoib_client, dev_list);
|
||||
}
|
||||
|
||||
@@ -1721,9 +1725,6 @@ static void ipoib_remove_one(struct ib_device *device)
|
||||
struct ipoib_dev_priv *priv, *tmp;
|
||||
struct list_head *dev_list;
|
||||
|
||||
if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB)
|
||||
return;
|
||||
|
||||
dev_list = ib_get_client_data(device, &ipoib_client);
|
||||
if (!dev_list)
|
||||
return;
|
||||
|
@@ -141,6 +141,7 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
|
||||
.sq_sig_type = IB_SIGNAL_ALL_WR,
|
||||
.qp_type = IB_QPT_UD
|
||||
};
|
||||
struct ib_cq_init_attr cq_attr = {};
|
||||
|
||||
int ret, size;
|
||||
int i;
|
||||
@@ -178,14 +179,17 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
|
||||
} else
|
||||
goto out_free_wq;
|
||||
|
||||
priv->recv_cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, size, 0);
|
||||
cq_attr.cqe = size;
|
||||
priv->recv_cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL,
|
||||
dev, &cq_attr);
|
||||
if (IS_ERR(priv->recv_cq)) {
|
||||
printk(KERN_WARNING "%s: failed to create receive CQ\n", ca->name);
|
||||
goto out_cm_dev_cleanup;
|
||||
}
|
||||
|
||||
cq_attr.cqe = ipoib_sendq_size;
|
||||
priv->send_cq = ib_create_cq(priv->ca, ipoib_send_comp_handler, NULL,
|
||||
dev, ipoib_sendq_size, 0);
|
||||
dev, &cq_attr);
|
||||
if (IS_ERR(priv->send_cq)) {
|
||||
printk(KERN_WARNING "%s: failed to create send CQ\n", ca->name);
|
||||
goto out_free_recv_cq;
|
||||
|
@@ -51,19 +51,22 @@ static void iser_cq_callback(struct ib_cq *cq, void *cq_context);
|
||||
|
||||
static void iser_cq_event_callback(struct ib_event *cause, void *context)
|
||||
{
|
||||
iser_err("got cq event %d \n", cause->event);
|
||||
iser_err("cq event %s (%d)\n",
|
||||
ib_event_msg(cause->event), cause->event);
|
||||
}
|
||||
|
||||
static void iser_qp_event_callback(struct ib_event *cause, void *context)
|
||||
{
|
||||
iser_err("got qp event %d\n",cause->event);
|
||||
iser_err("qp event %s (%d)\n",
|
||||
ib_event_msg(cause->event), cause->event);
|
||||
}
|
||||
|
||||
static void iser_event_handler(struct ib_event_handler *handler,
|
||||
struct ib_event *event)
|
||||
{
|
||||
iser_err("async event %d on device %s port %d\n", event->event,
|
||||
event->device->name, event->element.port_num);
|
||||
iser_err("async event %s (%d) on device %s port %d\n",
|
||||
ib_event_msg(event->event), event->event,
|
||||
event->device->name, event->element.port_num);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -123,14 +126,17 @@ static int iser_create_device_ib_res(struct iser_device *device)
|
||||
goto pd_err;
|
||||
|
||||
for (i = 0; i < device->comps_used; i++) {
|
||||
struct ib_cq_init_attr cq_attr = {};
|
||||
struct iser_comp *comp = &device->comps[i];
|
||||
|
||||
comp->device = device;
|
||||
cq_attr.cqe = max_cqe;
|
||||
cq_attr.comp_vector = i;
|
||||
comp->cq = ib_create_cq(device->ib_device,
|
||||
iser_cq_callback,
|
||||
iser_cq_event_callback,
|
||||
(void *)comp,
|
||||
max_cqe, i);
|
||||
&cq_attr);
|
||||
if (IS_ERR(comp->cq)) {
|
||||
comp->cq = NULL;
|
||||
goto cq_err;
|
||||
@@ -873,8 +879,9 @@ static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *eve
|
||||
int ret = 0;
|
||||
|
||||
iser_conn = (struct iser_conn *)cma_id->context;
|
||||
iser_info("event %d status %d conn %p id %p\n",
|
||||
event->event, event->status, cma_id->context, cma_id);
|
||||
iser_info("%s (%d): status %d conn %p id %p\n",
|
||||
rdma_event_msg(event->event), event->event,
|
||||
event->status, cma_id->context, cma_id);
|
||||
|
||||
mutex_lock(&iser_conn->state_mutex);
|
||||
switch (event->event) {
|
||||
@@ -913,7 +920,8 @@ static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *eve
|
||||
}
|
||||
break;
|
||||
default:
|
||||
iser_err("Unexpected RDMA CM event (%d)\n", event->event);
|
||||
iser_err("Unexpected RDMA CM event: %s (%d)\n",
|
||||
rdma_event_msg(event->event), event->event);
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&iser_conn->state_mutex);
|
||||
@@ -1173,10 +1181,13 @@ static void iser_handle_wc(struct ib_wc *wc)
|
||||
}
|
||||
} else {
|
||||
if (wc->status != IB_WC_WR_FLUSH_ERR)
|
||||
iser_err("wr id %llx status %d vend_err %x\n",
|
||||
wc->wr_id, wc->status, wc->vendor_err);
|
||||
iser_err("%s (%d): wr id %llx vend_err %x\n",
|
||||
ib_wc_status_msg(wc->status), wc->status,
|
||||
wc->wr_id, wc->vendor_err);
|
||||
else
|
||||
iser_dbg("flush error: wr id %llx\n", wc->wr_id);
|
||||
iser_dbg("%s (%d): wr id %llx\n",
|
||||
ib_wc_status_msg(wc->status), wc->status,
|
||||
wc->wr_id);
|
||||
|
||||
if (wc->wr_id == ISER_BEACON_WRID)
|
||||
/* all flush errors were consumed */
|
||||
|
@@ -80,7 +80,9 @@ isert_qp_event_callback(struct ib_event *e, void *context)
|
||||
{
|
||||
struct isert_conn *isert_conn = context;
|
||||
|
||||
isert_err("conn %p event: %d\n", isert_conn, e->event);
|
||||
isert_err("%s (%d): conn %p\n",
|
||||
ib_event_msg(e->event), e->event, isert_conn);
|
||||
|
||||
switch (e->event) {
|
||||
case IB_EVENT_COMM_EST:
|
||||
rdma_notify(isert_conn->cm_id, IB_EVENT_COMM_EST);
|
||||
@@ -318,15 +320,18 @@ isert_alloc_comps(struct isert_device *device,
|
||||
max_cqe = min(ISER_MAX_CQ_LEN, attr->max_cqe);
|
||||
|
||||
for (i = 0; i < device->comps_used; i++) {
|
||||
struct ib_cq_init_attr cq_attr = {};
|
||||
struct isert_comp *comp = &device->comps[i];
|
||||
|
||||
comp->device = device;
|
||||
INIT_WORK(&comp->work, isert_cq_work);
|
||||
cq_attr.cqe = max_cqe;
|
||||
cq_attr.comp_vector = i;
|
||||
comp->cq = ib_create_cq(device->ib_device,
|
||||
isert_cq_callback,
|
||||
isert_cq_event_callback,
|
||||
(void *)comp,
|
||||
max_cqe, i);
|
||||
&cq_attr);
|
||||
if (IS_ERR(comp->cq)) {
|
||||
isert_err("Unable to allocate cq\n");
|
||||
ret = PTR_ERR(comp->cq);
|
||||
@@ -900,7 +905,8 @@ static int
|
||||
isert_np_cma_handler(struct isert_np *isert_np,
|
||||
enum rdma_cm_event_type event)
|
||||
{
|
||||
isert_dbg("isert np %p, handling event %d\n", isert_np, event);
|
||||
isert_dbg("%s (%d): isert np %p\n",
|
||||
rdma_event_msg(event), event, isert_np);
|
||||
|
||||
switch (event) {
|
||||
case RDMA_CM_EVENT_DEVICE_REMOVAL:
|
||||
@@ -974,7 +980,8 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
isert_info("event %d status %d id %p np %p\n", event->event,
|
||||
isert_info("%s (%d): status %d id %p np %p\n",
|
||||
rdma_event_msg(event->event), event->event,
|
||||
event->status, cma_id, cma_id->context);
|
||||
|
||||
switch (event->event) {
|
||||
@@ -2108,10 +2115,13 @@ isert_handle_wc(struct ib_wc *wc)
|
||||
}
|
||||
} else {
|
||||
if (wc->status != IB_WC_WR_FLUSH_ERR)
|
||||
isert_err("wr id %llx status %d vend_err %x\n",
|
||||
wc->wr_id, wc->status, wc->vendor_err);
|
||||
isert_err("%s (%d): wr id %llx vend_err %x\n",
|
||||
ib_wc_status_msg(wc->status), wc->status,
|
||||
wc->wr_id, wc->vendor_err);
|
||||
else
|
||||
isert_dbg("flush error: wr id %llx\n", wc->wr_id);
|
||||
isert_dbg("%s (%d): wr id %llx\n",
|
||||
ib_wc_status_msg(wc->status), wc->status,
|
||||
wc->wr_id);
|
||||
|
||||
if (wc->wr_id != ISER_FASTREG_LI_WRID)
|
||||
isert_cq_comp_err(isert_conn, wc);
|
||||
|
@@ -59,9 +59,10 @@
|
||||
#define DRV_RELDATE "July 1, 2013"
|
||||
|
||||
MODULE_AUTHOR("Roland Dreier");
|
||||
MODULE_DESCRIPTION("InfiniBand SCSI RDMA Protocol initiator "
|
||||
"v" DRV_VERSION " (" DRV_RELDATE ")");
|
||||
MODULE_DESCRIPTION("InfiniBand SCSI RDMA Protocol initiator");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
MODULE_INFO(release_date, DRV_RELDATE);
|
||||
|
||||
static unsigned int srp_sg_tablesize;
|
||||
static unsigned int cmd_sg_entries;
|
||||
@@ -253,7 +254,8 @@ static void srp_free_iu(struct srp_host *host, struct srp_iu *iu)
|
||||
|
||||
static void srp_qp_event(struct ib_event *event, void *context)
|
||||
{
|
||||
pr_debug("QP event %d\n", event->event);
|
||||
pr_debug("QP event %s (%d)\n",
|
||||
ib_event_msg(event->event), event->event);
|
||||
}
|
||||
|
||||
static int srp_init_qp(struct srp_target_port *target,
|
||||
@@ -465,14 +467,13 @@ static struct srp_fr_pool *srp_alloc_fr_pool(struct srp_target_port *target)
|
||||
*/
|
||||
static void srp_destroy_qp(struct srp_rdma_ch *ch)
|
||||
{
|
||||
struct srp_target_port *target = ch->target;
|
||||
static struct ib_qp_attr attr = { .qp_state = IB_QPS_ERR };
|
||||
static struct ib_recv_wr wr = { .wr_id = SRP_LAST_WR_ID };
|
||||
struct ib_recv_wr *bad_wr;
|
||||
int ret;
|
||||
|
||||
/* Destroying a QP and reusing ch->done is only safe if not connected */
|
||||
WARN_ON_ONCE(target->connected);
|
||||
WARN_ON_ONCE(ch->connected);
|
||||
|
||||
ret = ib_modify_qp(ch->qp, &attr, IB_QP_STATE);
|
||||
WARN_ONCE(ret, "ib_cm_init_qp_attr() returned %d\n", ret);
|
||||
@@ -499,6 +500,7 @@ static int srp_create_ch_ib(struct srp_rdma_ch *ch)
|
||||
struct ib_fmr_pool *fmr_pool = NULL;
|
||||
struct srp_fr_pool *fr_pool = NULL;
|
||||
const int m = 1 + dev->use_fast_reg;
|
||||
struct ib_cq_init_attr cq_attr = {};
|
||||
int ret;
|
||||
|
||||
init_attr = kzalloc(sizeof *init_attr, GFP_KERNEL);
|
||||
@@ -506,15 +508,19 @@ static int srp_create_ch_ib(struct srp_rdma_ch *ch)
|
||||
return -ENOMEM;
|
||||
|
||||
/* + 1 for SRP_LAST_WR_ID */
|
||||
cq_attr.cqe = target->queue_size + 1;
|
||||
cq_attr.comp_vector = ch->comp_vector;
|
||||
recv_cq = ib_create_cq(dev->dev, srp_recv_completion, NULL, ch,
|
||||
target->queue_size + 1, ch->comp_vector);
|
||||
&cq_attr);
|
||||
if (IS_ERR(recv_cq)) {
|
||||
ret = PTR_ERR(recv_cq);
|
||||
goto err;
|
||||
}
|
||||
|
||||
cq_attr.cqe = m * target->queue_size;
|
||||
cq_attr.comp_vector = ch->comp_vector;
|
||||
send_cq = ib_create_cq(dev->dev, srp_send_completion, NULL, ch,
|
||||
m * target->queue_size, ch->comp_vector);
|
||||
&cq_attr);
|
||||
if (IS_ERR(send_cq)) {
|
||||
ret = PTR_ERR(send_cq);
|
||||
goto err_recv_cq;
|
||||
@@ -781,7 +787,7 @@ static int srp_send_req(struct srp_rdma_ch *ch, bool multich)
|
||||
shost_printk(KERN_DEBUG, target->scsi_host,
|
||||
PFX "Topspin/Cisco initiator port ID workaround "
|
||||
"activated for target GUID %016llx\n",
|
||||
(unsigned long long) be64_to_cpu(target->ioc_guid));
|
||||
be64_to_cpu(target->ioc_guid));
|
||||
memset(req->priv.initiator_port_id, 0, 8);
|
||||
memcpy(req->priv.initiator_port_id + 8,
|
||||
&target->srp_host->srp_dev->dev->node_guid, 8);
|
||||
@@ -811,35 +817,19 @@ static bool srp_queue_remove_work(struct srp_target_port *target)
|
||||
return changed;
|
||||
}
|
||||
|
||||
static bool srp_change_conn_state(struct srp_target_port *target,
|
||||
bool connected)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
spin_lock_irq(&target->lock);
|
||||
if (target->connected != connected) {
|
||||
target->connected = connected;
|
||||
changed = true;
|
||||
}
|
||||
spin_unlock_irq(&target->lock);
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
static void srp_disconnect_target(struct srp_target_port *target)
|
||||
{
|
||||
struct srp_rdma_ch *ch;
|
||||
int i;
|
||||
|
||||
if (srp_change_conn_state(target, false)) {
|
||||
/* XXX should send SRP_I_LOGOUT request */
|
||||
/* XXX should send SRP_I_LOGOUT request */
|
||||
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
if (ch->cm_id && ib_send_cm_dreq(ch->cm_id, NULL, 0)) {
|
||||
shost_printk(KERN_DEBUG, target->scsi_host,
|
||||
PFX "Sending CM DREQ failed\n");
|
||||
}
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
ch->connected = false;
|
||||
if (ch->cm_id && ib_send_cm_dreq(ch->cm_id, NULL, 0)) {
|
||||
shost_printk(KERN_DEBUG, target->scsi_host,
|
||||
PFX "Sending CM DREQ failed\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -852,7 +842,7 @@ static void srp_free_req_data(struct srp_target_port *target,
|
||||
struct srp_request *req;
|
||||
int i;
|
||||
|
||||
if (!ch->target || !ch->req_ring)
|
||||
if (!ch->req_ring)
|
||||
return;
|
||||
|
||||
for (i = 0; i < target->req_ring_size; ++i) {
|
||||
@@ -986,14 +976,26 @@ static void srp_rport_delete(struct srp_rport *rport)
|
||||
srp_queue_remove_work(target);
|
||||
}
|
||||
|
||||
/**
|
||||
* srp_connected_ch() - number of connected channels
|
||||
* @target: SRP target port.
|
||||
*/
|
||||
static int srp_connected_ch(struct srp_target_port *target)
|
||||
{
|
||||
int i, c = 0;
|
||||
|
||||
for (i = 0; i < target->ch_count; i++)
|
||||
c += target->ch[i].connected;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static int srp_connect_ch(struct srp_rdma_ch *ch, bool multich)
|
||||
{
|
||||
struct srp_target_port *target = ch->target;
|
||||
int ret;
|
||||
|
||||
WARN_ON_ONCE(!multich && target->connected);
|
||||
|
||||
target->qp_in_error = false;
|
||||
WARN_ON_ONCE(!multich && srp_connected_ch(target) > 0);
|
||||
|
||||
ret = srp_lookup_path(ch);
|
||||
if (ret)
|
||||
@@ -1016,7 +1018,7 @@ static int srp_connect_ch(struct srp_rdma_ch *ch, bool multich)
|
||||
*/
|
||||
switch (ch->status) {
|
||||
case 0:
|
||||
srp_change_conn_state(target, true);
|
||||
ch->connected = true;
|
||||
return 0;
|
||||
|
||||
case SRP_PORT_REDIRECT:
|
||||
@@ -1214,14 +1216,10 @@ static int srp_rport_reconnect(struct srp_rport *rport)
|
||||
*/
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
if (!ch->target)
|
||||
break;
|
||||
ret += srp_new_cm_id(ch);
|
||||
}
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
if (!ch->target)
|
||||
break;
|
||||
for (j = 0; j < target->req_ring_size; ++j) {
|
||||
struct srp_request *req = &ch->req_ring[j];
|
||||
|
||||
@@ -1230,8 +1228,6 @@ static int srp_rport_reconnect(struct srp_rport *rport)
|
||||
}
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
if (!ch->target)
|
||||
break;
|
||||
/*
|
||||
* Whether or not creating a new CM ID succeeded, create a new
|
||||
* QP. This guarantees that all completion callback function
|
||||
@@ -1243,13 +1239,13 @@ static int srp_rport_reconnect(struct srp_rport *rport)
|
||||
for (j = 0; j < target->queue_size; ++j)
|
||||
list_add(&ch->tx_ring[j]->list, &ch->free_tx);
|
||||
}
|
||||
|
||||
target->qp_in_error = false;
|
||||
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
if (ret || !ch->target) {
|
||||
if (i > 1)
|
||||
ret = 0;
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
ret = srp_connect_ch(ch, multich);
|
||||
multich = true;
|
||||
}
|
||||
@@ -1842,7 +1838,7 @@ static void srp_process_aer_req(struct srp_rdma_ch *ch,
|
||||
s32 delta = be32_to_cpu(req->req_lim_delta);
|
||||
|
||||
shost_printk(KERN_ERR, target->scsi_host, PFX
|
||||
"ignoring AER for LUN %llu\n", be64_to_cpu(req->lun));
|
||||
"ignoring AER for LUN %llu\n", scsilun_to_int(&req->lun));
|
||||
|
||||
if (srp_response_common(ch, delta, &rsp, sizeof(rsp)))
|
||||
shost_printk(KERN_ERR, target->scsi_host, PFX
|
||||
@@ -1929,20 +1925,21 @@ static void srp_handle_qp_err(u64 wr_id, enum ib_wc_status wc_status,
|
||||
return;
|
||||
}
|
||||
|
||||
if (target->connected && !target->qp_in_error) {
|
||||
if (ch->connected && !target->qp_in_error) {
|
||||
if (wr_id & LOCAL_INV_WR_ID_MASK) {
|
||||
shost_printk(KERN_ERR, target->scsi_host, PFX
|
||||
"LOCAL_INV failed with status %d\n",
|
||||
wc_status);
|
||||
"LOCAL_INV failed with status %s (%d)\n",
|
||||
ib_wc_status_msg(wc_status), wc_status);
|
||||
} else if (wr_id & FAST_REG_WR_ID_MASK) {
|
||||
shost_printk(KERN_ERR, target->scsi_host, PFX
|
||||
"FAST_REG_MR failed status %d\n",
|
||||
wc_status);
|
||||
"FAST_REG_MR failed status %s (%d)\n",
|
||||
ib_wc_status_msg(wc_status), wc_status);
|
||||
} else {
|
||||
shost_printk(KERN_ERR, target->scsi_host,
|
||||
PFX "failed %s status %d for iu %p\n",
|
||||
PFX "failed %s status %s (%d) for iu %p\n",
|
||||
send_err ? "send" : "receive",
|
||||
wc_status, (void *)(uintptr_t)wr_id);
|
||||
ib_wc_status_msg(wc_status), wc_status,
|
||||
(void *)(uintptr_t)wr_id);
|
||||
}
|
||||
queue_work(system_long_wq, &target->tl_err_work);
|
||||
}
|
||||
@@ -2034,7 +2031,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
|
||||
memset(cmd, 0, sizeof *cmd);
|
||||
|
||||
cmd->opcode = SRP_CMD;
|
||||
cmd->lun = cpu_to_be64((u64) scmnd->device->lun << 48);
|
||||
int_to_scsilun(scmnd->device->lun, &cmd->lun);
|
||||
cmd->tag = tag;
|
||||
memcpy(cmd->cdb, scmnd->cmnd, scmnd->cmd_len);
|
||||
|
||||
@@ -2367,7 +2364,7 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
|
||||
case IB_CM_DREQ_RECEIVED:
|
||||
shost_printk(KERN_WARNING, target->scsi_host,
|
||||
PFX "DREQ received - connection closed\n");
|
||||
srp_change_conn_state(target, false);
|
||||
ch->connected = false;
|
||||
if (ib_send_cm_drep(cm_id, NULL, 0))
|
||||
shost_printk(KERN_ERR, target->scsi_host,
|
||||
PFX "Sending CM DREP failed\n");
|
||||
@@ -2414,8 +2411,8 @@ srp_change_queue_depth(struct scsi_device *sdev, int qdepth)
|
||||
return scsi_change_queue_depth(sdev, qdepth);
|
||||
}
|
||||
|
||||
static int srp_send_tsk_mgmt(struct srp_rdma_ch *ch, u64 req_tag,
|
||||
unsigned int lun, u8 func)
|
||||
static int srp_send_tsk_mgmt(struct srp_rdma_ch *ch, u64 req_tag, u64 lun,
|
||||
u8 func)
|
||||
{
|
||||
struct srp_target_port *target = ch->target;
|
||||
struct srp_rport *rport = target->rport;
|
||||
@@ -2423,7 +2420,7 @@ static int srp_send_tsk_mgmt(struct srp_rdma_ch *ch, u64 req_tag,
|
||||
struct srp_iu *iu;
|
||||
struct srp_tsk_mgmt *tsk_mgmt;
|
||||
|
||||
if (!target->connected || target->qp_in_error)
|
||||
if (!ch->connected || target->qp_in_error)
|
||||
return -1;
|
||||
|
||||
init_completion(&ch->tsk_mgmt_done);
|
||||
@@ -2449,7 +2446,7 @@ static int srp_send_tsk_mgmt(struct srp_rdma_ch *ch, u64 req_tag,
|
||||
memset(tsk_mgmt, 0, sizeof *tsk_mgmt);
|
||||
|
||||
tsk_mgmt->opcode = SRP_TSK_MGMT;
|
||||
tsk_mgmt->lun = cpu_to_be64((u64) lun << 48);
|
||||
int_to_scsilun(lun, &tsk_mgmt->lun);
|
||||
tsk_mgmt->tag = req_tag | SRP_TAG_TSK_MGMT;
|
||||
tsk_mgmt->tsk_mgmt_func = func;
|
||||
tsk_mgmt->task_tag = req_tag;
|
||||
@@ -2563,8 +2560,7 @@ static ssize_t show_id_ext(struct device *dev, struct device_attribute *attr,
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(class_to_shost(dev));
|
||||
|
||||
return sprintf(buf, "0x%016llx\n",
|
||||
(unsigned long long) be64_to_cpu(target->id_ext));
|
||||
return sprintf(buf, "0x%016llx\n", be64_to_cpu(target->id_ext));
|
||||
}
|
||||
|
||||
static ssize_t show_ioc_guid(struct device *dev, struct device_attribute *attr,
|
||||
@@ -2572,8 +2568,7 @@ static ssize_t show_ioc_guid(struct device *dev, struct device_attribute *attr,
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(class_to_shost(dev));
|
||||
|
||||
return sprintf(buf, "0x%016llx\n",
|
||||
(unsigned long long) be64_to_cpu(target->ioc_guid));
|
||||
return sprintf(buf, "0x%016llx\n", be64_to_cpu(target->ioc_guid));
|
||||
}
|
||||
|
||||
static ssize_t show_service_id(struct device *dev,
|
||||
@@ -2581,8 +2576,7 @@ static ssize_t show_service_id(struct device *dev,
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(class_to_shost(dev));
|
||||
|
||||
return sprintf(buf, "0x%016llx\n",
|
||||
(unsigned long long) be64_to_cpu(target->service_id));
|
||||
return sprintf(buf, "0x%016llx\n", be64_to_cpu(target->service_id));
|
||||
}
|
||||
|
||||
static ssize_t show_pkey(struct device *dev, struct device_attribute *attr,
|
||||
@@ -2773,7 +2767,7 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
|
||||
|
||||
target->state = SRP_TARGET_SCANNING;
|
||||
sprintf(target->target_name, "SRP.T10:%016llX",
|
||||
(unsigned long long) be64_to_cpu(target->id_ext));
|
||||
be64_to_cpu(target->id_ext));
|
||||
|
||||
if (scsi_add_host(target->scsi_host, host->srp_dev->dev->dma_device))
|
||||
return -ENODEV;
|
||||
@@ -2797,7 +2791,8 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
|
||||
scsi_scan_target(&target->scsi_host->shost_gendev,
|
||||
0, target->scsi_id, SCAN_WILD_CARD, 0);
|
||||
|
||||
if (!target->connected || target->qp_in_error) {
|
||||
if (srp_connected_ch(target) < target->ch_count ||
|
||||
target->qp_in_error) {
|
||||
shost_printk(KERN_INFO, target->scsi_host,
|
||||
PFX "SCSI scan failed - removing SCSI host\n");
|
||||
srp_queue_remove_work(target);
|
||||
@@ -3146,7 +3141,7 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
target_host->transportt = ib_srp_transport_template;
|
||||
target_host->max_channel = 0;
|
||||
target_host->max_id = 1;
|
||||
target_host->max_lun = SRP_MAX_LUN;
|
||||
target_host->max_lun = -1LL;
|
||||
target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;
|
||||
|
||||
target = host_to_target(target_host);
|
||||
@@ -3172,11 +3167,11 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
|
||||
ret = srp_parse_options(buf, target);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
|
||||
ret = scsi_init_shared_tag_map(target_host, target_host->can_queue);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
|
||||
target->req_ring_size = target->queue_size - SRP_TSK_MGMT_SQ_SIZE;
|
||||
|
||||
@@ -3187,7 +3182,7 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
be64_to_cpu(target->ioc_guid),
|
||||
be64_to_cpu(target->initiator_ext));
|
||||
ret = -EEXIST;
|
||||
goto err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!srp_dev->has_fmr && !srp_dev->has_fr && !target->allow_ext_sg &&
|
||||
@@ -3208,7 +3203,7 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
spin_lock_init(&target->lock);
|
||||
ret = ib_query_gid(ibdev, host->port, 0, &target->sgid);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
|
||||
ret = -ENOMEM;
|
||||
target->ch_count = max_t(unsigned, num_online_nodes(),
|
||||
@@ -3219,7 +3214,7 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
target->ch = kcalloc(target->ch_count, sizeof(*target->ch),
|
||||
GFP_KERNEL);
|
||||
if (!target->ch)
|
||||
goto err;
|
||||
goto out;
|
||||
|
||||
node_idx = 0;
|
||||
for_each_online_node(node) {
|
||||
@@ -3315,9 +3310,6 @@ err_disconnect:
|
||||
}
|
||||
|
||||
kfree(target->ch);
|
||||
|
||||
err:
|
||||
scsi_host_put(target_host);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@@ -54,7 +54,6 @@ enum {
|
||||
SRP_DLID_REDIRECT = 2,
|
||||
SRP_STALE_CONN = 3,
|
||||
|
||||
SRP_MAX_LUN = 512,
|
||||
SRP_DEF_SG_TABLESIZE = 12,
|
||||
|
||||
SRP_DEFAULT_QUEUE_SIZE = 1 << 6,
|
||||
@@ -170,6 +169,7 @@ struct srp_rdma_ch {
|
||||
|
||||
struct completion tsk_mgmt_done;
|
||||
u8 tsk_mgmt_status;
|
||||
bool connected;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -214,7 +214,6 @@ struct srp_target_port {
|
||||
__be16 pkey;
|
||||
|
||||
u32 rq_tmo_jiffies;
|
||||
bool connected;
|
||||
|
||||
int zero_req_lim;
|
||||
|
||||
|
@@ -476,7 +476,8 @@ static void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent,
|
||||
rsp = ib_create_send_mad(mad_agent, mad_wc->wc->src_qp,
|
||||
mad_wc->wc->pkey_index, 0,
|
||||
IB_MGMT_DEVICE_HDR, IB_MGMT_DEVICE_DATA,
|
||||
GFP_KERNEL);
|
||||
GFP_KERNEL,
|
||||
IB_MGMT_BASE_VERSION);
|
||||
if (IS_ERR(rsp))
|
||||
goto err_rsp;
|
||||
|
||||
@@ -2080,6 +2081,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
|
||||
struct srpt_port *sport = ch->sport;
|
||||
struct srpt_device *sdev = sport->sdev;
|
||||
u32 srp_sq_size = sport->port_attrib.srp_sq_size;
|
||||
struct ib_cq_init_attr cq_attr = {};
|
||||
int ret;
|
||||
|
||||
WARN_ON(ch->rq_size < 1);
|
||||
@@ -2090,8 +2092,9 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
|
||||
goto out;
|
||||
|
||||
retry:
|
||||
cq_attr.cqe = ch->rq_size + srp_sq_size;
|
||||
ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch,
|
||||
ch->rq_size + srp_sq_size, 0);
|
||||
&cq_attr);
|
||||
if (IS_ERR(ch->cq)) {
|
||||
ret = PTR_ERR(ch->cq);
|
||||
pr_err("failed to create CQ cqe= %d ret= %d\n",
|
||||
|
Reference in New Issue
Block a user