lkml.org 
[lkml]   [2006]   [Apr]   [4]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
DateMon, 3 Apr 2006 21:20:49 -0700
FromAndrew Morton <>
SubjectRe: [PATCH] kexec on ia64
Khalid Aziz <khalid_aziz@hp.com> wrote:
>> Add kexec support on ia64.> 

Neat.  How well does it work?

> +#ifdef CONFIG_PCI> +void machine_shutdown(void)> +{> +	struct pci_dev *dev;> +	irq_desc_t *idesc;> +	cpumask_t mask = CPU_MASK_NONE;> +> +	/* Disable all PCI devices */> +	list_for_each_entry(dev, &pci_devices, global_list) {
> +		if (!(dev->is_enabled))> +			continue;> +		idesc = irq_descp(dev->irq);> +		if (!idesc)> +			continue;> +		cpu_set(0, mask);> +		disable_irq_nosync(dev->irq);> +		idesc->handler->end(dev->irq);> +		idesc->handler->set_affinity(dev->irq, mask);
> +		idesc->action = NULL;> +		pci_disable_device(dev);> +		pci_set_power_state(dev, 0);> +	}> +}> +#endif

Ahem.

  /* Do NOT directly access these two variables, unless you are arch specific pci
   * code, or pci core code. */
  extern struct list_head pci_root_buses;	/* list of all known PCI buses */
  extern struct list_head pci_devices;	/* list of all devices */
I think it would be kinder to the API to use pci_find_device(PCI_ANY_ID,
PCI_ANY_ID, ...) here.

> +/*> + * Do not allocate memory (or fail in any way) in machine_kexec().
> + * We are past the point of no return, committed to rebooting now. 
> + */> +void machine_kexec(struct kimage *image)> +{> +	unsigned long indirection_page;> +	relocate_new_kernel_t rnk;> +	unsigned long pta, impl_va_bits;> +	void *pal_addr = efi_get_pal_addr();> +	unsigned long code_addr = (unsigned long)page_address(image->control_code_page);
> +> +#ifdef CONFIG_HOTPLUG_CPU> +	int cpu;> +> +	for_each_online_cpu(cpu) {> +		if (cpu != smp_processor_id())> +			cpu_down(cpu);> +	}> +#elif CONFIG_SMP

This will generate a CPP warning if CONFIG_SMP is not defined.

	#elif defined(CONFIG_SMP)

would be preferred.

> --- linux-2.6.16/kernel/irq/manage.c	2006-03-19 22:53:29.000000000 -0700
> +++ linux-2.6.16-kexec/kernel/irq/manage.c	2006-03-27 17:02:08.000000000 -0700
> @@ -377,3 +377,22 @@ int request_irq(unsigned int irq,
> >  EXPORT_SYMBOL(request_irq);
> 
> +/*
> + * Terminate any outstanding interrupts
> + */
> +void terminate_irqs(void)
> +{
> +	struct irqaction * action;
> +	irq_desc_t *idesc;
> +	int i;
> +
> +	for (i=0; i<NR_IRQS; i++) {

	for (i = 0; i < NR_IRQS; i++) {
> +		idesc = irq_descp(i);> +		action = idesc->action;> +		if (!action)> +			continue;> +		if (idesc->handler->end)> +			idesc->handler->end(i);> +	}> +}

Could we have a bit more description of what this function does, and why we
need it?

Should other kexec-using architectures be using this?  If not, why does
ia64 need it?

Thanks.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-04-04 06:25    [from the cache]
©2003-2008