[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <682e3785ad735_1626e10094@dwillia2-xfh.jf.intel.com.notmuch>
Date: Wed, 21 May 2025 13:28:53 -0700
From: Dan Williams <dan.j.williams@...el.com>
To: <alejandro.lucero-palau@....com>, <linux-cxl@...r.kernel.org>,
<netdev@...r.kernel.org>, <dan.j.williams@...el.com>, <edward.cree@....com>,
<davem@...emloft.net>, <kuba@...nel.org>, <pabeni@...hat.com>,
<edumazet@...gle.com>, <dave.jiang@...el.com>
CC: Alejandro Lucero <alucerop@....com>, Martin Habets
<habetsm.xilinx@...il.com>, Edward Cree <ecree.xilinx@...il.com>, "Jonathan
Cameron" <Jonathan.Cameron@...wei.com>
Subject: Re: [PATCH v16 14/22] sfc: get endpoint decoder
alejandro.lucero-palau@ wrote:
> From: Alejandro Lucero <alucerop@....com>
>
> Use cxl api for getting DPA (Device Physical Address) to use through an
> endpoint decoder.
>
> Signed-off-by: Alejandro Lucero <alucerop@....com>
> Reviewed-by: Martin Habets <habetsm.xilinx@...il.com>
> Acked-by: Edward Cree <ecree.xilinx@...il.com>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@...wei.com>
> ---
> drivers/net/ethernet/sfc/efx_cxl.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/sfc/efx_cxl.c b/drivers/net/ethernet/sfc/efx_cxl.c
> index 5635672b3fc3..20db9aa382ec 100644
> --- a/drivers/net/ethernet/sfc/efx_cxl.c
> +++ b/drivers/net/ethernet/sfc/efx_cxl.c
> @@ -98,18 +98,33 @@ int efx_cxl_init(struct efx_probe_data *probe_data)
> pci_err(pci_dev, "%s: not enough free HPA space %pap < %u\n",
> __func__, &max_size, EFX_CTPIO_BUFFER_SIZE);
> cxl_put_root_decoder(cxl->cxlrd);
> - return -ENOSPC;
> + rc = -ENOSPC;
> + goto sfc_put_decoder;
> + }
> +
> + cxl->cxled = cxl_request_dpa(cxl->cxlmd, CXL_PARTMODE_RAM,
> + EFX_CTPIO_BUFFER_SIZE);
> + if (IS_ERR(cxl->cxled)) {
> + pci_err(pci_dev, "CXL accel request DPA failed");
> + rc = PTR_ERR(cxl->cxled);
> + goto sfc_put_decoder;
> }
>
> probe_data->cxl = cxl;
>
> return 0;
> +
> +sfc_put_decoder:
> + cxl_put_root_decoder(cxl->cxlrd);
> + return rc;
> }
>
> void efx_cxl_exit(struct efx_probe_data *probe_data)
> {
> - if (probe_data->cxl)
> + if (probe_data->cxl) {
> + cxl_dpa_free(probe_data->cxl->cxled);
> cxl_put_root_decoder(probe_data->cxl->cxlrd);
Again there is nothing magic about a reference count that keeps the
allocation valid until this point. The endpoint decoder could have long
been unregistered before this point. All the reference allows you to be
sure is that the allocation backing the object is still there, but
cxl_dpa_free() is probably going to crash in cxled_to_port() or
devm_cxl_dpa_release().
Powered by blists - more mailing lists