nvme updates for Linux 6.19
- Subsystem usage cleanups (Max) - Endpoint device fixes (Shin'ichiro) - Debug statements (Gerd) - FC fabrics cleanups and fixes (Daniel) - Consistent alloc API usages (Israel) - Code comment updates (Chu) - Authentication retry fix (Justin) -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE3Fbyvv+648XNRdHTPe3zGtjzRgkFAmkyEDQACgkQPe3zGtjz RgnY0w//VDEwG8L9jVHgK6oGaABVhT0QhEGs6RcwsRvXeQT81TRU3aazS3VWQ281 +HZxM+8Jnhlg7FYZTV6+pTjgSzr7hvrEtDSm+1wCC6t2FtmVeluka/NedX15JA+/ JUo5Tged3qckQZPDjFbxCuSwjGJdWyCkyaBQqEFTYyP59M5yf+KGKOzO5nleSBp2 txWKYXscuoee0SH/0bSm6YuzlNcX2vW++O+6y3v73gxF4vGxUSvTnJdUJW6NYtgy Fj7a5FTIwvBw3Pdr3CBmtD6OWdYDbAlvRSowdUzE8ItQiI7vbkbVkSJhTOLFHzCV ZX2xnRV97jOLijXFroUA/+o0naW/0W7xls+aIfAEyXfBTP9kFdQL/iB6bWwLudEK ZELZyBcn6b0bDPuxUWnZfhu/NqjDQ2/PV+lz9ULo903gz66AljXm3LQtldrePBku XFPPbbeahCogizyAxFOwZGTPQbcMhqEgq9Afet8yq9V9ZtVMTAf6C1/TySE2dldT Xg9SpJttb2Tx8XqMYvSUptSDHqeA8NKhwjlDj+h0zxXRfRGcmyk6HG3yCUX1wOOc gR3vzgCfRi3YHvfrxTiPea/ev/0YpFkX4NA3U+4hXFc8ue/xwpQwevyN6+fgpHH1 WRjTS5t6icJnkwIKQTXz6acwKsQsWwFoMdXQUzzZopaR2BvLCVI= =aPBc -----END PGP SIGNATURE----- Merge tag 'nvme-6.19-2025-12-04' of git://git.infradead.org/nvme into block-6.19 Pull NVMe updates from Keith: "- Subsystem usage cleanups (Max) - Endpoint device fixes (Shin'ichiro) - Debug statements (Gerd) - FC fabrics cleanups and fixes (Daniel) - Consistent alloc API usages (Israel) - Code comment updates (Chu) - Authentication retry fix (Justin)" * tag 'nvme-6.19-2025-12-04' of git://git.infradead.org/nvme: nvme-fabrics: add ENOKEY to no retry criteria for authentication failures nvme-auth: use kvfree() for memory allocated with kvcalloc() nvmet-tcp: use kvcalloc for commands array nvmet-rdma: use kvcalloc for commands and responses arrays nvme: fix typo error in nvme target nvmet-fc: use pr_* print macros instead of dev_* nvmet-fcloop: remove unused lsdir member. nvmet-fcloop: check all request and response have been processed nvme-fc: check all request and response have been processed nvme-fc: don't hold rport lock when putting ctrl nvme-pci: add debug message on fail to read CSTS nvme-pci: print error message on failure in nvme_probe nvmet: pci-epf: fix DMA channel debug print nvmet: pci-epf: move DMA initialization to EPC init callback nvmet: remove redundant subsysnqn field from ctrl nvmet: add sanity checks when freeing subsystempull/1354/merge
commit
0f45353dd4
|
|
@ -1122,7 +1122,7 @@ void nvme_auth_free(struct nvme_ctrl *ctrl)
|
|||
if (ctrl->dhchap_ctxs) {
|
||||
for (i = 0; i < ctrl_max_dhchaps(ctrl); i++)
|
||||
nvme_auth_free_dhchap(&ctrl->dhchap_ctxs[i]);
|
||||
kfree(ctrl->dhchap_ctxs);
|
||||
kvfree(ctrl->dhchap_ctxs);
|
||||
}
|
||||
if (ctrl->host_key) {
|
||||
nvme_auth_free_key(ctrl->host_key);
|
||||
|
|
|
|||
|
|
@ -592,7 +592,7 @@ bool nvmf_should_reconnect(struct nvme_ctrl *ctrl, int status)
|
|||
if (status > 0 && (status & NVME_STATUS_DNR))
|
||||
return false;
|
||||
|
||||
if (status == -EKEYREJECTED)
|
||||
if (status == -EKEYREJECTED || status == -ENOKEY)
|
||||
return false;
|
||||
|
||||
if (ctrl->opts->max_reconnects == -1 ||
|
||||
|
|
|
|||
|
|
@ -520,6 +520,8 @@ nvme_fc_free_rport(struct kref *ref)
|
|||
|
||||
WARN_ON(rport->remoteport.port_state != FC_OBJSTATE_DELETED);
|
||||
WARN_ON(!list_empty(&rport->ctrl_list));
|
||||
WARN_ON(!list_empty(&rport->ls_req_list));
|
||||
WARN_ON(!list_empty(&rport->ls_rcv_list));
|
||||
|
||||
/* remove from lport list */
|
||||
spin_lock_irqsave(&nvme_fc_lock, flags);
|
||||
|
|
@ -1468,14 +1470,14 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport,
|
|||
{
|
||||
struct fcnvme_ls_disconnect_assoc_rqst *rqst =
|
||||
&lsop->rqstbuf->rq_dis_assoc;
|
||||
struct nvme_fc_ctrl *ctrl, *ret = NULL;
|
||||
struct nvme_fc_ctrl *ctrl, *tmp, *ret = NULL;
|
||||
struct nvmefc_ls_rcv_op *oldls = NULL;
|
||||
u64 association_id = be64_to_cpu(rqst->associd.association_id);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rport->lock, flags);
|
||||
|
||||
list_for_each_entry(ctrl, &rport->ctrl_list, ctrl_list) {
|
||||
list_for_each_entry_safe(ctrl, tmp, &rport->ctrl_list, ctrl_list) {
|
||||
if (!nvme_fc_ctrl_get(ctrl))
|
||||
continue;
|
||||
spin_lock(&ctrl->lock);
|
||||
|
|
@ -1488,7 +1490,9 @@ nvme_fc_match_disconn_ls(struct nvme_fc_rport *rport,
|
|||
if (ret)
|
||||
/* leave the ctrl get reference */
|
||||
break;
|
||||
spin_unlock_irqrestore(&rport->lock, flags);
|
||||
nvme_fc_ctrl_put(ctrl);
|
||||
spin_lock_irqsave(&rport->lock, flags);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&rport->lock, flags);
|
||||
|
|
|
|||
|
|
@ -2984,6 +2984,7 @@ static int nvme_pci_enable(struct nvme_dev *dev)
|
|||
pci_set_master(pdev);
|
||||
|
||||
if (readl(dev->bar + NVME_REG_CSTS) == -1) {
|
||||
dev_dbg(dev->ctrl.device, "reading CSTS register failed\n");
|
||||
result = -ENODEV;
|
||||
goto disable;
|
||||
}
|
||||
|
|
@ -3609,6 +3610,7 @@ out_uninit_ctrl:
|
|||
nvme_uninit_ctrl(&dev->ctrl);
|
||||
out_put_ctrl:
|
||||
nvme_put_ctrl(&dev->ctrl);
|
||||
dev_err_probe(&pdev->dev, result, "probe failed\n");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -708,7 +708,7 @@ static void nvmet_execute_identify_ctrl(struct nvmet_req *req)
|
|||
|
||||
/*
|
||||
* We don't really have a practical limit on the number of abort
|
||||
* comands. But we don't do anything useful for abort either, so
|
||||
* commands. But we don't do anything useful for abort either, so
|
||||
* no point in allowing more abort commands than the spec requires.
|
||||
*/
|
||||
id->acl = 3;
|
||||
|
|
|
|||
|
|
@ -381,8 +381,8 @@ int nvmet_auth_host_hash(struct nvmet_req *req, u8 *response,
|
|||
ret = crypto_shash_update(shash, buf, 1);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = crypto_shash_update(shash, ctrl->subsysnqn,
|
||||
strlen(ctrl->subsysnqn));
|
||||
ret = crypto_shash_update(shash, ctrl->subsys->subsysnqn,
|
||||
strlen(ctrl->subsys->subsysnqn));
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = crypto_shash_final(shash, response);
|
||||
|
|
@ -429,7 +429,7 @@ int nvmet_auth_ctrl_hash(struct nvmet_req *req, u8 *response,
|
|||
}
|
||||
|
||||
transformed_key = nvme_auth_transform_key(ctrl->ctrl_key,
|
||||
ctrl->subsysnqn);
|
||||
ctrl->subsys->subsysnqn);
|
||||
if (IS_ERR(transformed_key)) {
|
||||
ret = PTR_ERR(transformed_key);
|
||||
goto out_free_tfm;
|
||||
|
|
@ -484,8 +484,8 @@ int nvmet_auth_ctrl_hash(struct nvmet_req *req, u8 *response,
|
|||
ret = crypto_shash_update(shash, "Controller", 10);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = crypto_shash_update(shash, ctrl->subsysnqn,
|
||||
strlen(ctrl->subsysnqn));
|
||||
ret = crypto_shash_update(shash, ctrl->subsys->subsysnqn,
|
||||
strlen(ctrl->subsys->subsysnqn));
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = crypto_shash_update(shash, buf, 1);
|
||||
|
|
@ -575,7 +575,7 @@ void nvmet_auth_insert_psk(struct nvmet_sq *sq)
|
|||
return;
|
||||
}
|
||||
ret = nvme_auth_generate_digest(sq->ctrl->shash_id, psk, psk_len,
|
||||
sq->ctrl->subsysnqn,
|
||||
sq->ctrl->subsys->subsysnqn,
|
||||
sq->ctrl->hostnqn, &digest);
|
||||
if (ret) {
|
||||
pr_warn("%s: ctrl %d qid %d failed to generate digest, error %d\n",
|
||||
|
|
@ -590,8 +590,10 @@ void nvmet_auth_insert_psk(struct nvmet_sq *sq)
|
|||
goto out_free_digest;
|
||||
}
|
||||
#ifdef CONFIG_NVME_TARGET_TCP_TLS
|
||||
tls_key = nvme_tls_psk_refresh(NULL, sq->ctrl->hostnqn, sq->ctrl->subsysnqn,
|
||||
sq->ctrl->shash_id, tls_psk, psk_len, digest);
|
||||
tls_key = nvme_tls_psk_refresh(NULL, sq->ctrl->hostnqn,
|
||||
sq->ctrl->subsys->subsysnqn,
|
||||
sq->ctrl->shash_id, tls_psk, psk_len,
|
||||
digest);
|
||||
if (IS_ERR(tls_key)) {
|
||||
pr_warn("%s: ctrl %d qid %d failed to refresh key, error %ld\n",
|
||||
__func__, sq->ctrl->cntlid, sq->qid, PTR_ERR(tls_key));
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ EXPORT_SYMBOL_GPL(nvmet_wq);
|
|||
* - the nvmet_transports array
|
||||
*
|
||||
* When updating any of those lists/structures write lock should be obtained,
|
||||
* while when reading (popolating discovery log page or checking host-subsystem
|
||||
* while when reading (populating discovery log page or checking host-subsystem
|
||||
* link) read lock is obtained to allow concurrent reads.
|
||||
*/
|
||||
DECLARE_RWSEM(nvmet_config_sem);
|
||||
|
|
@ -1628,7 +1628,6 @@ struct nvmet_ctrl *nvmet_alloc_ctrl(struct nvmet_alloc_ctrl_args *args)
|
|||
INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler);
|
||||
INIT_DELAYED_WORK(&ctrl->ka_work, nvmet_keep_alive_timer);
|
||||
|
||||
memcpy(ctrl->subsysnqn, args->subsysnqn, NVMF_NQN_SIZE);
|
||||
memcpy(ctrl->hostnqn, args->hostnqn, NVMF_NQN_SIZE);
|
||||
|
||||
kref_init(&ctrl->ref);
|
||||
|
|
@ -1903,6 +1902,8 @@ static void nvmet_subsys_free(struct kref *ref)
|
|||
struct nvmet_subsys *subsys =
|
||||
container_of(ref, struct nvmet_subsys, ref);
|
||||
|
||||
WARN_ON_ONCE(!list_empty(&subsys->ctrls));
|
||||
WARN_ON_ONCE(!list_empty(&subsys->hosts));
|
||||
WARN_ON_ONCE(!xa_empty(&subsys->namespaces));
|
||||
|
||||
nvmet_debugfs_subsys_free(subsys);
|
||||
|
|
|
|||
|
|
@ -490,8 +490,7 @@ nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc)
|
|||
sizeof(*discon_rqst) + sizeof(*discon_acc) +
|
||||
tgtport->ops->lsrqst_priv_sz), GFP_KERNEL);
|
||||
if (!lsop) {
|
||||
dev_info(tgtport->dev,
|
||||
"{%d:%d} send Disconnect Association failed: ENOMEM\n",
|
||||
pr_info("{%d:%d}: send Disconnect Association failed: ENOMEM\n",
|
||||
tgtport->fc_target_port.port_num, assoc->a_id);
|
||||
return;
|
||||
}
|
||||
|
|
@ -513,8 +512,7 @@ nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc)
|
|||
ret = nvmet_fc_send_ls_req_async(tgtport, lsop,
|
||||
nvmet_fc_disconnect_assoc_done);
|
||||
if (ret) {
|
||||
dev_info(tgtport->dev,
|
||||
"{%d:%d} XMT Disconnect Association failed: %d\n",
|
||||
pr_info("{%d:%d}: XMT Disconnect Association failed: %d\n",
|
||||
tgtport->fc_target_port.port_num, assoc->a_id, ret);
|
||||
kfree(lsop);
|
||||
}
|
||||
|
|
@ -1187,8 +1185,7 @@ nvmet_fc_target_assoc_free(struct kref *ref)
|
|||
if (oldls)
|
||||
nvmet_fc_xmt_ls_rsp(tgtport, oldls);
|
||||
ida_free(&tgtport->assoc_cnt, assoc->a_id);
|
||||
dev_info(tgtport->dev,
|
||||
"{%d:%d} Association freed\n",
|
||||
pr_info("{%d:%d}: Association freed\n",
|
||||
tgtport->fc_target_port.port_num, assoc->a_id);
|
||||
kfree(assoc);
|
||||
}
|
||||
|
|
@ -1224,8 +1221,7 @@ nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc)
|
|||
flush_workqueue(assoc->queues[i]->work_q);
|
||||
}
|
||||
|
||||
dev_info(tgtport->dev,
|
||||
"{%d:%d} Association deleted\n",
|
||||
pr_info("{%d:%d}: Association deleted\n",
|
||||
tgtport->fc_target_port.port_num, assoc->a_id);
|
||||
|
||||
nvmet_fc_tgtport_put(tgtport);
|
||||
|
|
@ -1716,8 +1712,8 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
|
|||
}
|
||||
|
||||
if (ret) {
|
||||
dev_err(tgtport->dev,
|
||||
"Create Association LS failed: %s\n",
|
||||
pr_err("{%d}: Create Association LS failed: %s\n",
|
||||
tgtport->fc_target_port.port_num,
|
||||
validation_errors[ret]);
|
||||
iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
|
||||
sizeof(*acc), rqst->w0.ls_cmd,
|
||||
|
|
@ -1730,8 +1726,7 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
|
|||
atomic_set(&queue->connected, 1);
|
||||
queue->sqhd = 0; /* best place to init value */
|
||||
|
||||
dev_info(tgtport->dev,
|
||||
"{%d:%d} Association created\n",
|
||||
pr_info("{%d:%d}: Association created\n",
|
||||
tgtport->fc_target_port.port_num, iod->assoc->a_id);
|
||||
|
||||
/* format a response */
|
||||
|
|
@ -1809,8 +1804,8 @@ nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport,
|
|||
}
|
||||
|
||||
if (ret) {
|
||||
dev_err(tgtport->dev,
|
||||
"Create Connection LS failed: %s\n",
|
||||
pr_err("{%d}: Create Connection LS failed: %s\n",
|
||||
tgtport->fc_target_port.port_num,
|
||||
validation_errors[ret]);
|
||||
iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
|
||||
sizeof(*acc), rqst->w0.ls_cmd,
|
||||
|
|
@ -1871,8 +1866,8 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
|
|||
}
|
||||
|
||||
if (ret || !assoc) {
|
||||
dev_err(tgtport->dev,
|
||||
"Disconnect LS failed: %s\n",
|
||||
pr_err("{%d}: Disconnect LS failed: %s\n",
|
||||
tgtport->fc_target_port.port_num,
|
||||
validation_errors[ret]);
|
||||
iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
|
||||
sizeof(*acc), rqst->w0.ls_cmd,
|
||||
|
|
@ -1907,8 +1902,7 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
|
|||
spin_unlock_irqrestore(&tgtport->lock, flags);
|
||||
|
||||
if (oldls) {
|
||||
dev_info(tgtport->dev,
|
||||
"{%d:%d} Multiple Disconnect Association LS's "
|
||||
pr_info("{%d:%d}: Multiple Disconnect Association LS's "
|
||||
"received\n",
|
||||
tgtport->fc_target_port.port_num, assoc->a_id);
|
||||
/* overwrite good response with bogus failure */
|
||||
|
|
@ -2051,8 +2045,8 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
|
|||
struct fcnvme_ls_rqst_w0 *w0 = (struct fcnvme_ls_rqst_w0 *)lsreqbuf;
|
||||
|
||||
if (lsreqbuf_len > sizeof(union nvmefc_ls_requests)) {
|
||||
dev_info(tgtport->dev,
|
||||
"RCV %s LS failed: payload too large (%d)\n",
|
||||
pr_info("{%d}: RCV %s LS failed: payload too large (%d)\n",
|
||||
tgtport->fc_target_port.port_num,
|
||||
(w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
|
||||
nvmefc_ls_names[w0->ls_cmd] : "",
|
||||
lsreqbuf_len);
|
||||
|
|
@ -2060,8 +2054,8 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
|
|||
}
|
||||
|
||||
if (!nvmet_fc_tgtport_get(tgtport)) {
|
||||
dev_info(tgtport->dev,
|
||||
"RCV %s LS failed: target deleting\n",
|
||||
pr_info("{%d}: RCV %s LS failed: target deleting\n",
|
||||
tgtport->fc_target_port.port_num,
|
||||
(w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
|
||||
nvmefc_ls_names[w0->ls_cmd] : "");
|
||||
return -ESHUTDOWN;
|
||||
|
|
@ -2069,8 +2063,8 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
|
|||
|
||||
iod = nvmet_fc_alloc_ls_iod(tgtport);
|
||||
if (!iod) {
|
||||
dev_info(tgtport->dev,
|
||||
"RCV %s LS failed: context allocation failed\n",
|
||||
pr_info("{%d}: RCV %s LS failed: context allocation failed\n",
|
||||
tgtport->fc_target_port.port_num,
|
||||
(w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
|
||||
nvmefc_ls_names[w0->ls_cmd] : "");
|
||||
nvmet_fc_tgtport_put(tgtport);
|
||||
|
|
|
|||
|
|
@ -254,7 +254,6 @@ struct fcloop_nport {
|
|||
struct fcloop_lsreq {
|
||||
struct nvmefc_ls_req *lsreq;
|
||||
struct nvmefc_ls_rsp ls_rsp;
|
||||
int lsdir; /* H2T or T2H */
|
||||
int status;
|
||||
struct list_head ls_list; /* fcloop_rport->ls_list */
|
||||
};
|
||||
|
|
@ -1111,8 +1110,10 @@ fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport)
|
|||
rport->nport->rport = NULL;
|
||||
spin_unlock_irqrestore(&fcloop_lock, flags);
|
||||
|
||||
if (put_port)
|
||||
if (put_port) {
|
||||
WARN_ON(!list_empty(&rport->ls_list));
|
||||
fcloop_nport_put(rport->nport);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1130,8 +1131,10 @@ fcloop_targetport_delete(struct nvmet_fc_target_port *targetport)
|
|||
tport->nport->tport = NULL;
|
||||
spin_unlock_irqrestore(&fcloop_lock, flags);
|
||||
|
||||
if (put_port)
|
||||
if (put_port) {
|
||||
WARN_ON(!list_empty(&tport->ls_list));
|
||||
fcloop_nport_put(tport->nport);
|
||||
}
|
||||
}
|
||||
|
||||
#define FCLOOP_HW_QUEUES 4
|
||||
|
|
|
|||
|
|
@ -285,7 +285,6 @@ struct nvmet_ctrl {
|
|||
__le32 *changed_ns_list;
|
||||
u32 nr_changed_ns;
|
||||
|
||||
char subsysnqn[NVMF_NQN_FIELD_LEN];
|
||||
char hostnqn[NVMF_NQN_FIELD_LEN];
|
||||
|
||||
struct device *p2p_client;
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ static u16 nvmet_passthru_override_id_ctrl(struct nvmet_req *req)
|
|||
* code path with duplicate ctrl subsysnqn. In order to prevent that we
|
||||
* mask the passthru-ctrl subsysnqn with the target ctrl subsysnqn.
|
||||
*/
|
||||
memcpy(id->subnqn, ctrl->subsysnqn, sizeof(id->subnqn));
|
||||
memcpy(id->subnqn, ctrl->subsys->subsysnqn, sizeof(id->subnqn));
|
||||
|
||||
/* use fabric id-ctrl values */
|
||||
id->ioccsz = cpu_to_le32((sizeof(struct nvme_command) +
|
||||
|
|
|
|||
|
|
@ -320,12 +320,14 @@ static void nvmet_pci_epf_init_dma(struct nvmet_pci_epf *nvme_epf)
|
|||
nvme_epf->dma_enabled = true;
|
||||
|
||||
dev_dbg(dev, "Using DMA RX channel %s, maximum segment size %u B\n",
|
||||
dma_chan_name(chan),
|
||||
dma_get_max_seg_size(dmaengine_get_dma_device(chan)));
|
||||
dma_chan_name(nvme_epf->dma_rx_chan),
|
||||
dma_get_max_seg_size(dmaengine_get_dma_device(nvme_epf->
|
||||
dma_rx_chan)));
|
||||
|
||||
dev_dbg(dev, "Using DMA TX channel %s, maximum segment size %u B\n",
|
||||
dma_chan_name(chan),
|
||||
dma_get_max_seg_size(dmaengine_get_dma_device(chan)));
|
||||
dma_chan_name(nvme_epf->dma_tx_chan),
|
||||
dma_get_max_seg_size(dmaengine_get_dma_device(nvme_epf->
|
||||
dma_tx_chan)));
|
||||
|
||||
return;
|
||||
|
||||
|
|
@ -2325,6 +2327,8 @@ static int nvmet_pci_epf_epc_init(struct pci_epf *epf)
|
|||
return ret;
|
||||
}
|
||||
|
||||
nvmet_pci_epf_init_dma(nvme_epf);
|
||||
|
||||
/* Set device ID, class, etc. */
|
||||
epf->header->vendorid = ctrl->tctrl->subsys->vendor_id;
|
||||
epf->header->subsys_vendor_id = ctrl->tctrl->subsys->subsys_vendor_id;
|
||||
|
|
@ -2422,8 +2426,6 @@ static int nvmet_pci_epf_bind(struct pci_epf *epf)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
nvmet_pci_epf_init_dma(nvme_epf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -367,7 +367,7 @@ nvmet_rdma_alloc_cmds(struct nvmet_rdma_device *ndev,
|
|||
struct nvmet_rdma_cmd *cmds;
|
||||
int ret = -EINVAL, i;
|
||||
|
||||
cmds = kcalloc(nr_cmds, sizeof(struct nvmet_rdma_cmd), GFP_KERNEL);
|
||||
cmds = kvcalloc(nr_cmds, sizeof(struct nvmet_rdma_cmd), GFP_KERNEL);
|
||||
if (!cmds)
|
||||
goto out;
|
||||
|
||||
|
|
@ -382,7 +382,7 @@ nvmet_rdma_alloc_cmds(struct nvmet_rdma_device *ndev,
|
|||
out_free:
|
||||
while (--i >= 0)
|
||||
nvmet_rdma_free_cmd(ndev, cmds + i, admin);
|
||||
kfree(cmds);
|
||||
kvfree(cmds);
|
||||
out:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
|
@ -394,7 +394,7 @@ static void nvmet_rdma_free_cmds(struct nvmet_rdma_device *ndev,
|
|||
|
||||
for (i = 0; i < nr_cmds; i++)
|
||||
nvmet_rdma_free_cmd(ndev, cmds + i, admin);
|
||||
kfree(cmds);
|
||||
kvfree(cmds);
|
||||
}
|
||||
|
||||
static int nvmet_rdma_alloc_rsp(struct nvmet_rdma_device *ndev,
|
||||
|
|
@ -455,7 +455,7 @@ nvmet_rdma_alloc_rsps(struct nvmet_rdma_queue *queue)
|
|||
NUMA_NO_NODE, false, true))
|
||||
goto out;
|
||||
|
||||
queue->rsps = kcalloc(nr_rsps, sizeof(struct nvmet_rdma_rsp),
|
||||
queue->rsps = kvcalloc(nr_rsps, sizeof(struct nvmet_rdma_rsp),
|
||||
GFP_KERNEL);
|
||||
if (!queue->rsps)
|
||||
goto out_free_sbitmap;
|
||||
|
|
@ -473,7 +473,7 @@ nvmet_rdma_alloc_rsps(struct nvmet_rdma_queue *queue)
|
|||
out_free:
|
||||
while (--i >= 0)
|
||||
nvmet_rdma_free_rsp(ndev, &queue->rsps[i]);
|
||||
kfree(queue->rsps);
|
||||
kvfree(queue->rsps);
|
||||
out_free_sbitmap:
|
||||
sbitmap_free(&queue->rsp_tags);
|
||||
out:
|
||||
|
|
@ -487,7 +487,7 @@ static void nvmet_rdma_free_rsps(struct nvmet_rdma_queue *queue)
|
|||
|
||||
for (i = 0; i < nr_rsps; i++)
|
||||
nvmet_rdma_free_rsp(ndev, &queue->rsps[i]);
|
||||
kfree(queue->rsps);
|
||||
kvfree(queue->rsps);
|
||||
sbitmap_free(&queue->rsp_tags);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1484,7 +1484,7 @@ static int nvmet_tcp_alloc_cmds(struct nvmet_tcp_queue *queue)
|
|||
struct nvmet_tcp_cmd *cmds;
|
||||
int i, ret = -EINVAL, nr_cmds = queue->nr_cmds;
|
||||
|
||||
cmds = kcalloc(nr_cmds, sizeof(struct nvmet_tcp_cmd), GFP_KERNEL);
|
||||
cmds = kvcalloc(nr_cmds, sizeof(struct nvmet_tcp_cmd), GFP_KERNEL);
|
||||
if (!cmds)
|
||||
goto out;
|
||||
|
||||
|
|
@ -1500,7 +1500,7 @@ static int nvmet_tcp_alloc_cmds(struct nvmet_tcp_queue *queue)
|
|||
out_free:
|
||||
while (--i >= 0)
|
||||
nvmet_tcp_free_cmd(cmds + i);
|
||||
kfree(cmds);
|
||||
kvfree(cmds);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1514,7 +1514,7 @@ static void nvmet_tcp_free_cmds(struct nvmet_tcp_queue *queue)
|
|||
nvmet_tcp_free_cmd(cmds + i);
|
||||
|
||||
nvmet_tcp_free_cmd(&queue->connect);
|
||||
kfree(cmds);
|
||||
kvfree(cmds);
|
||||
}
|
||||
|
||||
static void nvmet_tcp_restore_socket_callbacks(struct nvmet_tcp_queue *queue)
|
||||
|
|
|
|||
Loading…
Reference in New Issue