Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 162176
b: refs/heads/master
c: de65a38
h: refs/heads/master
v: v3
  • Loading branch information
Bill Pemberton authored and Greg Kroah-Hartman committed Sep 15, 2009
1 parent c83c15f commit 96f4f5a
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 63 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 949cadaa054588db0c4a3a0cfc3ac93f08fda913
refs/heads/master: de65a38406bdf712abc2a845fe1f3db7d1a083ed
14 changes: 9 additions & 5 deletions trunk/drivers/staging/hv/ChannelMgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ static VMBUS_CHANNEL* AllocVmbusChannel(void)
}

/* channel->dataWorkQueue = WorkQueueCreate("data"); */
channel->ControlWQ = WorkQueueCreate("control");
channel->ControlWQ = create_workqueue("hv_vmbus_ctl");
if (!channel->ControlWQ)
{
TimerClose(channel->PollTimer);
Expand All @@ -176,7 +176,7 @@ static inline void ReleaseVmbusChannel(void* Context)
DPRINT_ENTER(VMBUS);

DPRINT_DBG(VMBUS, "releasing channel (%p)", channel);
WorkQueueClose(channel->ControlWQ);
destroy_workqueue(channel->ControlWQ);
DPRINT_DBG(VMBUS, "channel released (%p)", channel);

kfree(channel);
Expand All @@ -199,7 +199,8 @@ static void FreeVmbusChannel(VMBUS_CHANNEL* Channel)

/* We have to release the channel's workqueue/thread in the vmbus's workqueue/thread context */
/* ie we can't destroy ourselves. */
WorkQueueQueueWorkItem(gVmbusConnection.WorkQueue, ReleaseVmbusChannel, (void*)Channel);
osd_schedule_callback(gVmbusConnection.WorkQueue, ReleaseVmbusChannel,
(void *)Channel);
}


Expand Down Expand Up @@ -389,7 +390,8 @@ VmbusChannelOnOffer(
newChannel->MonitorBit = (u8)offer->MonitorId % 32;

/* TODO: Make sure the offer comes from our parent partition */
WorkQueueQueueWorkItem(newChannel->ControlWQ, VmbusChannelProcessOffer, newChannel);
osd_schedule_callback(newChannel->ControlWQ, VmbusChannelProcessOffer,
newChannel);

DPRINT_EXIT(VMBUS);
}
Expand Down Expand Up @@ -422,7 +424,9 @@ VmbusChannelOnOfferRescind(
return;
}

WorkQueueQueueWorkItem(channel->ControlWQ, VmbusChannelProcessRescindOffer, channel);
osd_schedule_callback(channel->ControlWQ,
VmbusChannelProcessRescindOffer,
channel);

DPRINT_EXIT(VMBUS);
}
Expand Down
12 changes: 9 additions & 3 deletions trunk/drivers/staging/hv/Connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,12 @@ VmbusConnect(void)

/* Initialize the vmbus connection */
gVmbusConnection.ConnectState = Connecting;
gVmbusConnection.WorkQueue = WorkQueueCreate("vmbusQ");
gVmbusConnection.WorkQueue = create_workqueue("hv_vmbus_con");
if (!gVmbusConnection.WorkQueue)
{
ret = -1;
goto Cleanup;
}

INITIALIZE_LIST_HEAD(&gVmbusConnection.ChannelMsgList);
spin_lock_init(&gVmbusConnection.channelmsg_lock);
Expand Down Expand Up @@ -160,7 +165,8 @@ VmbusConnect(void)

gVmbusConnection.ConnectState = Disconnected;

WorkQueueClose(gVmbusConnection.WorkQueue);
if (gVmbusConnection.WorkQueue)
destroy_workqueue(gVmbusConnection.WorkQueue);

