mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] msi: Only keep one msi_desc in each slab entry.
@ 2006-07-10 22:00 Eric W. Biederman
  2006-07-11  6:03 ` Pekka Enberg
  0 siblings, 1 reply; 5+ messages in thread
From: Eric W. Biederman @ 2006-07-10 22:00 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel


It looks like someone confused kmem_cache_create with a different
allocator and was attempting to give it knowledge of how many cache
entries there were.

With the unfortunate result that each slab entry was big enough to
hold every irq.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
---
 drivers/pci/msi.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 0cd4a3e..082e942 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -40,13 +40,13 @@ msi_register(struct msi_ops *ops)
 
 static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
 {
-	memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
+	memset(p, 0, sizeof(struct msi_desc));
 }
 
 static int msi_cache_init(void)
 {
 	msi_cachep = kmem_cache_create("msi_cache",
-			NR_IRQS * sizeof(struct msi_desc),
+			sizeof(struct msi_desc),
 		       	0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
 	if (!msi_cachep)
 		return -ENOMEM;
-- 
1.4.1.gac83a


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] msi: Only keep one msi_desc in each slab entry.
  2006-07-10 22:00 [PATCH] msi: Only keep one msi_desc in each slab entry Eric W. Biederman
@ 2006-07-11  6:03 ` Pekka Enberg
  2006-07-11  6:42   ` Eric W. Biederman
  0 siblings, 1 reply; 5+ messages in thread
From: Pekka Enberg @ 2006-07-11  6:03 UTC (permalink / raw)
  To: Eric W. Biederman; +Cc: Andrew Morton, linux-kernel

On 7/11/06, Eric W. Biederman <ebiederm@xmission.com> wrote:
>
> It looks like someone confused kmem_cache_create with a different
> allocator and was attempting to give it knowledge of how many cache
> entries there were.
>
> With the unfortunate result that each slab entry was big enough to
> hold every irq.
>
> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
> ---
>  drivers/pci/msi.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index 0cd4a3e..082e942 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -40,13 +40,13 @@ msi_register(struct msi_ops *ops)
>
>  static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
>  {
> -       memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
> +       memset(p, 0, sizeof(struct msi_desc));

You can use kmem_cache_zalloc() for this.

>  }
>
>  static int msi_cache_init(void)
>  {
>         msi_cachep = kmem_cache_create("msi_cache",
> -                       NR_IRQS * sizeof(struct msi_desc),
> +                       sizeof(struct msi_desc),
>                         0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
>         if (!msi_cachep)
>                 return -ENOMEM;
> --
> 1.4.1.gac83a
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] msi: Only keep one msi_desc in each slab entry.
  2006-07-11  6:03 ` Pekka Enberg
@ 2006-07-11  6:42   ` Eric W. Biederman
  2006-07-11  6:55     ` Pekka J Enberg
  0 siblings, 1 reply; 5+ messages in thread
From: Eric W. Biederman @ 2006-07-11  6:42 UTC (permalink / raw)
  To: Pekka Enberg; +Cc: Andrew Morton, linux-kernel

"Pekka Enberg" <penberg@cs.helsinki.fi> writes:

