mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
Drivers: hv: allocate the exact needed memory for messages
When we need to pass a buffer with Hyper-V message we don't need to always allocate 256 bytes for the message: the real message length is known from the header. Change 'struct onmessage_work_context' to make it possible to not over-allocate. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Reviewed-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/r/20200406104154.45010-3-vkuznets@redhat.com Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
parent
ac0f7d4258
commit
a276463b7a
@ -1019,7 +1019,10 @@ static struct bus_type hv_bus = {
|
||||
|
||||
struct onmessage_work_context {
|
||||
struct work_struct work;
|
||||
struct hv_message msg;
|
||||
struct {
|
||||
struct hv_message_header header;
|
||||
u8 payload[];
|
||||
} msg;
|
||||
};
|
||||
|
||||
static void vmbus_onmessage_work(struct work_struct *work)
|
||||
@ -1072,7 +1075,8 @@ void vmbus_on_msg_dpc(unsigned long data)
|
||||
goto msg_handled;
|
||||
|
||||
if (entry->handler_type == VMHT_BLOCKING) {
|
||||
ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
|
||||
ctx = kmalloc(sizeof(*ctx) + msg->header.payload_size,
|
||||
GFP_ATOMIC);
|
||||
if (ctx == NULL)
|
||||
return;
|
||||
|
||||
@ -1126,10 +1130,11 @@ static void vmbus_force_channel_rescinded(struct vmbus_channel *channel)
|
||||
WARN_ON(!is_hvsock_channel(channel));
|
||||
|
||||
/*
|
||||
* sizeof(*ctx) is small and the allocation should really not fail,
|
||||
* Allocation size is small and the allocation should really not fail,
|
||||
* otherwise the state of the hv_sock connections ends up in limbo.
|
||||
*/
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL | __GFP_NOFAIL);
|
||||
ctx = kzalloc(sizeof(*ctx) + sizeof(*rescind),
|
||||
GFP_KERNEL | __GFP_NOFAIL);
|
||||
|
||||
/*
|
||||
* So far, these are not really used by Linux. Just set them to the
|
||||
@ -1139,7 +1144,7 @@ static void vmbus_force_channel_rescinded(struct vmbus_channel *channel)
|
||||
ctx->msg.header.payload_size = sizeof(*rescind);
|
||||
|
||||
/* These values are actually used by Linux. */
|
||||
rescind = (struct vmbus_channel_rescind_offer *)ctx->msg.u.payload;
|
||||
rescind = (struct vmbus_channel_rescind_offer *)ctx->msg.payload;
|
||||
rescind->header.msgtype = CHANNELMSG_RESCIND_CHANNELOFFER;
|
||||
rescind->child_relid = channel->offermsg.child_relid;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user