if (gVmbusConnection.InterruptPage)
{
Expand Down Expand Up @@ -226,7 +232,7 @@ VmbusDisconnect(

/* TODO: iterate thru the msg list and free up */

WorkQueueClose(gVmbusConnection.WorkQueue);
destroy_workqueue(gVmbusConnection.WorkQueue);

gVmbusConnection.ConnectState = Disconnected;

Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/staging/hv/Vmbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,9 @@ VmbusOnMsgDPC(
}

memcpy(copied, msg, sizeof(HV_MESSAGE));
WorkQueueQueueWorkItem(gVmbusConnection.WorkQueue, VmbusOnChannelMessage, (void*)copied);
osd_schedule_callback(gVmbusConnection.WorkQueue,
VmbusOnChannelMessage,
(void *)copied);
}

msg->Header.MessageType = HvMessageTypeNone;
Expand Down
11 changes: 3 additions & 8 deletions trunk/drivers/staging/hv/include/osd.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ typedef struct _DLIST_ENTRY {

/* typedef unsigned char GUID[16]; */

typedef void (*PFN_WORKITEM_CALLBACK)(void* context);
typedef void (*PFN_TIMER_CALLBACK)(void* context);


Expand Down Expand Up @@ -155,12 +154,8 @@ void* PageMapVirtualAddress(unsigned long Pfn);
void PageUnmapVirtualAddress(void* VirtAddr);


extern struct workqueue_struct *WorkQueueCreate(char* name);
extern void WorkQueueClose(struct workqueue_struct *hWorkQueue);
extern int WorkQueueQueueWorkItem(struct workqueue_struct *hWorkQueue,
PFN_WORKITEM_CALLBACK workItem,
void *context);

extern void QueueWorkItem(PFN_WORKITEM_CALLBACK workItem, void* context);
int osd_schedule_callback(struct workqueue_struct *wq,
void (*func)(void *),
void *data);

#endif /* _OSD_H_ */
66 changes: 21 additions & 45 deletions trunk/drivers/staging/hv/osd.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@
/* Data types */


typedef struct _WORKITEM {
struct osd_callback_struct {
struct work_struct work;
PFN_WORKITEM_CALLBACK callback;
void* context;
} WORKITEM;
void (*callback)(void *);
void *data;
};


void BitSet(unsigned int* addr, int bit)
Expand Down Expand Up @@ -269,56 +269,32 @@ unsigned long Virtual2Physical(void * VirtAddr)
return pfn << PAGE_SHIFT;
}

static void WorkItemCallback(struct work_struct *work)
static void osd_callback_work(struct work_struct *work)
{
WORKITEM* w = (WORKITEM*)work;
struct osd_callback_struct *cb = container_of(work,
struct osd_callback_struct,
work);
(cb->callback)(cb->data);

w->callback(w->context);

kfree(w);
}

struct workqueue_struct *WorkQueueCreate(char *name)
{
struct workqueue_struct *wq;
wq = create_workqueue(name);
if (unlikely(!wq))
return NULL;
return wq;
kfree(cb);
}

void WorkQueueClose(struct workqueue_struct *hWorkQueue)
int osd_schedule_callback(struct workqueue_struct *wq,
void (*func)(void *),
void *data)
{
destroy_workqueue(hWorkQueue);
return;
}
struct osd_callback_struct *cb;

int WorkQueueQueueWorkItem(struct workqueue_struct *hWorkQueue,
PFN_WORKITEM_CALLBACK workItem,
void* context)
{
WORKITEM* w = kmalloc(sizeof(WORKITEM), GFP_ATOMIC);
if (!w)
cb = kmalloc(sizeof(*cb), GFP_KERNEL);
if (!cb)
{
printk(KERN_ERR "unable to allocate memory in osd_schedule_callback");
return -1;
}

w->callback = workItem,
w->context = context;
INIT_WORK(&w->work, WorkItemCallback);
return queue_work(hWorkQueue, &w->work);
cb->callback = func;
cb->data = data;
INIT_WORK(&cb->work, osd_callback_work);
return queue_work(wq, &cb->work);
}

void QueueWorkItem(PFN_WORKITEM_CALLBACK workItem, void* context)
{
WORKITEM* w = kmalloc(sizeof(WORKITEM), GFP_ATOMIC);
if (!w)
{
return;
}

w->callback = workItem,
w->context = context;
INIT_WORK(&w->work, WorkItemCallback);
schedule_work(&w->work);
}

0 comments on commit 96f4f5a

Please sign in to comment.