Skip to content

Commit

Permalink
PCI: hv: Fix the definition of vector in hv_compose_msi_msg()
Browse files Browse the repository at this point in the history
[ Upstream commit e70af8d ]

The local variable 'vector' must be u32 rather than u8: see the
struct hv_msi_desc3.

'vector_count' should be u16 rather than u8: see struct hv_msi_desc,
hv_msi_desc2 and hv_msi_desc3.

Fixes: a2bad84 ("PCI: hv: Fix interrupt mapping for multi-MSI")
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Cc: Jeffrey Hugo <quic_jhugo@quicinc.com>
Cc: Carl Vanderlip <quic_carlv@quicinc.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://lore.kernel.org/r/20221027205256.17678-1-decui@microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
dcui authored and gregkh committed Nov 16, 2022
1 parent 543e282 commit 5e9b8b3
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions drivers/pci/controller/pci-hyperv.c
Expand Up @@ -1614,7 +1614,7 @@ static void hv_pci_compose_compl(void *context, struct pci_response *resp,

static u32 hv_compose_msi_req_v1(
struct pci_create_interrupt *int_pkt, const struct cpumask *affinity,
u32 slot, u8 vector, u8 vector_count)
u32 slot, u8 vector, u16 vector_count)
{
int_pkt->message_type.type = PCI_CREATE_INTERRUPT_MESSAGE;
int_pkt->wslot.slot = slot;
Expand Down Expand Up @@ -1642,7 +1642,7 @@ static int hv_compose_msi_req_get_cpu(const struct cpumask *affinity)

static u32 hv_compose_msi_req_v2(
struct pci_create_interrupt2 *int_pkt, const struct cpumask *affinity,
u32 slot, u8 vector, u8 vector_count)
u32 slot, u8 vector, u16 vector_count)
{
int cpu;

Expand All @@ -1661,7 +1661,7 @@ static u32 hv_compose_msi_req_v2(

static u32 hv_compose_msi_req_v3(
struct pci_create_interrupt3 *int_pkt, const struct cpumask *affinity,
u32 slot, u32 vector, u8 vector_count)
u32 slot, u32 vector, u16 vector_count)
{
int cpu;

Expand Down Expand Up @@ -1701,7 +1701,12 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
struct compose_comp_ctxt comp;
struct tran_int_desc *int_desc;
struct msi_desc *msi_desc;
u8 vector, vector_count;
/*
* vector_count should be u16: see hv_msi_desc, hv_msi_desc2
* and hv_msi_desc3. vector must be u32: see hv_msi_desc3.
*/
u16 vector_count;
u32 vector;
struct {
struct pci_packet pci_pkt;
union {
Expand Down Expand Up @@ -1767,6 +1772,11 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
vector_count = 1;
}

/*
* hv_compose_msi_req_v1 and v2 are for x86 only, meaning 'vector'
* can't exceed u8. Cast 'vector' down to u8 for v1/v2 explicitly
* for better readability.
*/
memset(&ctxt, 0, sizeof(ctxt));
init_completion(&comp.comp_pkt.host_event);
ctxt.pci_pkt.completion_func = hv_pci_compose_compl;
Expand All @@ -1777,7 +1787,7 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
size = hv_compose_msi_req_v1(&ctxt.int_pkts.v1,
dest,
hpdev->desc.win_slot.slot,
vector,
(u8)vector,
vector_count);
break;

Expand All @@ -1786,7 +1796,7 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
size = hv_compose_msi_req_v2(&ctxt.int_pkts.v2,
dest,
hpdev->desc.win_slot.slot,
vector,
(u8)vector,
vector_count);
break;

Expand Down

0 comments on commit 5e9b8b3

Please sign in to comment.