From 19339eb66f1579d3d89c9c676126909031d46bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Wed, 15 Dec 2010 20:48:08 +0200 Subject: [PATCH] --- yaml --- r: 228399 b: refs/heads/master c: bf6506f60c46c8a709df534408cc6d470df657ff h: refs/heads/master i: 228397: e5a4618da94901b604d02f284abeb23baa27e79b 228395: afd354f2923aa9b013a0b21913d0579dcf485f64 228391: e91b2837daa1856d066aed3ca433a494cde33c3f 228383: ac366182a383ae9ef6bbb0fa4915506338fadce2 v: v3 --- [refs] | 2 +- trunk/drivers/staging/hv/channel_mgmt.c | 4 ---- trunk/drivers/staging/hv/vmbus_drv.c | 28 ++++++++++++++++++------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index f8ba372c4c14..b4e53a952cbc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f4528696d803749892eac27422a6fd7748cffee1 +refs/heads/master: bf6506f60c46c8a709df534408cc6d470df657ff diff --git a/trunk/drivers/staging/hv/channel_mgmt.c b/trunk/drivers/staging/hv/channel_mgmt.c index 0f4d6093f674..6f393e7d8e25 100644 --- a/trunk/drivers/staging/hv/channel_mgmt.c +++ b/trunk/drivers/staging/hv/channel_mgmt.c @@ -753,7 +753,6 @@ void vmbus_onmessage(void *context) hdr->msgtype, size); print_hex_dump_bytes("", DUMP_PREFIX_NONE, (unsigned char *)msg->u.payload, size); - kfree(msg); return; } @@ -762,9 +761,6 @@ void vmbus_onmessage(void *context) else DPRINT_ERR(VMBUS, "Unhandled channel message type %d", hdr->msgtype); - - /* Free the msg that was allocated in VmbusOnMsgDPC() */ - kfree(msg); } /* diff --git a/trunk/drivers/staging/hv/vmbus_drv.c b/trunk/drivers/staging/hv/vmbus_drv.c index d794b603bf17..84fdb64d3ceb 100644 --- a/trunk/drivers/staging/hv/vmbus_drv.c +++ b/trunk/drivers/staging/hv/vmbus_drv.c @@ -203,6 +203,21 @@ static void VmbusOnCleanup(struct hv_driver *drv) hv_cleanup(); } +struct onmessage_work_context { + struct work_struct work; + struct hv_message msg; +}; + +static void vmbus_onmessage_work(struct work_struct *work) +{ + struct onmessage_work_context *ctx; + + ctx = container_of(work, struct onmessage_work_context, + work); + vmbus_onmessage(&ctx->msg); + kfree(ctx); +} + /* * vmbus_on_msg_dpc - DPC routine to handle messages from the hypervisior */ @@ -212,20 +227,19 @@ static void vmbus_on_msg_dpc(struct hv_driver *drv) void *page_addr = hv_context.synic_message_page[cpu]; struct hv_message *msg = (struct hv_message *)page_addr + VMBUS_MESSAGE_SINT; - struct hv_message *copied; + struct onmessage_work_context *ctx; while (1) { if (msg->header.message_type == HVMSG_NONE) { /* no msg */ break; } else { - copied = kmemdup(msg, sizeof(*copied), GFP_ATOMIC); - if (copied == NULL) + ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC); + if (ctx == NULL) continue; - - osd_schedule_callback(gVmbusConnection.WorkQueue, - vmbus_onmessage, - (void *)copied); + INIT_WORK(&ctx->work, vmbus_onmessage_work); + memcpy(&ctx->msg, msg, sizeof(*msg)); + queue_work(gVmbusConnection.WorkQueue, &ctx->work); } msg->header.message_type = HVMSG_NONE;