Commit faab52b5 authored by Nuno Das Neves's avatar Nuno Das Neves Committed by Wei Liu
Browse files

x86/hyperv: Clean up hv_map/unmap_interrupt() return values



Fix the return values of these hypercall helpers so they return
a negated errno either directly or via hv_result_to_errno().

Update the callers to check for errno instead of using
hv_status_success(), and remove redundant error printing.

While at it, rearrange some variable declarations to adhere to style
guidelines i.e. "reverse fir tree order".

Signed-off-by: default avatarNuno Das Neves <nunodasneves@linux.microsoft.com>
Reviewed-by: default avatarMichael Kelley <mhklinux@outlook.com>
Link: https://lore.kernel.org/r/1751582677-30930-5-git-send-email-nunodasneves@linux.microsoft.com


Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
Message-ID: <1751582677-30930-5-git-send-email-nunodasneves@linux.microsoft.com>
parent bb169f80
Loading
Loading
Loading
Loading
+14 −18
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ static int hv_map_interrupt(union hv_device_id device_id, bool level,
	if (nr_bank < 0) {
		local_irq_restore(flags);
		pr_err("%s: unable to generate VP set\n", __func__);
		return EINVAL;
		return -EINVAL;
	}
	intr_desc->target.flags = HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET;

@@ -67,7 +67,7 @@ static int hv_map_interrupt(union hv_device_id device_id, bool level,
	if (!hv_result_success(status))
		hv_status_err(status, "\n");

	return hv_result(status);
	return hv_result_to_errno(status);
}

static int hv_unmap_interrupt(u64 id, struct hv_interrupt_entry *old_entry)
@@ -89,7 +89,10 @@ static int hv_unmap_interrupt(u64 id, struct hv_interrupt_entry *old_entry)
	status = hv_do_hypercall(HVCALL_UNMAP_DEVICE_INTERRUPT, input, NULL);
	local_irq_restore(flags);

	return hv_result(status);
	if (!hv_result_success(status))
		hv_status_err(status, "\n");

	return hv_result_to_errno(status);
}

#ifdef CONFIG_PCI_MSI
@@ -189,12 +192,11 @@ static inline void entry_to_msi_msg(struct hv_interrupt_entry *entry, struct msi
static int hv_unmap_msi_interrupt(struct pci_dev *dev, struct hv_interrupt_entry *old_entry);
static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
{
	struct msi_desc *msidesc;
	struct pci_dev *dev;
	struct hv_interrupt_entry out_entry, *stored_entry;
	struct irq_cfg *cfg = irqd_cfg(data);
	int cpu;
	u64 status;
	struct msi_desc *msidesc;
	struct pci_dev *dev;
	int cpu, ret;

	msidesc = irq_data_get_msi_desc(data);
	dev = msi_desc_to_pci_dev(msidesc);
@@ -218,15 +220,13 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
		stored_entry = data->chip_data;
		data->chip_data = NULL;

		status = hv_unmap_msi_interrupt(dev, stored_entry);
		ret = hv_unmap_msi_interrupt(dev, stored_entry);

		kfree(stored_entry);

		if (status != HV_STATUS_SUCCESS) {
			hv_status_debug(status, "failed to unmap\n");
		if (ret)
			return;
	}
	}

	stored_entry = kzalloc(sizeof(*stored_entry), GFP_ATOMIC);
	if (!stored_entry) {
@@ -234,8 +234,8 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
		return;
	}

	status = hv_map_msi_interrupt(dev, cpu, cfg->vector, &out_entry);
	if (status != HV_STATUS_SUCCESS) {
	ret = hv_map_msi_interrupt(dev, cpu, cfg->vector, &out_entry);
	if (ret) {
		kfree(stored_entry);
		return;
	}
@@ -256,7 +256,6 @@ static void hv_teardown_msi_irq(struct pci_dev *dev, struct irq_data *irqd)
{
	struct hv_interrupt_entry old_entry;
	struct msi_msg msg;
	u64 status;

	if (!irqd->chip_data) {
		pr_debug("%s: no chip data\n!", __func__);
@@ -269,10 +268,7 @@ static void hv_teardown_msi_irq(struct pci_dev *dev, struct irq_data *irqd)
	kfree(irqd->chip_data);
	irqd->chip_data = NULL;

	status = hv_unmap_msi_interrupt(dev, &old_entry);

	if (status != HV_STATUS_SUCCESS)
		hv_status_err(status, "\n");
	(void)hv_unmap_msi_interrupt(dev, &old_entry);
}

static void hv_msi_free_irq(struct irq_domain *domain,
+12 −21
Original line number Diff line number Diff line
@@ -193,15 +193,13 @@ struct hyperv_root_ir_data {
static void
hyperv_root_ir_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
{
	u64 status;
	u32 vector;
	struct irq_cfg *cfg;
	int ioapic_id;
	const struct cpumask *affinity;
	int cpu;
	struct hv_interrupt_entry entry;
	struct hyperv_root_ir_data *data = irq_data->chip_data;
	struct hv_interrupt_entry entry;
	const struct cpumask *affinity;
	struct IO_APIC_route_entry e;
	struct irq_cfg *cfg;
	int cpu, ioapic_id;
	u32 vector;

	cfg = irqd_cfg(irq_data);
	affinity = irq_data_get_effective_affinity_mask(irq_data);
@@ -214,23 +212,16 @@ hyperv_root_ir_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
	    && data->entry.ioapic_rte.as_uint64) {
		entry = data->entry;

		status = hv_unmap_ioapic_interrupt(ioapic_id, &entry);

		if (status != HV_STATUS_SUCCESS)
			hv_status_debug(status, "failed to unmap\n");
		(void)hv_unmap_ioapic_interrupt(ioapic_id, &entry);

		data->entry.ioapic_rte.as_uint64 = 0;
		data->entry.source = 0; /* Invalid source */
	}


	status = hv_map_ioapic_interrupt(ioapic_id, data->is_level, cpu,
					vector, &entry);

	if (status != HV_STATUS_SUCCESS) {
		hv_status_err(status, "map failed\n");
	if (hv_map_ioapic_interrupt(ioapic_id, data->is_level, cpu,
				    vector, &entry))
		return;
	}

	data->entry = entry;

@@ -322,9 +313,9 @@ static void hyperv_root_irq_remapping_free(struct irq_domain *domain,
			data = irq_data->chip_data;
			e = &data->entry;

			if (e->source == HV_DEVICE_TYPE_IOAPIC
			      && e->ioapic_rte.as_uint64)
				hv_unmap_ioapic_interrupt(data->ioapic_id,
			if (e->source == HV_DEVICE_TYPE_IOAPIC &&
			    e->ioapic_rte.as_uint64)
				(void)hv_unmap_ioapic_interrupt(data->ioapic_id,
								&data->entry);

			kfree(data);