> On 7/11/06, Eric W. Biederman <ebiederm@xmission.com> wrote:
>>
>> It looks like someone confused kmem_cache_create with a different
>> allocator and was attempting to give it knowledge of how many cache
>> entries there were.
>>
>> With the unfortunate result that each slab entry was big enough to
>> hold every irq.
>>
>> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
>> ---
>>  drivers/pci/msi.c |    4 ++--
>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
>> index 0cd4a3e..082e942 100644
>> --- a/drivers/pci/msi.c
>> +++ b/drivers/pci/msi.c
>> @@ -40,13 +40,13 @@ msi_register(struct msi_ops *ops)
>>
>> static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
>>  {
>> -       memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
>> +       memset(p, 0, sizeof(struct msi_desc));
>
> You can use kmem_cache_zalloc() for this.

Please look at what the code changes.
Please recognize how very bad the current code is behaving.

As for the rest sure go ahead and create a patch to address it
but that really is a separate issue and thus a separate patch.

I'm just trying to keep the kernel from calling BUG_ON the first
time a msi irq is allocated on a kernel with a maximum NR_CPUS
configuration, and from wasting memory the rest of the time.

Or you know how bad the msi code is when every patch to fix a major
issue is followed up comments on how to improve the code even further.

Eric

>>  }
>>
>>  static int msi_cache_init(void)
>>  {
>>         msi_cachep = kmem_cache_create("msi_cache",
>> -                       NR_IRQS * sizeof(struct msi_desc),
>> +                       sizeof(struct msi_desc),
>>                         0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
>>         if (!msi_cachep)
>>                 return -ENOMEM;
>> --
>> 1.4.1.gac83a
>>
>> -
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
>>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] msi: Only keep one msi_desc in each slab entry.
  2006-07-11  6:42   ` Eric W. Biederman
@ 2006-07-11  6:55     ` Pekka J Enberg
  2006-07-11  7:16       ` Eric W. Biederman
  0 siblings, 1 reply; 5+ messages in thread
From: Pekka J Enberg @ 2006-07-11  6:55 UTC (permalink / raw)
  To: Eric W. Biederman; +Cc: Andrew Morton, linux-kernel

On Tue, 11 Jul 2006, Eric W. Biederman wrote:
> Please look at what the code changes.
> Please recognize how very bad the current code is behaving.

Yes, there's plenty of slab confusion going on.

On Tue, 11 Jul 2006, Eric W. Biederman wrote:
> As for the rest sure go ahead and create a patch to address it
> but that really is a separate issue and thus a separate patch.
> 
> I'm just trying to keep the kernel from calling BUG_ON the first
> time a msi irq is allocated on a kernel with a maximum NR_CPUS
> configuration, and from wasting memory the rest of the time.
> 
> Or you know how bad the msi code is when every patch to fix a major
> issue is followed up comments on how to improve the code even further.

Ok.

Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
---

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 36bc7c4..77b08ee 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -45,16 +45,11 @@ msi_register(struct msi_ops *ops)
 	return 0;
 }
 
-static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
-{
-	memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
-}
-
 static int msi_cache_init(void)
 {
 	msi_cachep = kmem_cache_create("msi_cache",
-			NR_IRQS * sizeof(struct msi_desc),
-		       	0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
+			sizeof(struct msi_desc),
+		       	0, SLAB_HWCACHE_ALIGN, NULL, NULL);
 	if (!msi_cachep)
 		return -ENOMEM;
 
@@ -402,11 +397,10 @@ static struct msi_desc* alloc_msi_entry(
 {
 	struct msi_desc *entry;
 
-	entry = kmem_cache_alloc(msi_cachep, SLAB_KERNEL);
+	entry = kmem_cache_zalloc(msi_cachep, GFP_KERNEL);
 	if (!entry)
 		return NULL;
 
-	memset(entry, 0, sizeof(struct msi_desc));
 	entry->link.tail = entry->link.head = 0;	/* single message */
 	entry->dev = NULL;
 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] msi: Only keep one msi_desc in each slab entry.
  2006-07-11  6:55     ` Pekka J Enberg
@ 2006-07-11  7:16       ` Eric W. Biederman
  0 siblings, 0 replies; 5+ messages in thread
From: Eric W. Biederman @ 2006-07-11  7:16 UTC (permalink / raw)
  To: Pekka J Enberg; +Cc: Andrew Morton, linux-kernel

Pekka J Enberg <penberg@cs.Helsinki.FI> writes:

> On Tue, 11 Jul 2006, Eric W. Biederman wrote:
>> Please look at what the code changes.
>> Please recognize how very bad the current code is behaving.
>
> Yes, there's plenty of slab confusion going on.
>
> On Tue, 11 Jul 2006, Eric W. Biederman wrote:
>> As for the rest sure go ahead and create a patch to address it
>> but that really is a separate issue and thus a separate patch.
>> 
>> I'm just trying to keep the kernel from calling BUG_ON the first
>> time a msi irq is allocated on a kernel with a maximum NR_CPUS
>> configuration, and from wasting memory the rest of the time.
>> 
>> Or you know how bad the msi code is when every patch to fix a major
>> issue is followed up comments on how to improve the code even further.
>
> Ok.

Looks good to me. 

> Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
> ---
>
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index 36bc7c4..77b08ee 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -45,16 +45,11 @@ msi_register(struct msi_ops *ops)
>  	return 0;
>  }
>  
> -static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
> -{
> -	memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
> -}
> -
>  static int msi_cache_init(void)
>  {
>  	msi_cachep = kmem_cache_create("msi_cache",
> -			NR_IRQS * sizeof(struct msi_desc),
> -		       	0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
> +			sizeof(struct msi_desc),
> +		       	0, SLAB_HWCACHE_ALIGN, NULL, NULL);
>  	if (!msi_cachep)
>  		return -ENOMEM;
>  
> @@ -402,11 +397,10 @@ static struct msi_desc* alloc_msi_entry(
>  {
>  	struct msi_desc *entry;
>  
> -	entry = kmem_cache_alloc(msi_cachep, SLAB_KERNEL);
> +	entry = kmem_cache_zalloc(msi_cachep, GFP_KERNEL);
>  	if (!entry)
>  		return NULL;
>  
> -	memset(entry, 0, sizeof(struct msi_desc));
>  	entry->link.tail = entry->link.head = 0;	/* single message */
>  	entry->dev = NULL;
>  

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2006-07-11  7:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-07-10 22:00 [PATCH] msi: Only keep one msi_desc in each slab entry Eric W. Biederman
2006-07-11  6:03 ` Pekka Enberg
2006-07-11  6:42   ` Eric W. Biederman
2006-07-11  6:55     ` Pekka J Enberg
2006-07-11  7:16       ` Eric W. Biederman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome