Commit a276463b authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Wei Liu

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: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: default avatarMichael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/20200406104154.45010-3-vkuznets@redhat.comSigned-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent ac0f7d42
...@@ -1019,7 +1019,10 @@ static struct bus_type hv_bus = { ...@@ -1019,7 +1019,10 @@ static struct bus_type hv_bus = {
struct onmessage_work_context { struct onmessage_work_context {
struct work_struct work; 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) static void vmbus_onmessage_work(struct work_struct *work)
...@@ -1072,7 +1075,8 @@ void vmbus_on_msg_dpc(unsigned long data) ...@@ -1072,7 +1075,8 @@ void vmbus_on_msg_dpc(unsigned long data)
goto msg_handled; goto msg_handled;
if (entry->handler_type == VMHT_BLOCKING) { 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) if (ctx == NULL)
return; return;
...@@ -1126,10 +1130,11 @@ static void vmbus_force_channel_rescinded(struct vmbus_channel *channel) ...@@ -1126,10 +1130,11 @@ static void vmbus_force_channel_rescinded(struct vmbus_channel *channel)
WARN_ON(!is_hvsock_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. * 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 * 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) ...@@ -1139,7 +1144,7 @@ static void vmbus_force_channel_rescinded(struct vmbus_channel *channel)
ctx->msg.header.payload_size = sizeof(*rescind); ctx->msg.header.payload_size = sizeof(*rescind);
/* These values are actually used by Linux. */ /* 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->header.msgtype = CHANNELMSG_RESCIND_CHANNELOFFER;
rescind->child_relid = channel->offermsg.child_relid; rescind->child_relid = channel->offermsg.child_relid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment