Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7956371e authored by Michael J. Ruhl's avatar Michael J. Ruhl Committed by Doug Ledford
Browse files

IB/hfi1: Improve local kmem_cache_alloc performance



Performance analysis shows that the cache callback function
sdma_kmem_cache_ctor contributes to 1/2 of the kmem_cache_allocs
time.

Since all of the fields in the allocated data structure are initialized
in the code path, remove the _ctor function.

Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent de42de80
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -331,13 +331,6 @@ static void activate_packet_queue(struct iowait *wait, int reason)
	wake_up(&wait->wait_dma);
};

static void sdma_kmem_cache_ctor(void *obj)
{
	struct user_sdma_txreq *tx = obj;

	memset(tx, 0, sizeof(*tx));
}

int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
				struct hfi1_filedata *fd)
{
@@ -391,7 +384,7 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
					    sizeof(struct user_sdma_txreq),
					    L1_CACHE_BYTES,
					    SLAB_HWCACHE_ALIGN,
					    sdma_kmem_cache_ctor);
					    NULL);
	if (!pq->txreq_cache) {
		dd_dev_err(dd, "[%u] Failed to allocate TxReq cache\n",
			   uctxt->ctxt);
+2 −9
Original line number Diff line number Diff line
/*
 * Copyright(c) 2016 Intel Corporation.
 * Copyright(c) 2016 - 2017 Intel Corporation.
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
@@ -119,13 +119,6 @@ struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev,
	return tx;
}

static void verbs_txreq_kmem_cache_ctor(void *obj)
{
	struct verbs_txreq *tx = (struct verbs_txreq *)obj;

	memset(tx, 0, sizeof(*tx));
}

int verbs_txreq_init(struct hfi1_ibdev *dev)
{
	char buf[TXREQ_LEN];
@@ -135,7 +128,7 @@ int verbs_txreq_init(struct hfi1_ibdev *dev)
	dev->verbs_txreq_cache = kmem_cache_create(buf,
						   sizeof(struct verbs_txreq),
						   0, SLAB_HWCACHE_ALIGN,
						   verbs_txreq_kmem_cache_ctor);
						   NULL);
	if (!dev->verbs_txreq_cache)
		return -ENOMEM;
	return 0;
+3 −10
Original line number Diff line number Diff line
@@ -303,13 +303,6 @@ void hfi1_vnic_sdma_init(struct hfi1_vnic_vport_info *vinfo)
	}
}

static void hfi1_vnic_txreq_kmem_cache_ctor(void *obj)
{
	struct vnic_txreq *tx = (struct vnic_txreq *)obj;

	memset(tx, 0, sizeof(*tx));
}

int hfi1_vnic_txreq_init(struct hfi1_devdata *dd)
{
	char buf[HFI1_VNIC_TXREQ_NAME_LEN];
@@ -318,7 +311,7 @@ int hfi1_vnic_txreq_init(struct hfi1_devdata *dd)
	dd->vnic.txreq_cache = kmem_cache_create(buf,
						 sizeof(struct vnic_txreq),
						 0, SLAB_HWCACHE_ALIGN,
					  hfi1_vnic_txreq_kmem_cache_ctor);
						 NULL);
	if (!dd->vnic.txreq_cache)
		return -ENOMEM;
	return 0;