Merge branches 'misc', 'qedr', 'reject-helpers', 'rxe' and 'srp' into merge-test
Šī revīzija ir iekļauta:
@@ -575,8 +575,11 @@ void ipoib_mcast_join_task(struct work_struct *work)
|
||||
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags))
|
||||
return;
|
||||
|
||||
if (ib_query_port(priv->ca, priv->port, &port_attr) ||
|
||||
port_attr.state != IB_PORT_ACTIVE) {
|
||||
if (ib_query_port(priv->ca, priv->port, &port_attr)) {
|
||||
ipoib_dbg(priv, "ib_query_port() failed\n");
|
||||
return;
|
||||
}
|
||||
if (port_attr.state != IB_PORT_ACTIVE) {
|
||||
ipoib_dbg(priv, "port state is not ACTIVE (state = %d) suspending join task\n",
|
||||
port_attr.state);
|
||||
return;
|
||||
|
@@ -890,11 +890,14 @@ static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *eve
|
||||
case RDMA_CM_EVENT_ESTABLISHED:
|
||||
iser_connected_handler(cma_id, event->param.conn.private_data);
|
||||
break;
|
||||
case RDMA_CM_EVENT_REJECTED:
|
||||
iser_info("Connection rejected: %s\n",
|
||||
rdma_reject_msg(cma_id, event->status));
|
||||
/* FALLTHROUGH */
|
||||
case RDMA_CM_EVENT_ADDR_ERROR:
|
||||
case RDMA_CM_EVENT_ROUTE_ERROR:
|
||||
case RDMA_CM_EVENT_CONNECT_ERROR:
|
||||
case RDMA_CM_EVENT_UNREACHABLE:
|
||||
case RDMA_CM_EVENT_REJECTED:
|
||||
iser_connect_error(cma_id);
|
||||
break;
|
||||
case RDMA_CM_EVENT_DISCONNECTED:
|
||||
|
@@ -789,6 +789,8 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||
*/
|
||||
return 1;
|
||||
case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */
|
||||
isert_info("Connection rejected: %s\n",
|
||||
rdma_reject_msg(cma_id, event->status));
|
||||
case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */
|
||||
case RDMA_CM_EVENT_CONNECT_ERROR:
|
||||
ret = isert_connect_error(cma_id);
|
||||
@@ -1842,6 +1844,8 @@ isert_put_response(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
||||
isert_cmd->pdu_buf_dma = ib_dma_map_single(ib_dev,
|
||||
(void *)cmd->sense_buffer, pdu_len,
|
||||
DMA_TO_DEVICE);
|
||||
if (ib_dma_mapping_error(ib_dev, isert_cmd->pdu_buf_dma))
|
||||
return -ENOMEM;
|
||||
|
||||
isert_cmd->pdu_buf_len = pdu_len;
|
||||
tx_dsg->addr = isert_cmd->pdu_buf_dma;
|
||||
@@ -1969,6 +1973,8 @@ isert_put_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
|
||||
isert_cmd->pdu_buf_dma = ib_dma_map_single(ib_dev,
|
||||
(void *)cmd->buf_ptr, ISCSI_HDR_LEN,
|
||||
DMA_TO_DEVICE);
|
||||
if (ib_dma_mapping_error(ib_dev, isert_cmd->pdu_buf_dma))
|
||||
return -ENOMEM;
|
||||
isert_cmd->pdu_buf_len = ISCSI_HDR_LEN;
|
||||
tx_dsg->addr = isert_cmd->pdu_buf_dma;
|
||||
tx_dsg->length = ISCSI_HDR_LEN;
|
||||
@@ -2009,6 +2015,8 @@ isert_put_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
|
||||
|
||||
isert_cmd->pdu_buf_dma = ib_dma_map_single(ib_dev,
|
||||
txt_rsp_buf, txt_rsp_len, DMA_TO_DEVICE);
|
||||
if (ib_dma_mapping_error(ib_dev, isert_cmd->pdu_buf_dma))
|
||||
return -ENOMEM;
|
||||
|
||||
isert_cmd->pdu_buf_len = txt_rsp_len;
|
||||
tx_dsg->addr = isert_cmd->pdu_buf_dma;
|
||||
|
@@ -64,6 +64,11 @@ MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
MODULE_INFO(release_date, DRV_RELDATE);
|
||||
|
||||
#if !defined(CONFIG_DYNAMIC_DEBUG)
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)
|
||||
#define DYNAMIC_DEBUG_BRANCH(descriptor) false
|
||||
#endif
|
||||
|
||||
static unsigned int srp_sg_tablesize;
|
||||
static unsigned int cmd_sg_entries;
|
||||
static unsigned int indirect_sg_entries;
|
||||
@@ -384,6 +389,9 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
|
||||
max_page_list_len);
|
||||
if (IS_ERR(mr)) {
|
||||
ret = PTR_ERR(mr);
|
||||
if (ret == -ENOMEM)
|
||||
pr_info("%s: ib_alloc_mr() failed. Try to reduce max_cmd_per_lun, max_sect or ch_count\n",
|
||||
dev_name(&device->dev));
|
||||
goto destroy_pool;
|
||||
}
|
||||
d->mr = mr;
|
||||
@@ -1266,8 +1274,12 @@ static int srp_map_finish_fmr(struct srp_map_state *state,
|
||||
struct ib_pool_fmr *fmr;
|
||||
u64 io_addr = 0;
|
||||
|
||||
if (state->fmr.next >= state->fmr.end)
|
||||
if (state->fmr.next >= state->fmr.end) {
|
||||
shost_printk(KERN_ERR, ch->target->scsi_host,
|
||||
PFX "Out of MRs (mr_per_cmd = %d)\n",
|
||||
ch->target->mr_per_cmd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!dev->use_fmr);
|
||||
|
||||
@@ -1323,8 +1335,12 @@ static int srp_map_finish_fr(struct srp_map_state *state,
|
||||
u32 rkey;
|
||||
int n, err;
|
||||
|
||||
if (state->fr.next >= state->fr.end)
|
||||
if (state->fr.next >= state->fr.end) {
|
||||
shost_printk(KERN_ERR, ch->target->scsi_host,
|
||||
PFX "Out of MRs (mr_per_cmd = %d)\n",
|
||||
ch->target->mr_per_cmd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(!dev->use_fast_reg);
|
||||
|
||||
@@ -1556,7 +1572,6 @@ static int srp_map_idb(struct srp_rdma_ch *ch, struct srp_request *req,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(DYNAMIC_DATA_DEBUG)
|
||||
static void srp_check_mapping(struct srp_map_state *state,
|
||||
struct srp_rdma_ch *ch, struct srp_request *req,
|
||||
struct scatterlist *scat, int count)
|
||||
@@ -1580,7 +1595,6 @@ static void srp_check_mapping(struct srp_map_state *state,
|
||||
scsi_bufflen(req->scmnd), desc_len, mr_len,
|
||||
state->ndesc, state->nmdesc);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* srp_map_data() - map SCSI data buffer onto an SRP request
|
||||
@@ -1669,14 +1683,12 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_rdma_ch *ch,
|
||||
if (ret < 0)
|
||||
goto unmap;
|
||||
|
||||
#if defined(DYNAMIC_DEBUG)
|
||||
{
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(ddm,
|
||||
"Memory mapping consistency check");
|
||||
if (unlikely(ddm.flags & _DPRINTK_FLAGS_PRINT))
|
||||
if (DYNAMIC_DEBUG_BRANCH(ddm))
|
||||
srp_check_mapping(&state, ch, req, scat, count);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* We've mapped the request, now pull as much of the indirect
|
||||
* descriptor table as we can into the command buffer. If this
|
||||
@@ -3287,7 +3299,9 @@ static ssize_t srp_create_target(struct device *dev,
|
||||
*/
|
||||
scsi_host_get(target->scsi_host);
|
||||
|
||||
mutex_lock(&host->add_target_mutex);
|
||||
ret = mutex_lock_interruptible(&host->add_target_mutex);
|
||||
if (ret < 0)
|
||||
goto put;
|
||||
|
||||
ret = srp_parse_options(buf, target);
|
||||
if (ret)
|
||||
@@ -3443,6 +3457,7 @@ connected:
|
||||
out:
|
||||
mutex_unlock(&host->add_target_mutex);
|
||||
|
||||
put:
|
||||
scsi_host_put(target->scsi_host);
|
||||
if (ret < 0)
|
||||
scsi_host_put(target->scsi_host);
|
||||
@@ -3526,6 +3541,7 @@ free_host:
|
||||
static void srp_add_one(struct ib_device *device)
|
||||
{
|
||||
struct srp_device *srp_dev;
|
||||
struct ib_device_attr *attr = &device->attrs;
|
||||
struct srp_host *host;
|
||||
int mr_page_shift, p;
|
||||
u64 max_pages_per_mr;
|
||||
@@ -3540,25 +3556,25 @@ static void srp_add_one(struct ib_device *device)
|
||||
* minimum of 4096 bytes. We're unlikely to build large sglists
|
||||
* out of smaller entries.
|
||||
*/
|
||||
mr_page_shift = max(12, ffs(device->attrs.page_size_cap) - 1);
|
||||
mr_page_shift = max(12, ffs(attr->page_size_cap) - 1);
|
||||
srp_dev->mr_page_size = 1 << mr_page_shift;
|
||||
srp_dev->mr_page_mask = ~((u64) srp_dev->mr_page_size - 1);
|
||||
max_pages_per_mr = device->attrs.max_mr_size;
|
||||
max_pages_per_mr = attr->max_mr_size;
|
||||
do_div(max_pages_per_mr, srp_dev->mr_page_size);
|
||||
pr_debug("%s: %llu / %u = %llu <> %u\n", __func__,
|
||||
device->attrs.max_mr_size, srp_dev->mr_page_size,
|
||||
attr->max_mr_size, srp_dev->mr_page_size,
|
||||
max_pages_per_mr, SRP_MAX_PAGES_PER_MR);
|
||||
srp_dev->max_pages_per_mr = min_t(u64, SRP_MAX_PAGES_PER_MR,
|
||||
max_pages_per_mr);
|
||||
|
||||
srp_dev->has_fmr = (device->alloc_fmr && device->dealloc_fmr &&
|
||||
device->map_phys_fmr && device->unmap_fmr);
|
||||
srp_dev->has_fr = (device->attrs.device_cap_flags &
|
||||
srp_dev->has_fr = (attr->device_cap_flags &
|
||||
IB_DEVICE_MEM_MGT_EXTENSIONS);
|
||||
if (!never_register && !srp_dev->has_fmr && !srp_dev->has_fr) {
|
||||
dev_warn(&device->dev, "neither FMR nor FR is supported\n");
|
||||
} else if (!never_register &&
|
||||
device->attrs.max_mr_size >= 2 * srp_dev->mr_page_size) {
|
||||
attr->max_mr_size >= 2 * srp_dev->mr_page_size) {
|
||||
srp_dev->use_fast_reg = (srp_dev->has_fr &&
|
||||
(!srp_dev->has_fmr || prefer_fr));
|
||||
srp_dev->use_fmr = !srp_dev->use_fast_reg && srp_dev->has_fmr;
|
||||
@@ -3571,13 +3587,13 @@ static void srp_add_one(struct ib_device *device)
|
||||
if (srp_dev->use_fast_reg) {
|
||||
srp_dev->max_pages_per_mr =
|
||||
min_t(u32, srp_dev->max_pages_per_mr,
|
||||
device->attrs.max_fast_reg_page_list_len);
|
||||
attr->max_fast_reg_page_list_len);
|
||||
}
|
||||
srp_dev->mr_max_size = srp_dev->mr_page_size *
|
||||
srp_dev->max_pages_per_mr;
|
||||
pr_debug("%s: mr_page_shift = %d, device->max_mr_size = %#llx, device->max_fast_reg_page_list_len = %u, max_pages_per_mr = %d, mr_max_size = %#x\n",
|
||||
device->name, mr_page_shift, device->attrs.max_mr_size,
|
||||
device->attrs.max_fast_reg_page_list_len,
|
||||
device->name, mr_page_shift, attr->max_mr_size,
|
||||
attr->max_fast_reg_page_list_len,
|
||||
srp_dev->max_pages_per_mr, srp_dev->mr_max_size);
|
||||
|
||||
INIT_LIST_HEAD(&srp_dev->dev_list);
|
||||
|
@@ -1840,7 +1840,6 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
|
||||
struct srpt_rdma_ch *ch, *tmp_ch;
|
||||
u32 it_iu_len;
|
||||
int i, ret = 0;
|
||||
unsigned char *p;
|
||||
|
||||
WARN_ON_ONCE(irqs_disabled());
|
||||
|
||||
@@ -1994,21 +1993,18 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
|
||||
be64_to_cpu(*(__be64 *)(ch->i_port_id + 8)));
|
||||
|
||||
pr_debug("registering session %s\n", ch->sess_name);
|
||||
p = &ch->sess_name[0];
|
||||
|
||||
try_again:
|
||||
ch->sess = target_alloc_session(&sport->port_tpg_1, 0, 0,
|
||||
TARGET_PROT_NORMAL, p, ch, NULL);
|
||||
TARGET_PROT_NORMAL, ch->sess_name, ch,
|
||||
NULL);
|
||||
/* Retry without leading "0x" */
|
||||
if (IS_ERR(ch->sess))
|
||||
ch->sess = target_alloc_session(&sport->port_tpg_1, 0, 0,
|
||||
TARGET_PROT_NORMAL,
|
||||
ch->sess_name + 2, ch, NULL);
|
||||
if (IS_ERR(ch->sess)) {
|
||||
pr_info("Rejected login because no ACL has been"
|
||||
" configured yet for initiator %s.\n", p);
|
||||
/*
|
||||
* XXX: Hack to retry of ch->i_port_id without leading '0x'
|
||||
*/
|
||||
if (p == &ch->sess_name[0]) {
|
||||
p += 2;
|
||||
goto try_again;
|
||||
}
|
||||
pr_info("Rejected login because no ACL has been configured yet for initiator %s.\n",
|
||||
ch->sess_name);
|
||||
rej->reason = cpu_to_be32((PTR_ERR(ch->sess) == -ENOMEM) ?
|
||||
SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES :
|
||||
SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED);
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user