X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fcio%2Fqdio.c;h=614f18aaffaa3268a265fa63c5ffffbc2908427b;hb=720b94a4e7548e78be55ab8fd3be4686c57dc808;hp=f4c9779d2d4aa1a427ff78fbe40c977e0a98395a;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index f4c9779d2..614f18aaf 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c @@ -1301,7 +1301,7 @@ next: } kfree(irq_ptr->qdr); - kfree(irq_ptr); + kfree(irq_ptr->actual_alloc); /* This frees irq_ptr itself. */ } static void @@ -2565,6 +2565,8 @@ qdio_initialize(struct qdio_initialize *init_data) int qdio_allocate(struct qdio_initialize *init_data) { + char *mem; + unsigned off; struct qdio_irq *irq_ptr; char dbf_text[15]; @@ -2586,17 +2588,21 @@ qdio_allocate(struct qdio_initialize *init_data) qdio_allocate_do_dbf(init_data); /* create irq */ - irq_ptr=kmalloc(sizeof(struct qdio_irq), GFP_KERNEL | GFP_DMA); + mem = kmalloc(sizeof(struct qdio_irq) + 0xff, GFP_KERNEL | GFP_DMA); QDIO_DBF_TEXT0(0,setup,"irq_ptr:"); QDIO_DBF_HEX0(0,setup,&irq_ptr,sizeof(void*)); - if (!irq_ptr) { + if (!mem) { QDIO_PRINT_ERR("kmalloc of irq_ptr failed!\n"); return -ENOMEM; } + irq_ptr = (struct qdio_irq *) mem; + if ((off = ((unsigned long) mem) & 0xff) != 0) + irq_ptr = (struct qdio_irq *)(mem + 0x100 - off); memset(irq_ptr,0,sizeof(struct qdio_irq)); + irq_ptr->actual_alloc = mem; init_MUTEX(&irq_ptr->setting_up_sema);