[ofa-general] Re: [PATCH ofed-1.2.c] ehca: backport kmem_cache_zalloc() for 2.6.10/sles10/sles10_sp1

Michael S. Tsirkin mst at dev.mellanox.co.il
Mon Aug 6 07:19:23 PDT 2007


Let's not do it this way.

I think the right thing is to implement kmem_cache_zalloc
by means of kmem_cache_allocand memset in kernel_addons.



Quoting Hoang-Nam Nguyen <hnguyen at linux.vnet.ibm.com>:
Subject: [PATCH ofed-1.2.c] ehca: backport kmem_cache_zalloc() for 2.6.10/sles10/sles10_sp1

Hello Michael and Vladimir!
This patch below adds a backport patch for ehca to the dirs 2.6.16, 2.6.16_sles10
and 2.6.16_sles10_sp1 underneath kernel_patches/backport of ofed-1.2.c source tree.
Thanks!
Nam



backport kmem_cache_zalloc() to 2.6.10, 2.6.10_sles10 and 2.6.10_sles10_sp1

Signed-off-by: Hoang-Nam Nguyen <hnguyen at de.ibm.com>
---

 2.6.16/ehca_kmem_cache_zalloc_to_2_6_16.patch            |   97 +++++++++++++++
 2.6.16_sles10/ehca_kmem_cache_zalloc_to_2_6_16.patch     |   97 +++++++++++++++
 2.6.16_sles10_sp1/ehca_kmem_cache_zalloc_to_2_6_16.patch |   97 +++++++++++++++
 3 files changed, 291 insertions(+)

diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/kernel_patches/backport/2.6.16/ehca_kmem_cache_zalloc_to_2_6_16.patch ofa_1_2_c_kernel-20070804-0200/kernel_patches/backport/2.6.16/ehca_kmem_cache_zalloc_to_2_6_16.patch
--- ofa_1_2_c_kernel-20070804-0200_orig/kernel_patches/backport/2.6.16/ehca_kmem_cache_zalloc_to_2_6_16.patch	1970-01-01 01:00:00.000000000 +0100
+++ ofa_1_2_c_kernel-20070804-0200/kernel_patches/backport/2.6.16/ehca_kmem_cache_zalloc_to_2_6_16.patch	2007-08-06 00:53:59.000000000 +0200
@@ -0,0 +1,97 @@
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_cq.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_cq.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_cq.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_cq.c	2007-08-06 00:41:50.000000000 +0200
+@@ -134,13 +134,14 @@ struct ib_cq *ehca_create_cq(struct ib_d
+ 	if (cqe >= 0xFFFFFFFF - 64 - additional_cqe)
+ 		return ERR_PTR(-EINVAL);
+ 
+-	my_cq = kmem_cache_zalloc(cq_cache, GFP_KERNEL);
++	my_cq = kmem_cache_alloc(cq_cache, GFP_KERNEL);
+ 	if (!my_cq) {
+ 		ehca_err(device, "Out of memory for ehca_cq struct device=%p",
+ 			 device);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(my_cq, 0, sizeof(*my_cq));
+ 	memset(&param, 0, sizeof(struct ehca_alloc_cq_parms));
+ 
+ 	spin_lock_init(&my_cq->spinlock);
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_main.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_main.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_main.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_main.c	2007-08-06 00:40:58.000000000 +0200
+@@ -113,9 +113,11 @@ static struct kmem_cache *ctblk_cache = 
+ 
+ void *ehca_alloc_fw_ctrlblock(gfp_t flags)
+ {
+-	void *ret = kmem_cache_zalloc(ctblk_cache, flags);
++	void *ret = kmem_cache_alloc(ctblk_cache, flags);
+ 	if (!ret)
+ 		ehca_gen_err("Out of memory for ctblk");
++	else
++		memset(ret, 0, EHCA_PAGESIZE);
+ 	return ret;
+ }
+ 
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_mrmw.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_mrmw.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_mrmw.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_mrmw.c	2007-08-06 00:39:30.000000000 +0200
+@@ -55,8 +55,9 @@ static struct ehca_mr *ehca_mr_new(void)
+ {
+ 	struct ehca_mr *me;
+ 
+-	me = kmem_cache_zalloc(mr_cache, GFP_KERNEL);
++	me = kmem_cache_alloc(mr_cache, GFP_KERNEL);
+ 	if (me) {
++		memset(me, 0, sizeof(*me));
+ 		spin_lock_init(&me->mrlock);
+ 	} else
+ 		ehca_gen_err("alloc failed");
+@@ -73,8 +74,9 @@ static struct ehca_mw *ehca_mw_new(void)
+ {
+ 	struct ehca_mw *me;
+ 
+-	me = kmem_cache_zalloc(mw_cache, GFP_KERNEL);
++	me = kmem_cache_alloc(mw_cache, GFP_KERNEL);
+ 	if (me) {
++		memset(me, 0, sizeof(*me));
+ 		spin_lock_init(&me->mwlock);
+ 	} else
+ 		ehca_gen_err("alloc failed");
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_pd.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_pd.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_pd.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_pd.c	2007-08-06 00:38:14.000000000 +0200
+@@ -50,13 +50,14 @@ struct ib_pd *ehca_alloc_pd(struct ib_de
+ {
+ 	struct ehca_pd *pd;
+ 
+-	pd = kmem_cache_zalloc(pd_cache, GFP_KERNEL);
++	pd = kmem_cache_alloc(pd_cache, GFP_KERNEL);
+ 	if (!pd) {
+ 		ehca_err(device, "device=%p context=%p out of memory",
+ 			 device, context);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(pd, 0, sizeof(*pd));
+ 	pd->ownpid = current->tgid;
+ 
+ 	/*
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_qp.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_qp.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_qp.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_qp.c	2007-08-06 00:37:39.000000000 +0200
+@@ -450,12 +450,13 @@ struct ib_qp *ehca_create_qp(struct ib_p
+ 	if (pd->uobject && udata)
+ 		context = pd->uobject->context;
+ 
+-	my_qp = kmem_cache_zalloc(qp_cache, GFP_KERNEL);
++	my_qp = kmem_cache_alloc(qp_cache, GFP_KERNEL);
+ 	if (!my_qp) {
+ 		ehca_err(pd->device, "pd=%p not enough memory to alloc qp", pd);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(my_qp, 0, sizeof(*my_qp));
+ 	memset (&parms, 0, sizeof(struct ehca_alloc_qp_parms));
+ 	spin_lock_init(&my_qp->spinlock_s);
+ 	spin_lock_init(&my_qp->spinlock_r);
diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/kernel_patches/backport/2.6.16_sles10/ehca_kmem_cache_zalloc_to_2_6_16.patch ofa_1_2_c_kernel-20070804-0200/kernel_patches/backport/2.6.16_sles10/ehca_kmem_cache_zalloc_to_2_6_16.patch
--- ofa_1_2_c_kernel-20070804-0200_orig/kernel_patches/backport/2.6.16_sles10/ehca_kmem_cache_zalloc_to_2_6_16.patch	1970-01-01 01:00:00.000000000 +0100
+++ ofa_1_2_c_kernel-20070804-0200/kernel_patches/backport/2.6.16_sles10/ehca_kmem_cache_zalloc_to_2_6_16.patch	2007-08-06 00:56:20.000000000 +0200
@@ -0,0 +1,97 @@
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_cq.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_cq.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_cq.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_cq.c	2007-08-06 00:41:50.000000000 +0200
+@@ -134,13 +134,14 @@ struct ib_cq *ehca_create_cq(struct ib_d
+ 	if (cqe >= 0xFFFFFFFF - 64 - additional_cqe)
+ 		return ERR_PTR(-EINVAL);
+ 
+-	my_cq = kmem_cache_zalloc(cq_cache, GFP_KERNEL);
++	my_cq = kmem_cache_alloc(cq_cache, GFP_KERNEL);
+ 	if (!my_cq) {
+ 		ehca_err(device, "Out of memory for ehca_cq struct device=%p",
+ 			 device);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(my_cq, 0, sizeof(*my_cq));
+ 	memset(&param, 0, sizeof(struct ehca_alloc_cq_parms));
+ 
+ 	spin_lock_init(&my_cq->spinlock);
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_main.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_main.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_main.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_main.c	2007-08-06 00:40:58.000000000 +0200
+@@ -113,9 +113,11 @@ static struct kmem_cache *ctblk_cache = 
+ 
+ void *ehca_alloc_fw_ctrlblock(gfp_t flags)
+ {
+-	void *ret = kmem_cache_zalloc(ctblk_cache, flags);
++	void *ret = kmem_cache_alloc(ctblk_cache, flags);
+ 	if (!ret)
+ 		ehca_gen_err("Out of memory for ctblk");
++	else
++		memset(ret, 0, EHCA_PAGESIZE);
+ 	return ret;
+ }
+ 
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_mrmw.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_mrmw.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_mrmw.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_mrmw.c	2007-08-06 00:39:30.000000000 +0200
+@@ -55,8 +55,9 @@ static struct ehca_mr *ehca_mr_new(void)
+ {
+ 	struct ehca_mr *me;
+ 
+-	me = kmem_cache_zalloc(mr_cache, GFP_KERNEL);
++	me = kmem_cache_alloc(mr_cache, GFP_KERNEL);
+ 	if (me) {
++		memset(me, 0, sizeof(*me));
+ 		spin_lock_init(&me->mrlock);
+ 	} else
+ 		ehca_gen_err("alloc failed");
+@@ -73,8 +74,9 @@ static struct ehca_mw *ehca_mw_new(void)
+ {
+ 	struct ehca_mw *me;
+ 
+-	me = kmem_cache_zalloc(mw_cache, GFP_KERNEL);
++	me = kmem_cache_alloc(mw_cache, GFP_KERNEL);
+ 	if (me) {
++		memset(me, 0, sizeof(*me));
+ 		spin_lock_init(&me->mwlock);
+ 	} else
+ 		ehca_gen_err("alloc failed");
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_pd.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_pd.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_pd.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_pd.c	2007-08-06 00:38:14.000000000 +0200
+@@ -50,13 +50,14 @@ struct ib_pd *ehca_alloc_pd(struct ib_de
+ {
+ 	struct ehca_pd *pd;
+ 
+-	pd = kmem_cache_zalloc(pd_cache, GFP_KERNEL);
++	pd = kmem_cache_alloc(pd_cache, GFP_KERNEL);
+ 	if (!pd) {
+ 		ehca_err(device, "device=%p context=%p out of memory",
+ 			 device, context);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(pd, 0, sizeof(*pd));
+ 	pd->ownpid = current->tgid;
+ 
+ 	/*
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_qp.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_qp.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_qp.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_qp.c	2007-08-06 00:37:39.000000000 +0200
+@@ -450,12 +450,13 @@ struct ib_qp *ehca_create_qp(struct ib_p
+ 	if (pd->uobject && udata)
+ 		context = pd->uobject->context;
+ 
+-	my_qp = kmem_cache_zalloc(qp_cache, GFP_KERNEL);
++	my_qp = kmem_cache_alloc(qp_cache, GFP_KERNEL);
+ 	if (!my_qp) {
+ 		ehca_err(pd->device, "pd=%p not enough memory to alloc qp", pd);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(my_qp, 0, sizeof(*my_qp));
+ 	memset (&parms, 0, sizeof(struct ehca_alloc_qp_parms));
+ 	spin_lock_init(&my_qp->spinlock_s);
+ 	spin_lock_init(&my_qp->spinlock_r);
diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/kernel_patches/backport/2.6.16_sles10_sp1/ehca_kmem_cache_zalloc_to_2_6_16.patch ofa_1_2_c_kernel-20070804-0200/kernel_patches/backport/2.6.16_sles10_sp1/ehca_kmem_cache_zalloc_to_2_6_16.patch
--- ofa_1_2_c_kernel-20070804-0200_orig/kernel_patches/backport/2.6.16_sles10_sp1/ehca_kmem_cache_zalloc_to_2_6_16.patch	1970-01-01 01:00:00.000000000 +0100
+++ ofa_1_2_c_kernel-20070804-0200/kernel_patches/backport/2.6.16_sles10_sp1/ehca_kmem_cache_zalloc_to_2_6_16.patch	2007-08-06 00:56:33.000000000 +0200
@@ -0,0 +1,97 @@
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_cq.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_cq.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_cq.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_cq.c	2007-08-06 00:41:50.000000000 +0200
+@@ -134,13 +134,14 @@ struct ib_cq *ehca_create_cq(struct ib_d
+ 	if (cqe >= 0xFFFFFFFF - 64 - additional_cqe)
+ 		return ERR_PTR(-EINVAL);
+ 
+-	my_cq = kmem_cache_zalloc(cq_cache, GFP_KERNEL);
++	my_cq = kmem_cache_alloc(cq_cache, GFP_KERNEL);
+ 	if (!my_cq) {
+ 		ehca_err(device, "Out of memory for ehca_cq struct device=%p",
+ 			 device);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(my_cq, 0, sizeof(*my_cq));
+ 	memset(&param, 0, sizeof(struct ehca_alloc_cq_parms));
+ 
+ 	spin_lock_init(&my_cq->spinlock);
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_main.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_main.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_main.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_main.c	2007-08-06 00:40:58.000000000 +0200
+@@ -113,9 +113,11 @@ static struct kmem_cache *ctblk_cache = 
+ 
+ void *ehca_alloc_fw_ctrlblock(gfp_t flags)
+ {
+-	void *ret = kmem_cache_zalloc(ctblk_cache, flags);
++	void *ret = kmem_cache_alloc(ctblk_cache, flags);
+ 	if (!ret)
+ 		ehca_gen_err("Out of memory for ctblk");
++	else
++		memset(ret, 0, EHCA_PAGESIZE);
+ 	return ret;
+ }
+ 
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_mrmw.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_mrmw.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_mrmw.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_mrmw.c	2007-08-06 00:39:30.000000000 +0200
+@@ -55,8 +55,9 @@ static struct ehca_mr *ehca_mr_new(void)
+ {
+ 	struct ehca_mr *me;
+ 
+-	me = kmem_cache_zalloc(mr_cache, GFP_KERNEL);
++	me = kmem_cache_alloc(mr_cache, GFP_KERNEL);
+ 	if (me) {
++		memset(me, 0, sizeof(*me));
+ 		spin_lock_init(&me->mrlock);
+ 	} else
+ 		ehca_gen_err("alloc failed");
+@@ -73,8 +74,9 @@ static struct ehca_mw *ehca_mw_new(void)
+ {
+ 	struct ehca_mw *me;
+ 
+-	me = kmem_cache_zalloc(mw_cache, GFP_KERNEL);
++	me = kmem_cache_alloc(mw_cache, GFP_KERNEL);
+ 	if (me) {
++		memset(me, 0, sizeof(*me));
+ 		spin_lock_init(&me->mwlock);
+ 	} else
+ 		ehca_gen_err("alloc failed");
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_pd.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_pd.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_pd.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_pd.c	2007-08-06 00:38:14.000000000 +0200
+@@ -50,13 +50,14 @@ struct ib_pd *ehca_alloc_pd(struct ib_de
+ {
+ 	struct ehca_pd *pd;
+ 
+-	pd = kmem_cache_zalloc(pd_cache, GFP_KERNEL);
++	pd = kmem_cache_alloc(pd_cache, GFP_KERNEL);
+ 	if (!pd) {
+ 		ehca_err(device, "device=%p context=%p out of memory",
+ 			 device, context);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(pd, 0, sizeof(*pd));
+ 	pd->ownpid = current->tgid;
+ 
+ 	/*
+diff -Nurp ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_qp.c ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_qp.c
+--- ofa_1_2_c_kernel-20070804-0200_orig/drivers/infiniband/hw/ehca/ehca_qp.c	2007-08-04 11:00:05.000000000 +0200
++++ ofa_1_2_c_kernel-20070804-0200/drivers/infiniband/hw/ehca/ehca_qp.c	2007-08-06 00:37:39.000000000 +0200
+@@ -450,12 +450,13 @@ struct ib_qp *ehca_create_qp(struct ib_p
+ 	if (pd->uobject && udata)
+ 		context = pd->uobject->context;
+ 
+-	my_qp = kmem_cache_zalloc(qp_cache, GFP_KERNEL);
++	my_qp = kmem_cache_alloc(qp_cache, GFP_KERNEL);
+ 	if (!my_qp) {
+ 		ehca_err(pd->device, "pd=%p not enough memory to alloc qp", pd);
+ 		return ERR_PTR(-ENOMEM);
+ 	}
+ 
++	memset(my_qp, 0, sizeof(*my_qp));
+ 	memset (&parms, 0, sizeof(struct ehca_alloc_qp_parms));
+ 	spin_lock_init(&my_qp->spinlock_s);
+ 	spin_lock_init(&my_qp->spinlock_r);

-- 
MST



More information about the general mailing list