diff options
author | Christian Borntraeger <cborntra@de.ibm.com> | 2006-04-27 21:40:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-28 11:33:48 -0400 |
commit | 40ac6b204c20da09b64b6dcc10c68b6e7bd9fadd (patch) | |
tree | 03a5968a6db56c3365c3440e2f5141c8677d47d2 /drivers/s390/cio/qdio.c | |
parent | 39ccf95e28765a08a9e01be614695d7c570b4e77 (diff) |
[PATCH] s390: fix slab debugging
With CONFIG_SLAB_DEBUG=y networking over qeth doesn't work. The problem is
that the qib structure embedded in the qeth_irq structure needs an alignment
of 256 but kmalloc only guarantees an alignment of 8. When using SLAB
debugging the alignment of qeth_irq is not sufficient for the embedded qib
structure which causes all users of qdio (qeth and zfcp) to stop working.
Allocate qeth_irq structure with __get_free_page. That wastes a small amount
of memory (~2500 bytes) per online adapter.
Signed-off-by: Christian Borntraeger <cborntra@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/s390/cio/qdio.c')
-rw-r--r-- | drivers/s390/cio/qdio.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index a5bf272fe775..96f519281d92 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -1640,7 +1640,7 @@ next: | |||
1640 | 1640 | ||
1641 | } | 1641 | } |
1642 | kfree(irq_ptr->qdr); | 1642 | kfree(irq_ptr->qdr); |
1643 | kfree(irq_ptr); | 1643 | free_page((unsigned long) irq_ptr); |
1644 | } | 1644 | } |
1645 | 1645 | ||
1646 | static void | 1646 | static void |
@@ -2983,7 +2983,7 @@ qdio_allocate(struct qdio_initialize *init_data) | |||
2983 | qdio_allocate_do_dbf(init_data); | 2983 | qdio_allocate_do_dbf(init_data); |
2984 | 2984 | ||
2985 | /* create irq */ | 2985 | /* create irq */ |
2986 | irq_ptr = kzalloc(sizeof(struct qdio_irq), GFP_KERNEL | GFP_DMA); | 2986 | irq_ptr = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA); |
2987 | 2987 | ||
2988 | QDIO_DBF_TEXT0(0,setup,"irq_ptr:"); | 2988 | QDIO_DBF_TEXT0(0,setup,"irq_ptr:"); |
2989 | QDIO_DBF_HEX0(0,setup,&irq_ptr,sizeof(void*)); | 2989 | QDIO_DBF_HEX0(0,setup,&irq_ptr,sizeof(void*)); |
@@ -2998,7 +2998,7 @@ qdio_allocate(struct qdio_initialize *init_data) | |||
2998 | /* QDR must be in DMA area since CCW data address is only 32 bit */ | 2998 | /* QDR must be in DMA area since CCW data address is only 32 bit */ |
2999 | irq_ptr->qdr=kmalloc(sizeof(struct qdr), GFP_KERNEL | GFP_DMA); | 2999 | irq_ptr->qdr=kmalloc(sizeof(struct qdr), GFP_KERNEL | GFP_DMA); |
3000 | if (!(irq_ptr->qdr)) { | 3000 | if (!(irq_ptr->qdr)) { |
3001 | kfree(irq_ptr); | 3001 | free_page((unsigned long) irq_ptr); |
3002 | QDIO_PRINT_ERR("kmalloc of irq_ptr->qdr failed!\n"); | 3002 | QDIO_PRINT_ERR("kmalloc of irq_ptr->qdr failed!\n"); |
3003 | return -ENOMEM; | 3003 | return -ENOMEM; |
3004 | } | 3004 | } |