From: Allen Hubbe <Allen.Hubbe@emc.com>
To: linux-ntb@googlegroups.com
Cc: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
Jon Mason <jdmason@kudzu.us>, Dave Jiang <dave.jiang@intel.com>,
Allen Hubbe <Allen.Hubbe@emc.com>
Subject: [PATCH 12/16] ntb_transport: numa aware memory and dma chan
Date: Wed, 20 May 2015 11:41:13 -0400 [thread overview]
Message-ID: <db0ebeeb8be07891f04fc9fe0620d4b4f806fa9c.1432135632.git.Allen.Hubbe@emc.com> (raw)
In-Reply-To: <cover.1432135631.git.Allen.Hubbe@emc.com>
In-Reply-To: <cover.1432135631.git.Allen.Hubbe@emc.com>
Allocate memory and request the dma channel for the same numa node as
the ntb device.
Signed-off-by: Allen Hubbe <Allen.Hubbe@emc.com>
---
drivers/ntb/ntb_transport.c | 46 +++++++++++++++++++++++++++++++--------------
1 file changed, 32 insertions(+), 14 deletions(-)
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
index c76d8b9..91809fa 100644
--- a/drivers/ntb/ntb_transport.c
+++ b/drivers/ntb/ntb_transport.c
@@ -346,6 +346,7 @@ int ntb_transport_register_client_dev(char *device_name)
{
struct ntb_transport_client_dev *client_dev;
struct ntb_transport_ctx *nt;
+ int node;
int rc, i = 0;
if (list_empty(&ntb_transport_list))
@@ -354,8 +355,10 @@ int ntb_transport_register_client_dev(char *device_name)
list_for_each_entry(nt, &ntb_transport_list, entry) {
struct device *dev;
- client_dev = kzalloc(sizeof(*client_dev),
- GFP_KERNEL);
+ node = dev_to_node(&nt->ndev->dev);
+
+ client_dev = kzalloc_node(sizeof(*client_dev),
+ GFP_KERNEL, node);
if (!client_dev) {
rc = -ENOMEM;
goto err;
@@ -949,6 +952,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
struct ntb_transport_mw *mw;
unsigned int mw_count, qp_count;
u64 qp_bitmap;
+ int node;
int rc, i;
if (ntb_db_is_unsafe(ndev))
@@ -958,7 +962,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
dev_dbg(&ndev->dev,
"scratchpad is unsafe, proceed anyway...\n");
- nt = kzalloc(sizeof(*nt), GFP_KERNEL);
+ node = dev_to_node(&ndev->dev);
+
+ nt = kzalloc_node(sizeof(*nt), GFP_KERNEL, node);
if (!nt)
return -ENOMEM;
@@ -968,7 +974,8 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
nt->mw_count = mw_count;
- nt->mw_vec = kcalloc(mw_count, sizeof(*nt->mw_vec), GFP_KERNEL);
+ nt->mw_vec = kzalloc_node(mw_count * sizeof(*nt->mw_vec),
+ GFP_KERNEL, node);
if (!nt->mw_vec) {
rc = -ENOMEM;
goto err;
@@ -1008,7 +1015,8 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
nt->qp_bitmap = qp_bitmap;
nt->qp_bitmap_free = qp_bitmap;
- nt->qp_vec = kcalloc(qp_count, sizeof(*nt->qp_vec), GFP_KERNEL);
+ nt->qp_vec = kzalloc_node(qp_count * sizeof(*nt->qp_vec),
+ GFP_KERNEL, node);
if (!nt->qp_vec) {
rc = -ENOMEM;
goto err2;
@@ -1497,6 +1505,11 @@ static void ntb_send_link_down(struct ntb_transport_qp *qp)
ntb_qp_link_down_reset(qp);
}
+static bool ntb_dma_filter_fn(struct dma_chan *chan, void *node)
+{
+ return dev_to_node(&chan->dev->device) == (int)(unsigned long)node;
+}
+
/**
* ntb_transport_create_queue - Create a new NTB transport layer queue
* @rx_handler: receive callback function
@@ -1522,12 +1535,16 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
struct ntb_transport_qp *qp;
u64 qp_bit;
unsigned int free_queue;
+ dma_cap_mask_t dma_mask;
+ int node;
int i;
ndev = dev_ntb(client_dev->parent);
pdev = ndev->pdev;
nt = ndev->ctx;
+ node = dev_to_node(&ndev->dev);
+
free_queue = ffs(nt->qp_bitmap);
if (!free_queue)
goto err;
@@ -1545,15 +1562,16 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
qp->tx_handler = handlers->tx_handler;
qp->event_handler = handlers->event_handler;
- dmaengine_get();
- qp->dma_chan = dma_find_channel(DMA_MEMCPY);
- if (!qp->dma_chan) {
- dmaengine_put();
+ dma_cap_zero(dma_mask);
+ dma_cap_set(DMA_MEMCPY, dma_mask);
+
+ qp->dma_chan = dma_request_channel(dma_mask, ntb_dma_filter_fn,
+ (void *)(unsigned long)node);
+ if (!qp->dma_chan)
dev_info(&pdev->dev, "Unable to allocate DMA channel, using CPU instead\n");
- }
for (i = 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) {
- entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+ entry = kzalloc_node(sizeof(*entry), GFP_ATOMIC, node);
if (!entry)
goto err1;
@@ -1563,7 +1581,7 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
}
for (i = 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) {
- entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+ entry = kzalloc_node(sizeof(*entry), GFP_ATOMIC, node);
if (!entry)
goto err2;
@@ -1586,7 +1604,7 @@ err1:
while ((entry = ntb_list_rm(&qp->ntb_rx_free_q_lock, &qp->rx_free_q)))
kfree(entry);
if (qp->dma_chan)
- dmaengine_put();
+ dma_release_channel(qp->dma_chan);
nt->qp_bitmap_free |= qp_bit;
err:
return NULL;
@@ -1623,7 +1641,7 @@ void ntb_transport_free_queue(struct ntb_transport_qp *qp)
*/
dma_sync_wait(chan, qp->last_cookie);
dmaengine_terminate_all(chan);
- dmaengine_put();
+ dma_release_channel(chan);
}
qp_bit = BIT_ULL(qp->qp_num);
--
2.4.0.rc0.43.gcf8a8c6
next prev parent reply other threads:[~2015-05-20 20:44 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-20 15:41 [PATCH 00/16] ntb: NTB Abstraction Layer Allen Hubbe
2015-05-20 15:41 ` [PATCH 01/16] Move files in preparation for NTB Abstraction Allen Hubbe
2015-05-20 15:41 ` [PATCH 02/16] NTB Abstraction Layer Allen Hubbe
2015-05-21 8:51 ` Paul Bolle
2015-05-21 11:32 ` Hubbe, Allen
2015-05-20 15:41 ` [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe Allen Hubbe
2015-05-20 21:21 ` Bjorn Helgaas
2015-05-20 21:46 ` Hubbe, Allen
2015-05-20 22:20 ` Bjorn Helgaas
2015-05-20 23:00 ` Hubbe, Allen
2015-05-21 12:06 ` Bjorn Helgaas
2015-05-21 12:49 ` Hubbe, Allen
2015-05-20 15:41 ` [PATCH 04/16] Check the DID for certain workaround error flags to be set Allen Hubbe
2015-05-20 21:11 ` Bjorn Helgaas
2015-05-20 21:15 ` Jiang, Dave
2015-05-20 21:26 ` Hubbe, Allen
2015-05-20 15:41 ` [PATCH 05/16] Intel NTB params for snb b2b addresses Allen Hubbe
2015-05-20 15:41 ` [PATCH 06/16] NTB Pingpong Client Allen Hubbe
2015-05-21 8:54 ` Paul Bolle
2015-05-20 15:41 ` [PATCH 07/16] NTB Tool Client Allen Hubbe
2015-05-21 9:02 ` Paul Bolle
2015-05-20 15:41 ` [PATCH 08/16] ntb_transport: rate limit ntb_qp_link_work Allen Hubbe
2015-05-20 15:41 ` [PATCH 09/16] ntb_transport: differentiate link down messages Allen Hubbe
2015-05-20 15:41 ` [PATCH 10/16] ntb_transport: don't advance rx on link down Allen Hubbe
2015-05-20 15:41 ` [PATCH 11/16] ntb_transport: reset qp link stats on down Allen Hubbe
2015-05-20 15:41 ` Allen Hubbe [this message]
2015-05-20 15:41 ` [PATCH 13/16] ntb_hw_intel: numa aware memory allocation Allen Hubbe
2015-05-20 15:41 ` [PATCH 14/16] ntb: performance improvement by write combining Allen Hubbe
2015-05-20 15:41 ` [PATCH 15/16] ntb: default to cpu memcpy for performance Allen Hubbe
2015-05-20 15:41 ` [PATCH 16/16] ntb_transport: fix small code format issues Allen Hubbe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=db0ebeeb8be07891f04fc9fe0620d4b4f806fa9c.1432135632.git.Allen.Hubbe@emc.com \
--to=allen.hubbe@emc.com \
--cc=dave.jiang@intel.com \
--cc=jdmason@kudzu.us \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-ntb@googlegroups.com \
--cc=linux-pci@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®