Re: [PATCH 1/8] v3 Move the find_memory_block() routine up

2010-07-20 Thread KAMEZAWA Hiroyuki
On Mon, 19 Jul 2010 22:51:42 -0500
Nathan Fontenot nf...@austin.ibm.com wrote:

 Move the find_me mory_block() routine up to avoid needing a forward
 declaration in subsequent patches.
 
 Signed-off-by: Nathan Fontenot nf...@austin.ibm.com

Acked-by: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com

 ---
  drivers/base/memory.c |   62 
 +-
  1 file changed, 31 insertions(+), 31 deletions(-)
 
 Index: linux-2.6/drivers/base/memory.c
 ===
 --- linux-2.6.orig/drivers/base/memory.c  2010-07-16 12:41:30.0 
 -0500
 +++ linux-2.6/drivers/base/memory.c   2010-07-19 20:42:11.0 -0500
 @@ -435,6 +435,37 @@ int __weak arch_get_memory_phys_device(u
   return 0;
  }
  
 +/*
 + * For now, we have a linear search to go find the appropriate
 + * memory_block corresponding to a particular phys_index. If
 + * this gets to be a real problem, we can always use a radix
 + * tree or something here.
 + *
 + * This could be made generic for all sysdev classes.
 + */
 +struct memory_block *find_memory_block(struct mem_section *section)
 +{
 + struct kobject *kobj;
 + struct sys_device *sysdev;
 + struct memory_block *mem;
 + char name[sizeof(MEMORY_CLASS_NAME) + 9 + 1];
 +
 + /*
 +  * This only works because we know that section == sysdev-id
 +  * slightly redundant with sysdev_register()
 +  */
 + sprintf(name[0], %s%d, MEMORY_CLASS_NAME, __section_nr(section));
 +
 + kobj = kset_find_obj(memory_sysdev_class.kset, name);
 + if (!kobj)
 + return NULL;
 +
 + sysdev = container_of(kobj, struct sys_device, kobj);
 + mem = container_of(sysdev, struct memory_block, sysdev);
 +
 + return mem;
 +}
 +
  static int add_memory_block(int nid, struct mem_section *section,
   unsigned long state, enum mem_add_context context)
  {
 @@ -468,37 +499,6 @@ static int add_memory_block(int nid, str
   return ret;
  }
  
 -/*
 - * For now, we have a linear search to go find the appropriate
 - * memory_block corresponding to a particular phys_index. If
 - * this gets to be a real problem, we can always use a radix
 - * tree or something here.
 - *
 - * This could be made generic for all sysdev classes.
 - */
 -struct memory_block *find_memory_block(struct mem_section *section)
 -{
 - struct kobject *kobj;
 - struct sys_device *sysdev;
 - struct memory_block *mem;
 - char name[sizeof(MEMORY_CLASS_NAME) + 9 + 1];
 -
 - /*
 -  * This only works because we know that section == sysdev-id
 -  * slightly redundant with sysdev_register()
 -  */
 - sprintf(name[0], %s%d, MEMORY_CLASS_NAME, __section_nr(section));
 -
 - kobj = kset_find_obj(memory_sysdev_class.kset, name);
 - if (!kobj)
 - return NULL;
 -
 - sysdev = container_of(kobj, struct sys_device, kobj);
 - mem = container_of(sysdev, struct memory_block, sysdev);
 -
 - return mem;
 -}
 -
  int remove_memory_block(unsigned long node_id, struct mem_section *section,
   int phys_device)
  {
 --
 To unsubscribe from this list: send the line unsubscribe linux-kernel in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 Please read the FAQ at  http://www.tux.org/lkml/
 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 2/8] v3 Add new phys_index properties

2010-07-20 Thread KAMEZAWA Hiroyuki
On Mon, 19 Jul 2010 22:52:50 -0500
Nathan Fontenot nf...@austin.ibm.com wrote:

 Update the 'phys_index' properties of a memory block to include a
 'start_phys_index' which is the same as the current 'phys_index' property.
 This also adds an 'end_phys_index' property to indicate the id of the
 last section in th memory block.
 
 Signed-off-by: Nathan Fontenot nf...@austin.ibm.com

No, please remain phys_index as it is. please don't rename it.
IMHO, just adding end_phys_index is better.
please avoid interface change AFAP.

Do you have a problem if phys_index means start_phys_index ?

Thanks,
-Kame

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 3/8] v3 Add section count to memory_block

2010-07-20 Thread KAMEZAWA Hiroyuki
On Mon, 19 Jul 2010 22:53:58 -0500
Nathan Fontenot nf...@austin.ibm.com wrote:

 Add a section count property to the memory_block struct to track the number
 of memory sections that have been added/removed from a emory block.
 
 Signed-off-by: Nathan Fontenot nf...@asutin.ibm.com
 ---
  drivers/base/memory.c  |   19 ---
  include/linux/memory.h |2 ++
  2 files changed, 14 insertions(+), 7 deletions(-)
 
 Index: linux-2.6/drivers/base/memory.c
 ===
 --- linux-2.6.orig/drivers/base/memory.c  2010-07-19 20:43:49.0 
 -0500
 +++ linux-2.6/drivers/base/memory.c   2010-07-19 20:44:01.0 -0500
 @@ -487,6 +487,7 @@ static int add_memory_block(int nid, str
  
   mem-start_phys_index = __section_nr(section);
   mem-state = state;
 + atomic_inc(mem-section_count);
   mutex_init(mem-state_mutex);
   start_pfn = section_nr_to_pfn(mem-start_phys_index);
   mem-phys_device = arch_get_memory_phys_device(start_pfn);
 @@ -516,13 +517,17 @@ int remove_memory_block(unsigned long no
   struct memory_block *mem;
  
   mem = find_memory_block(section);
 - unregister_mem_sect_under_nodes(mem);
 - mem_remove_simple_file(mem, start_phys_index);
 - mem_remove_simple_file(mem, end_phys_index);
 - mem_remove_simple_file(mem, state);
 - mem_remove_simple_file(mem, phys_device);
 - mem_remove_simple_file(mem, removable);
 - unregister_memory(mem, section);
 + atomic_dec(mem-section_count);
 +
 + if (atomic_read(mem-section_count) == 0) {

We use atomic_dec_and_test() in usual.

Otherwise, I don't see other problems in other part. Please fix this nitpick.

Regards,
-Kame


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 4/8] v3 Allow memory_block to span multiple memory sections

2010-07-20 Thread KAMEZAWA Hiroyuki
On Mon, 19 Jul 2010 22:55:08 -0500
Nathan Fontenot nf...@austin.ibm.com wrote:

 Update the memory sysfs code that each sysfs memory directory is now
 considered a memory block that can contain multiple memory sections per
 memory block.  The default size of each memory block is SECTION_SIZE_BITS
 to maintain the current behavior of having a single memory section per
 memory block (i.e. one sysfs directory per memory section).
 
 For architectures that want to have memory blocks span multiple
 memory sections they need only define their own memory_block_size_bytes()
 routine.
 
 Signed-off-by: Nathan Fontenot nf...@austin.ibm.com
 ---
  drivers/base/memory.c |  141 
 ++
  1 file changed, 98 insertions(+), 43 deletions(-)
 
 Index: linux-2.6/drivers/base/memory.c
 ===
 --- linux-2.6.orig/drivers/base/memory.c  2010-07-19 20:44:01.0 
 -0500
 +++ linux-2.6/drivers/base/memory.c   2010-07-19 21:12:22.0 -0500
 @@ -28,6 +28,14 @@
  #include asm/uaccess.h
  
  #define MEMORY_CLASS_NAMEmemory
 +#define MIN_MEMORY_BLOCK_SIZE(1  SECTION_SIZE_BITS)
 +
 +static int sections_per_block;
 +
 +static inline int base_memory_block_id(int section_nr)
 +{
 + return (section_nr / sections_per_block) * sections_per_block;
 +}
  
  static struct sysdev_class memory_sysdev_class = {
   .name = MEMORY_CLASS_NAME,
 @@ -82,22 +90,21 @@ EXPORT_SYMBOL(unregister_memory_isolate_
   * register_memory - Setup a sysfs device for a memory block
   */
  static
 -int register_memory(struct memory_block *memory, struct mem_section *section)
 +int register_memory(struct memory_block *memory)
  {
   int error;
  
   memory-sysdev.cls = memory_sysdev_class;
 - memory-sysdev.id = __section_nr(section);
 + memory-sysdev.id = memory-start_phys_index;

I'm curious that this memory-start_phys_index can't overflow ?
sysdev.id is 32bit.


Thanks,
-Kame

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 5/8] v3 Update the find_memory_block declaration

2010-07-20 Thread KAMEZAWA Hiroyuki
On Mon, 19 Jul 2010 22:56:16 -0500
Nathan Fontenot nf...@austin.ibm.com wrote:

 Update the find_memory_block declaration to to take a struct mem_section *
 so that it matches the definition.
 
 Signed-off-by: Nathan Fontenot nf...@austin.ibm.com
Reviewd-by: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 6/8] v3 Update the node sysfs code

2010-07-20 Thread KAMEZAWA Hiroyuki
On Mon, 19 Jul 2010 22:57:35 -0500
Nathan Fontenot nf...@austin.ibm.com wrote:

 Update the node sysfs code to be aware of the new capability for a memory
 block to contain multiple memory sections.  This requires an additional
 parameter to unregister_mem_sect_under_nodes so that we know which memory
 section of the memory block to unregister.
 
 Signed-off-by: Nathan Fontenot nf...@austin.ibm.com
Acked-by: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PPC64/Power7 - 2.6.35-rc5] Bad relocation warnings whileBuilding a CONFIG_RELOCATABLE kernel with CONFIG_ISERIES enabled

2010-07-20 Thread Milton Miller
On Mon, 19 Jul 2010 about 14:00:56 +0200, Alexander Graf wrote:
Milton Miller wrote:
 I wrote:
   
 On Mon Jul 19 2010 at about 03:36:51 EST, Alexander Graf wrote:
 
 On 19.07.2010, at 03:11, Benjamin Herrenschmidt wrote:

   
 On Thu, 2010-07-15 at 17:05 +0530, Subrata Modak wrote:
 
 commit e62cee42e66dcca83aae02748535f62e0f564a0c solved the problem for
 2.6.34-rc6. However some other bad relocation warnings generated against
 2.6.35-rc5 on Power7/ppc64 below:

 MODPOST 2004 modules^M
 WARNING: 2 bad relocations^M
 c0008590 R_PPC64_ADDR32 .text+0x40008460^M
 c0008594 R_PPC64_ADDR32 .text+0x40008598^M
   
 I think this is KVM + CONFIG_RELOCATABLE. Caused by:

 .global kvmppc_trampoline_lowmem
 kvmppc_trampoline_lowmem:
 .long kvmppc_handler_lowmem_trampoline - CONFIG_KERNEL_START

 .global kvmppc_trampoline_enter
 kvmppc_trampoline_enter:
 .long kvmppc_handler_trampoline_enter - CONFIG_KERNEL_START

 Alex, can you turn these into 64-bit on ppc64 so the relocator
 can grok them ?
 
 If I turn them into 64-bit, will the values be  RMA? In that case
 things would break anyways. How does relocation work on PPC? Are the
 first few megs copied over to low memory? Would I have to mask anything
 in the above code to make sure I use the real values? 

 Alex

   
 You can still do the subtraction, but you have to allocate 64 bits for
 storage.  Relocatable ppc64 kernels work by adjusting PPC64_RELOC_RELATIVE
 entries during early boot (reloc in reloc_64.S called from head_64.S).

 The code purposely only supports 64 bit relative addressing.
 

 Oh yea, and for book-3s, the code copies from 0x100 to __end_interrupts
 in arch/powerpc/kernel/exceptions-64s.h down to the real 0, but the rest
 of the kernel is at some disjointed address.  The interrupt will go to
 the copy at the real zero.  Any references to code outside that region
 must be done via a full indrect branch (not a relative one), simiar to
 the secondary startup (via following the function pointer in a descriptor
 set in very low memory), or syscall entry and exception vectors via paca.
   

That would still break on normal PPC boxes, as any address accessed in
real mode has to be inside the RMA. And the #include for
kvm/book3s_rmhandlers.S happens after __end_interrupts. So I'd end up
with code that gets executed outside of the RMA after a relocation, right?

Alex


Weither its outside of the RMA or not, DO_KVM is creating a branch outside
of code copied to lowmem.

This is BROKEN.

We have a hard limit that we can't extend _end_interrupts past 0x7000, and
a soft limit that we can't exceed 0x6000.  If there is space, we could
move the real mode handler extensions inside end_interrupts in
exceptions-64s.S, and store the full address in a .quad so it gets
relocated properly.  Don't subtract the start, we have designed the kernel
to run with start at a VA that can be used as a EA in real mode.

Otherwise we need to mark KVM_BOOK3S_64 depends on (!RELOCATABLE ||
BROKEN) for 2.6.35 until we get fixes.

I took a read though the book3s code as of 2.6.34.   A few things I noticed:

(1) The code is using slb large to control the segment size.   It should
be using SLB B field (or just impliment 256M segments only).

(2) It appears that the mtspr and mfspr code is using the same storage for
bats 4-7 as 0-3 ... I would have expected a 4 + a few places.

(3) Its not clear to me that you clear RI when transitioning to the guest
but its obviously required because you place state in srr0  srr1.

(4) I don't understand why __kvmppc_vcpu_run turns on interrupts so that
__kvmppc_vcpu_entry can turn them back off.   Something to do with
irq trace annotations?

milton
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] math-emu: correct test for downshifting fraction in _FP_FROM_INT()

2010-07-20 Thread Martin Schwidefsky
On Tue, 20 Jul 2010 00:12:02 +0200
Mikael Pettersson mi...@it.uu.se wrote:

 Unfortunately it seems difficult to write a generic module
 which uses math-emu:
 - math-emu/soft-fp.h includes asm/sfp-machine.h,
   but only a handful of archs have it
 - asm/sfp-machine.h isn't always self-contained and may depend
   on various $arch-specific declarations being present
 
 The given test module works on sparc64 and ppc64, where it uses
 the kernel's sfp-machine.h, and on x86 where it uses a stub
 sfp-machine.h supplied by itself.  I tried to cross-compile it
 for alpha, but that failed due to its sfp-machine.h not being
 self-contained.  I didn't try sh or s390.

It would be challange to try this on s390. The math emulation code is
only used for really old 31 bit machines. Starting with the G5 the fpu
can do IEEE754, I would say the math emulation code is irrelevant for
s390 by now.

-- 
blue skies,
   Martin.

Reality continues to ruin my life. - Calvin.

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PPC64/Power7 - 2.6.35-rc5] Bad relocation warnings whileBuilding a CONFIG_RELOCATABLE kernel with CONFIG_ISERIES enabled

2010-07-20 Thread Alexander Graf

On 20.07.2010, at 09:27, Milton Miller wrote:

 On Mon, 19 Jul 2010 about 14:00:56 +0200, Alexander Graf wrote:
 Milton Miller wrote:
 I wrote:
 
 Oh yea, and for book-3s, the code copies from 0x100 to __end_interrupts
 in arch/powerpc/kernel/exceptions-64s.h down to the real 0, but the rest
 of the kernel is at some disjointed address.  The interrupt will go to
 the copy at the real zero.  Any references to code outside that region
 must be done via a full indrect branch (not a relative one), simiar to
 the secondary startup (via following the function pointer in a descriptor
 set in very low memory), or syscall entry and exception vectors via paca.
 
 
 That would still break on normal PPC boxes, as any address accessed in
 real mode has to be inside the RMA. And the #include for
 kvm/book3s_rmhandlers.S happens after __end_interrupts. So I'd end up
 with code that gets executed outside of the RMA after a relocation, right?
 
 Alex
 
 
 Weither its outside of the RMA or not, DO_KVM is creating a branch outside
 of code copied to lowmem.
 
 This is BROKEN.
 
 We have a hard limit that we can't extend _end_interrupts past 0x7000, and
 a soft limit that we can't exceed 0x6000.  If there is space, we could
 move the real mode handler extensions inside end_interrupts in
 exceptions-64s.S, and store the full address in a .quad so it gets
 relocated properly.  Don't subtract the start, we have designed the kernel
 to run with start at a VA that can be used as a EA in real mode.

Moving everything to exceptions-64s.S sounds like the best thing to do. All the 
code in real mode really is there so it stays inside the RMA. I don't think we 
can guarantee that for any code that is not copied, right?

 Otherwise we need to mark KVM_BOOK3S_64 depends on (!RELOCATABLE ||
 BROKEN) for 2.6.35 until we get fixes.

Well - it's only broken when really getting relocated. But I agree, the current 
state doesn't cope with Linux's relocation logic.

 I took a read though the book3s code as of 2.6.34.   A few things I noticed:
 
 (1) The code is using slb large to control the segment size.   It should
 be using SLB B field (or just impliment 256M segments only).

I'm not sure I understand this part? We only use 256MB segments for now.

 (2) It appears that the mtspr and mfspr code is using the same storage for
 bats 4-7 as 0-3 ... I would have expected a 4 + a few places.

Yes, that one is fixed in more recent versions already.

 (3) Its not clear to me that you clear RI when transitioning to the guest
 but its obviously required because you place state in srr0  srr1.

Uh - do I have to clear RI? I'm not prepared to take an interrupt anyways and 
RI is just a soft flag for Linux's handlers, right?

 (4) I don't understand why __kvmppc_vcpu_run turns on interrupts so that
 __kvmppc_vcpu_entry can turn them back off.   Something to do with
 irq trace annotations?

__kvmppc_vcpu_run turns on soft interrupts while __kvmppc_vcpu_entry turns them 
off in MSR. This is so that when enabling interrupts again on guest exit, we 
have the soft enable bit set.


Alex

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: Badness with the kernel version 2.6.35-rc1-git1 running on P6 box

2010-07-20 Thread divya

On Friday 16 July 2010 03:26 PM, Eric Dumazet wrote:

Le vendredi 16 juillet 2010 à 14:20 +0530, divya a écrit :
   

Hi ,

With the latest kernel version 2.6.35-rc5-git1(2f7989efd4398) running on 
power(p6) box came across the following
call trace

Call Trace:
[c6a0e800] [c0011c30] .show_stack+0x6c/0x16c (unreliable)
[c6a0e8b0] [c012129c] .__alloc_pages_nodemask+0x6a0/0x75c
[c6a0ea30] [c01527cc] .alloc_pages_current+0xc4/0x104
[c6a0ead0] [c015b1a0] .new_slab+0xe0/0x314
[c6a0eb70] [c015b6fc] .__slab_alloc+0x328/0x644
[c6a0ec50] [c015cc34] .__kmalloc_node_track_caller+0x114/0x194
[c6a0ed00] [c0599f6c] .__alloc_skb+0x94/0x180
[c6a0edb0] [c059af5c] .__netdev_alloc_skb+0x3c/0x74
[c6a0ee30] [c04f9480] .ehea_refill_rq_def+0xf8/0x2d0
[c6a0ef30] [c04fab8c] .ehea_up+0x5b8/0x69c
[c6a0f040] [c04facd4] .ehea_open+0x64/0x118
[c6a0f0e0] [c05a6e9c] .__dev_open+0x100/0x168
[c6a0f170] [c05a3ac0] .__dev_change_flags+0x10c/0x1ac
[c6a0f210] [c05a6d44] .dev_change_flags+0x24/0x7c
[c6a0f2a0] [c05b50b4] .do_setlink+0x31c/0x750
[c6a0f3b0] [c05b6724] .rtnl_newlink+0x388/0x618
[c6a0f5f0] [c05b6350] .rtnetlink_rcv_msg+0x268/0x2b4
[c6a0f6a0] [c05cfdc0] .netlink_rcv_skb+0x74/0x108
[c6a0f730] [c05b60c4] .rtnetlink_rcv+0x38/0x5c
[c6a0f7c0] [c05cf8c8] .netlink_unicast+0x318/0x3f4
[c6a0f890] [c05d05b4] .netlink_sendmsg+0x2d0/0x310
[c6a0f970] [c058e1e8] .sock_sendmsg+0xd4/0x110
[c6a0fb50] [c058e514] .SyS_sendmsg+0x1f4/0x288
[c6a0fd70] [c058c2b8] .SyS_socketcall+0x214/0x280
[c6a0fe30] [c00085b4] syscall_exit+0x0/0x40
Mem-Info:
Node 0 DMA per-cpu:
CPU0: hi:0, btch:   1 usd:   0
CPU1: hi:0, btch:   1 usd:   0
CPU2: hi:0, btch:   1 usd:   0
CPU3: hi:0, btch:   1 usd:   0
active_anon:50 inactive_anon:260 isolated_anon:0
   active_file:159 inactive_file:139 isolated_file:0
   unevictable:0 dirty:2 writeback:1 unstable:0
   free:16 slab_reclaimable:66 slab_unreclaimable:502
   mapped:120 shmem:2 pagetables:37 bounce:0
Node 0 DMA free:1024kB min:1408kB low:1728kB high:2112kB active_anon:3200kB 
inactive_anon:16640kB active_file:10176kB inactive_file:8896kB unevictable:0kB 
isolated(anon):0kB isolated(file):0kB present:130944kB mlocked:0kB dirty:128kB 
writeback:64kB mapped:7680kB shmem:128kB slab_reclaimable:4224kB 
slab_unreclaimable:32128kB kernel_stack:2528kB pagetables:2368kB unstable:0kB 
bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
Node 0 DMA: 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 
0*16384kB = 0kB
496 total pagecache pages
178 pages in swap cache
Swap cache stats: add 780, delete 602, find 467/551
Free swap  = 1027904kB
Total swap = 1044160kB
2048 pages RAM
683 pages reserved
582 pages shared
1075 pages non-shared
SLUB: Unable to allocate memory on node -1 (gfp=0x20)
cache: kmalloc-16384, object size: 16384, buffer size: 16384, default 
order: 2, min order: 0
node 0: slabs: 28, objs: 292, free: 0
ip: page allocation failure. order:0, mode:0x8020
Call Trace:
[c6a0eb40] [c0011c30] .show_stack+0x6c/0x16c (unreliable)
[c6a0ebf0] [c012129c] .__alloc_pages_nodemask+0x6a0/0x75c
[c6a0ed70] [c01527cc] .alloc_pages_current+0xc4/0x104
[c6a0ee10] [c011fca4] .__get_free_pages+0x18/0x90
[c6a0ee90] [c04f7058] .ehea_get_stats+0x4c/0x1bc
[c6a0ef30] [c05a0a04] .dev_get_stats+0x38/0x64
[c6a0efc0] [c05b456c] .rtnl_fill_ifinfo+0x35c/0x85c
[c6a0f150] [c05b5920] .rtmsg_ifinfo+0x164/0x204
[c6a0f210] [c05a6d6c] .dev_change_flags+0x4c/0x7c
[c6a0f2a0] [c05b50b4] .do_setlink+0x31c/0x750
[c6a0f3b0] [c05b6724] .rtnl_newlink+0x388/0x618
[c6a0f5f0] [c05b6350] .rtnetlink_rcv_msg+0x268/0x2b4
[c6a0f6a0] [c05cfdc0] .netlink_rcv_skb+0x74/0x108
[c6a0f730] [c05b60c4] .rtnetlink_rcv+0x38/0x5c
[c6a0f7c0] [c05cf8c8] .netlink_unicast+0x318/0x3f4
[c6a0f890] [c05d05b4] .netlink_sendmsg+0x2d0/0x310
[c6a0f970] [c058e1e8] .sock_sendmsg+0xd4/0x110
[c6a0fb50] [c058e514] .SyS_sendmsg+0x1f4/0x288
[c6a0fd70] [c058c2b8] .SyS_socketcall+0x214/0x280
[c6a0fe30] [c00085b4] syscall_exit+0x0/0x40
Mem-Info:
Node 0 DMA per-cpu:
CPU0: hi:0, btch:   1 usd:   0
CPU1: hi:0, btch:   1 usd:   0
CPU2: hi:0, btch:   1 usd:   0
CPU3: hi:0, btch:   1 usd:   0

The mainline 2.6.35-rc5 worked fine.
 

Maybe you were lucky with 2.6.35-rc5

Anyway ehea should 

Re: [PATCH 2/8] v3 Add new phys_index properties

2010-07-20 Thread Nathan Fontenot
Update the 'phys_index' properties of a memory block to include a
'start_phys_index' which is the same as the current 'phys_index' property.
This also adds an 'end_phys_index' property to indicate the id of the
last section in th memory block.

Patch updated to keep the name of the phys_index property instead of
renaming it to start_phys_index.

Signed-off-by: Nathan Fontenot nf...@austin.ibm.com
---
 drivers/base/memory.c  |   28 
 include/linux/memory.h |3 ++-
 2 files changed, 22 insertions(+), 9 deletions(-)

Index: linux-2.6/drivers/base/memory.c
===
--- linux-2.6.orig/drivers/base/memory.c2010-07-19 20:42:11.0 
-0500
+++ linux-2.6/drivers/base/memory.c 2010-07-20 06:38:21.0 -0500
@@ -109,12 +109,20 @@ unregister_memory(struct memory_block *m
  * uses.
  */
 
-static ssize_t show_mem_phys_index(struct sys_device *dev,
+static ssize_t show_mem_start_phys_index(struct sys_device *dev,
struct sysdev_attribute *attr, char *buf)
 {
struct memory_block *mem =
container_of(dev, struct memory_block, sysdev);
-   return sprintf(buf, %08lx\n, mem-phys_index);
+   return sprintf(buf, %08lx\n, mem-start_phys_index);
+}
+
+static ssize_t show_mem_end_phys_index(struct sys_device *dev,
+   struct sysdev_attribute *attr, char *buf)
+{
+   struct memory_block *mem =
+   container_of(dev, struct memory_block, sysdev);
+   return sprintf(buf, %08lx\n, mem-end_phys_index);
 }
 
 /*
@@ -128,7 +136,7 @@ static ssize_t show_mem_removable(struct
struct memory_block *mem =
container_of(dev, struct memory_block, sysdev);
 
-   start_pfn = section_nr_to_pfn(mem-phys_index);
+   start_pfn = section_nr_to_pfn(mem-start_phys_index);
ret = is_mem_section_removable(start_pfn, PAGES_PER_SECTION);
return sprintf(buf, %d\n, ret);
 }
@@ -191,7 +199,7 @@ memory_block_action(struct memory_block
int ret;
int old_state = mem-state;
 
-   psection = mem-phys_index;
+   psection = mem-start_phys_index;
first_page = pfn_to_page(psection  PFN_SECTION_SHIFT);
 
/*
@@ -264,7 +272,7 @@ store_mem_state(struct sys_device *dev,
int ret = -EINVAL;
 
mem = container_of(dev, struct memory_block, sysdev);
-   phys_section_nr = mem-phys_index;
+   phys_section_nr = mem-start_phys_index;
 
if (!present_section_nr(phys_section_nr))
goto out;
@@ -296,7 +304,8 @@ static ssize_t show_phys_device(struct s
return sprintf(buf, %d\n, mem-phys_device);
 }
 
-static SYSDEV_ATTR(phys_index, 0444, show_mem_phys_index, NULL);
+static SYSDEV_ATTR(phys_index, 0444, show_mem_start_phys_index, NULL);
+static SYSDEV_ATTR(end_phys_index, 0444, show_mem_end_phys_index, NULL);
 static SYSDEV_ATTR(state, 0644, show_mem_state, store_mem_state);
 static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL);
 static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL);
@@ -476,16 +485,18 @@ static int add_memory_block(int nid, str
if (!mem)
return -ENOMEM;
 
-   mem-phys_index = __section_nr(section);
+   mem-start_phys_index = __section_nr(section);
mem-state = state;
mutex_init(mem-state_mutex);
-   start_pfn = section_nr_to_pfn(mem-phys_index);
+   start_pfn = section_nr_to_pfn(mem-start_phys_index);
mem-phys_device = arch_get_memory_phys_device(start_pfn);
 
ret = register_memory(mem, section);
if (!ret)
ret = mem_create_simple_file(mem, phys_index);
if (!ret)
+   ret = mem_create_simple_file(mem, end_phys_index);
+   if (!ret)
ret = mem_create_simple_file(mem, state);
if (!ret)
ret = mem_create_simple_file(mem, phys_device);
@@ -507,6 +518,7 @@ int remove_memory_block(unsigned long no
mem = find_memory_block(section);
unregister_mem_sect_under_nodes(mem);
mem_remove_simple_file(mem, phys_index);
+   mem_remove_simple_file(mem, end_phys_index);
mem_remove_simple_file(mem, state);
mem_remove_simple_file(mem, phys_device);
mem_remove_simple_file(mem, removable);
Index: linux-2.6/include/linux/memory.h
===
--- linux-2.6.orig/include/linux/memory.h   2010-07-19 20:42:11.0 
-0500
+++ linux-2.6/include/linux/memory.h2010-07-20 06:35:38.0 -0500
@@ -21,7 +21,8 @@
 #include linux/mutex.h
 
 struct memory_block {
-   unsigned long phys_index;
+   unsigned long start_phys_index;
+   unsigned long end_phys_index;
unsigned long state;
/*
 * This serializes all state change requests.  It isn't
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org

Re: [PATCH 3/8] v3 Add section count to memory_block

2010-07-20 Thread Nathan Fontenot
Add a section count property to the memory_block struct to track the number
of memory sections that have been added/removed from a memory block.  Updated
to use atomic_dec_and_test().

Signed-off-by: Nathan Fontenot nf...@asutin.ibm.com
---
 drivers/base/memory.c  |   18 +++---
 include/linux/memory.h |2 ++
 2 files changed, 13 insertions(+), 7 deletions(-)

Index: linux-2.6/drivers/base/memory.c
===
--- linux-2.6.orig/drivers/base/memory.c2010-07-20 06:38:21.0 
-0500
+++ linux-2.6/drivers/base/memory.c 2010-07-20 06:43:29.0 -0500
@@ -487,6 +487,7 @@ static int add_memory_block(int nid, str
 
mem-start_phys_index = __section_nr(section);
mem-state = state;
+   atomic_inc(mem-section_count);
mutex_init(mem-state_mutex);
start_pfn = section_nr_to_pfn(mem-start_phys_index);
mem-phys_device = arch_get_memory_phys_device(start_pfn);
@@ -516,13 +517,16 @@ int remove_memory_block(unsigned long no
struct memory_block *mem;
 
mem = find_memory_block(section);
-   unregister_mem_sect_under_nodes(mem);
-   mem_remove_simple_file(mem, phys_index);
-   mem_remove_simple_file(mem, end_phys_index);
-   mem_remove_simple_file(mem, state);
-   mem_remove_simple_file(mem, phys_device);
-   mem_remove_simple_file(mem, removable);
-   unregister_memory(mem, section);
+
+   if (atomic_dec_and_test(mem-section_count)) {
+   unregister_mem_sect_under_nodes(mem);
+   mem_remove_simple_file(mem, phys_index);
+   mem_remove_simple_file(mem, end_phys_index);
+   mem_remove_simple_file(mem, state);
+   mem_remove_simple_file(mem, phys_device);
+   mem_remove_simple_file(mem, removable);
+   unregister_memory(mem, section);
+   }
 
return 0;
 }
Index: linux-2.6/include/linux/memory.h
===
--- linux-2.6.orig/include/linux/memory.h   2010-07-20 06:35:38.0 
-0500
+++ linux-2.6/include/linux/memory.h2010-07-20 06:38:59.0 -0500
@@ -19,11 +19,13 @@
 #include linux/node.h
 #include linux/compiler.h
 #include linux/mutex.h
+#include asm/atomic.h
 
 struct memory_block {
unsigned long start_phys_index;
unsigned long end_phys_index;
unsigned long state;
+   atomic_t section_count;
/*
 * This serializes all state change requests.  It isn't
 * held during creation because the control files are


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 4/8] v3 Allow memory_block to span multiple memory sections

2010-07-20 Thread Nathan Fontenot
Update the memory sysfs code that each sysfs memory directory is now
considered a memory block that can contain multiple memory sections per
memory block.  The default size of each memory block is SECTION_SIZE_BITS
to maintain the current behavior of having a single memory section per
memory block (i.e. one sysfs directory per memory section).

For architectures that want to have memory blocks span multiple
memory sections they need only define their own memory_block_size_bytes()
routine.

Patch refreshed to apply cleanly with previous two patch updates.

Signed-off-by: Nathan Fontenot nf...@austin.ibm.com
---
 drivers/base/memory.c |  141 ++
 1 file changed, 98 insertions(+), 43 deletions(-)

Index: linux-2.6/drivers/base/memory.c
===
--- linux-2.6.orig/drivers/base/memory.c2010-07-20 06:43:29.0 
-0500
+++ linux-2.6/drivers/base/memory.c 2010-07-20 06:44:30.0 -0500
@@ -28,6 +28,14 @@
 #include asm/uaccess.h
 
 #define MEMORY_CLASS_NAME  memory
+#define MIN_MEMORY_BLOCK_SIZE  (1  SECTION_SIZE_BITS)
+
+static int sections_per_block;
+
+static inline int base_memory_block_id(int section_nr)
+{
+   return (section_nr / sections_per_block) * sections_per_block;
+}
 
 static struct sysdev_class memory_sysdev_class = {
.name = MEMORY_CLASS_NAME,
@@ -82,22 +90,21 @@ EXPORT_SYMBOL(unregister_memory_isolate_
  * register_memory - Setup a sysfs device for a memory block
  */
 static
-int register_memory(struct memory_block *memory, struct mem_section *section)
+int register_memory(struct memory_block *memory)
 {
int error;
 
memory-sysdev.cls = memory_sysdev_class;
-   memory-sysdev.id = __section_nr(section);
+   memory-sysdev.id = memory-start_phys_index;
 
error = sysdev_register(memory-sysdev);
return error;
 }
 
 static void
-unregister_memory(struct memory_block *memory, struct mem_section *section)
+unregister_memory(struct memory_block *memory)
 {
BUG_ON(memory-sysdev.cls != memory_sysdev_class);
-   BUG_ON(memory-sysdev.id != __section_nr(section));
 
/* drop the ref. we got in remove_memory_block() */
kobject_put(memory-sysdev.kobj);
@@ -131,13 +138,16 @@ static ssize_t show_mem_end_phys_index(s
 static ssize_t show_mem_removable(struct sys_device *dev,
struct sysdev_attribute *attr, char *buf)
 {
-   unsigned long start_pfn;
-   int ret;
+   unsigned long i, pfn;
+   int ret = 1;
struct memory_block *mem =
container_of(dev, struct memory_block, sysdev);
 
-   start_pfn = section_nr_to_pfn(mem-start_phys_index);
-   ret = is_mem_section_removable(start_pfn, PAGES_PER_SECTION);
+   for (i = mem-start_phys_index; i = mem-end_phys_index; i++) {
+   pfn = section_nr_to_pfn(i);
+   ret = is_mem_section_removable(pfn, PAGES_PER_SECTION);
+   }
+
return sprintf(buf, %d\n, ret);
 }
 
@@ -190,17 +200,14 @@ int memory_isolate_notify(unsigned long
  * OK to have direct references to sparsemem variables in here.
  */
 static int
-memory_block_action(struct memory_block *mem, unsigned long action)
+memory_section_action(unsigned long phys_index, unsigned long action)
 {
int i;
-   unsigned long psection;
unsigned long start_pfn, start_paddr;
struct page *first_page;
int ret;
-   int old_state = mem-state;
 
-   psection = mem-start_phys_index;
-   first_page = pfn_to_page(psection  PFN_SECTION_SHIFT);
+   first_page = pfn_to_page(phys_index  PFN_SECTION_SHIFT);
 
/*
 * The probe routines leave the pages reserved, just
@@ -213,8 +220,8 @@ memory_block_action(struct memory_block
continue;
 
printk(KERN_WARNING section number %ld page number %d 
-   not reserved, was it already online? \n,
-   psection, i);
+   not reserved, was it already online?\n,
+   phys_index, i);
return -EBUSY;
}
}
@@ -225,18 +232,13 @@ memory_block_action(struct memory_block
ret = online_pages(start_pfn, PAGES_PER_SECTION);
break;
case MEM_OFFLINE:
-   mem-state = MEM_GOING_OFFLINE;
start_paddr = page_to_pfn(first_page)  PAGE_SHIFT;
ret = remove_memory(start_paddr,
PAGES_PER_SECTION  PAGE_SHIFT);
-   if (ret) {
-   mem-state = old_state;
-   break;
-   }
break;
default:
-   WARN(1, KERN_WARNING %s(%p, %ld) 

Re: [PATCH] math-emu: correct test for downshifting fraction in _FP_FROM_INT()

2010-07-20 Thread Mikael Pettersson
Mikael Pettersson writes:
  The kernel's math-emu code contains a macro _FP_FROM_INT() which is
  used to convert an integer to a raw normalized floating-point value.
  It does this basically in three steps:
  
  1. Compute the exponent from the number of leading zero bits.
  2. Downshift large fractions to put the MSB in the right position
 for normalized fractions.
  3. Upshift small fractions to put the MSB in the right position.
  
  There is an boundary error in step 2, causing a fraction with its
  MSB exactly one bit above the normalized MSB position to not be
  downshifted.  This results in a non-normalized raw float, which when
  packed becomes a massively inaccurate representation for that input.
  
  The impact of this depends on a number of arch-specific factors,
  but it is known to have broken emulation of FXTOD instructions
  on UltraSPARC III, which was originally reported as GCC bug 44631
  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44631.
  
  Any arch which uses math-emu to emulate conversions from integers to
  same-size floats may be affected.
  
  The fix is simple: the exponent comparison used to determine if the
  fraction should be downshifted must be = not .
  
  I'm sending a kernel module to test this as a reply to this message.
  There are also SPARC user-space test cases in the GCC bug entry.
  
  Signed-off-by: Mikael Pettersson mi...@it.uu.se

I forgot to mention that this needs to be backported to older kernels,
so can the maintainer who picks this up please add

Cc: sta...@kernel.org

Thanks,

/Mikael

  ---
   include/math-emu/op-common.h |2 +-
   1 file changed, 1 insertion(+), 1 deletion(-)
  
  diff -rupN linux-2.6.35-rc5/include/math-emu/op-common.h 
  linux-2.6.35-rc5.mathemu-FP_FROM_INT-fraction-downshift-condition/include/math-emu/op-common.h
  --- linux-2.6.35-rc5/include/math-emu/op-common.h2010-05-17 
  19:51:32.0 +0200
  +++ 
  linux-2.6.35-rc5.mathemu-FP_FROM_INT-fraction-downshift-condition/include/math-emu/op-common.h
 2010-07-18 22:33:46.0 +0200
  @@ -799,7 +799,7 @@ do { 
  \
   X##_e -= (_FP_W_TYPE_SIZE - rsize); \
   X##_e = rsize - X##_e - 1;  \
   \
  -if (_FP_FRACBITS_##fs  rsize  _FP_WFRACBITS_##fs  X##_e)\
  +if (_FP_FRACBITS_##fs  rsize  _FP_WFRACBITS_##fs = X##_e)   \
 __FP_FRAC_SRS_1(ur_, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);\
   _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);   \
   if ((_FP_WFRACBITS_##fs - X##_e - 1)  0)   \
  --
  To unsubscribe from this list: send the line unsubscribe linux-kernel in
  the body of a message to majord...@vger.kernel.org
  More majordomo info at  http://vger.kernel.org/majordomo-info.html
  Please read the FAQ at  http://www.tux.org/lkml/
  
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [lm-sensors] [PATCH] hwmon: (tmp421) Add nfactor support (2nd attempt)

2010-07-20 Thread Andre Prendel
On Thu, May 20, 2010 at 09:35:56PM +0200, Andre Prendel wrote:
 On Thu, May 20, 2010 at 03:07:05PM -0400, Jeff Angielski wrote:
  In any event, here it is again:
 
 Acked-by: Andre Prendel andre.pren...@gmx.de

Hi Jeff,

I'de suggest to resend the patch with my acked-by to the lm-sensors list and
Andrew Morton. It looks like Jean is too busy at the moment.

Regards,
Andre
 
  
  From 9acd29ff48c64e58a7f5cdb888c86e737c56281c Mon Sep 17 00:00:00 2001
  From: Jeff Angielski j...@theptrgroup.com
  Date: Mon, 10 May 2010 10:26:34 -0400
  Subject: [PATCH] hwmon: (tmp421) Add nfactor support
  
  Add support for reading and writing the n-factor correction
  registers.  This is needed to compensate for the characteristics
  of a particular sensor hanging off of the remote channels.
  
  Signed-off-by: Jeff Angielski j...@theptrgroup.com
  ---
   Documentation/hwmon/tmp421 |   19 +++
   drivers/hwmon/tmp421.c |   41 +
   2 files changed, 60 insertions(+), 0 deletions(-)
  
  diff --git a/Documentation/hwmon/tmp421 b/Documentation/hwmon/tmp421
  index 0cf07f8..668228a 100644
  --- a/Documentation/hwmon/tmp421
  +++ b/Documentation/hwmon/tmp421
  @@ -17,6 +17,7 @@ Supported chips:
   
   Authors:
  Andre Prendel andre.pren...@gmx.de
  +   Jeff Angielski j...@theptrgroup.com
   
   Description
   ---
  @@ -34,3 +35,21 @@ the temperature values via the following sysfs files:
   
   temp[1-4]_input
   temp[2-4]_fault
  +
  +The chips allow the user to adjust the n-factor value that is used
  +when converting the remote channel measurements to temperature. The
  +adjustment has a range of -128 to +127 that yields an effective
  +n-factor range of 0.706542 to 1.747977.  The power on reset value
  +for the adjustment is 0 which results in an n-factor of 1.008.
  +
  +The effective n-factor is calculated according to the following
  +equation:
  +
  +n_factor = (1.008 * 300) / (300 - nfactor_adjust)
  +
  +The driver exports the n-factor adjustment value via the following 
  +sysfs files:
  +
  +temp[2-4]_n_adjust
  +
  +
  diff --git a/drivers/hwmon/tmp421.c b/drivers/hwmon/tmp421.c
  index 738c472..dfd62be 100644
  --- a/drivers/hwmon/tmp421.c
  +++ b/drivers/hwmon/tmp421.c
  @@ -49,6 +49,7 @@ enum chips { tmp421, tmp422, tmp423 };
   
   static const u8 TMP421_TEMP_MSB[4] = { 0x00, 0x01, 0x02, 0x03 };
   static const u8 TMP421_TEMP_LSB[4] = { 0x10, 0x11, 0x12, 0x13 };
  +static const u8 TMP421_N_CORRECT[3]= { 0x21, 0x22, 0x23 };
   
   /* Flags */
   #define TMP421_CONFIG_SHUTDOWN 0x40
  @@ -76,6 +77,7 @@ struct tmp421_data {
  int channels;
  u8 config;
  s16 temp[4];
  +   s8 n_adjust[3];
   };
   
   static int temp_from_s16(s16 reg)
  @@ -115,6 +117,10 @@ static struct tmp421_data *tmp421_update_device(struct 
  device *dev)
  data-temp[i] |= i2c_smbus_read_byte_data(client,
  TMP421_TEMP_LSB[i]);
  }
  +   for (i = 1; i  data-channels; i++) {
  +   data-n_adjust[i - 1] = i2c_smbus_read_byte_data(client,
  +   TMP421_N_CORRECT[i - 1]);
  +   }
  data-last_updated = jiffies;
  data-valid = 1;
  }
  @@ -157,6 +163,32 @@ static ssize_t show_fault(struct device *dev,
  return sprintf(buf, 0\n);
   }
   
  +static ssize_t show_n_adjust(struct device *dev,
  +struct device_attribute *devattr, char *buf)
  +{
  +   int index = to_sensor_dev_attr(devattr)-index;
  +   struct tmp421_data *data = tmp421_update_device(dev);
  +
  +   return sprintf(buf, %d\n, data-n_adjust[index - 1]);
  +}
  +
  +static ssize_t set_n_adjust(struct device *dev,
  +   struct device_attribute *devattr,
  +   const char *buf, size_t count)
  +{
  +   struct i2c_client *client = to_i2c_client(dev);
  +   struct tmp421_data *data = i2c_get_clientdata(client);
  +   int index = to_sensor_dev_attr(devattr)-index;
  +   int n_adjust = simple_strtol(buf, NULL, 10);
  +
  +   mutex_lock(data-update_lock);
  +   i2c_smbus_write_byte_data(client, TMP421_N_CORRECT[index - 1],
  + SENSORS_LIMIT(n_adjust, -128, 127));
  +   mutex_unlock(data-update_lock);
  +
  +   return count;
  +}
  +
   static mode_t tmp421_is_visible(struct kobject *kobj, struct attribute *a,
  int n)
   {
  @@ -177,19 +209,28 @@ static mode_t tmp421_is_visible(struct kobject *kobj, 
  struct attribute *a,
   static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_value, NULL, 0);
   static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp_value, NULL, 1);
   static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_fault, NULL, 1);
  +static SENSOR_DEVICE_ATTR(temp2_n_adjust, S_IRUSR | S_IWUSR | S_IRGRP,
  + show_n_adjust, set_n_adjust, 1);
   static 

Re: [PATCH 2/8] v3 Add new phys_index properties

2010-07-20 Thread Dave Hansen
On Tue, 2010-07-20 at 08:24 -0500, Nathan Fontenot wrote:
 Update the 'phys_index' properties of a memory block to include a
 'start_phys_index' which is the same as the current 'phys_index' property.
 This also adds an 'end_phys_index' property to indicate the id of the
 last section in th memory block.
 
 Patch updated to keep the name of the phys_index property instead of
 renaming it to start_phys_index.

KAME is right on this.  We should keep the old one if at all possible.  

The only other thing we might want to do is move 'phys_index' to
'start_phys_index', and make a new 'phys_index' that does a WARN_ONCE(),
gives a deprecated warning, then calls the new 'start_phys_index' code.

So, basically make the new, more clear name, but keep the old one for a
while and deprecate it.  Maybe we could get away with removing it in ten
years. :)

-- Dave

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 4/8] v3 Allow memory_block to span multiple memory sections

2010-07-20 Thread Dave Hansen
On Mon, 2010-07-19 at 22:55 -0500, Nathan Fontenot wrote:
 +static int add_memory_section(int nid, struct mem_section *section,
 +   unsigned long state, enum mem_add_context context)
 +{
 +   struct memory_block *mem;
 +   int ret = 0;
 +
 +   mem = find_memory_block(section);
 +   if (mem) {
 +   atomic_inc(mem-section_count);
 +   kobject_put(mem-sysdev.kobj);
 +   } else
 +   ret = init_memory_block(mem, section, state);
 +
 if (!ret) {
 -   if (context == HOTPLUG)
 +   if (context == HOTPLUG 
 +   atomic_read(mem-section_count) == sections_per_block)
 ret = register_mem_sect_under_node(mem, nid);
 } 

I think the atomic_inc() can race with the atomic_dec_and_test() in
remove_memory_block().

Thread 1 does:

mem = find_memory_block(section);

Thread 2 does 

atomic_dec_and_test(mem-section_count);

and destroys the memory block,  Thread 1 runs again:

   if (mem) {
   atomic_inc(mem-section_count);
   kobject_put(mem-sysdev.kobj);
   } else

but now mem got destroyed by Thread 2.  You probably need to change
find_memory_block() to itself take a reference, and to use
atomic_inc_unless().

-- Dave

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 4/8] v3 Allow memory_block to span multiple memory sections

2010-07-20 Thread Dave Hansen
On Mon, 2010-07-19 at 22:55 -0500, Nathan Fontenot wrote:
 +static u32 get_memory_block_size(void)
 +{
 +   u32 block_sz;
 +
 +   block_sz = memory_block_size_bytes();
 +
 +   /* Validate blk_sz is a power of 2 and not less than section size */
 +   if ((block_sz  (block_sz - 1)) || (block_sz  MIN_MEMORY_BLOCK_SIZE))
 +   block_sz = MIN_MEMORY_BLOCK_SIZE;

Is this worth a WARN_ON()?  Seems pretty bogus if someone is returning
funky block sizes.  

-- Dave

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 8/8] v3 Update memory-hotplug documentation

2010-07-20 Thread Dave Hansen
On Mon, 2010-07-19 at 22:59 -0500, Nathan Fontenot wrote:
 
 
 -Now, XXX is defined as start_address_of_section / section_size.
 +Now, XXX is defined as (start_address_of_section / section_size) of
 the first
 +section conatined in the memory block.
 
  For example, assume 1GiB section size. A device for a memory starting
 at
  0x1 is /sys/device/system/memory/memory4
  (0x1 / 1Gib = 4)
  This device covers address range [0x1 ... 0x14000)
 
 -Under each section, you can see 4 files.
 +Under each section, you can see 5 files.
 
 -/sys/devices/system/memory/memoryXXX/phys_index
 +/sys/devices/system/memory/memoryXXX/start_phys_index
 +/sys/devices/system/memory/memoryXXX/end_phys_index 

Just wanted to make sure you didn't forget to update this after KAME's
comments on the first couple of patches.


-- Dave

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


RT Kernel crash in SMP mode on Marvell board

2010-07-20 Thread Manikandan Ramachandran
Hello All,

   I'm trying to bring up a Marvell board [db644xx] with dual CPU[7447A]
with kernel 2.6.33.5-rt23[Ingo's RT patch]. For conveniance I have
registered IPI interrupt with IRQF_NODELAY flag, all other interrupts are
threaded. I'm able to boot up the system fine, however after few hours I see
random kernel crash in Marvell's PIC module. I understand that the RT kernel
doesn't like the way spinlock is used, I tried to convert to raw_spin_lock,
but the system would get frozen. I can make the system stable by just not
using any locks, but thats not an ideal solution. Can someone please suggest
a better locking mechanism? Crash dump I have given below:

NIP:  LR: 70030258 CTR: 
REGS: deeebcf0 TRAP: 0400   Tainted: P(2.6.33.5-rt23)
MSR: 40001032 ME,IR,DR  CR: 24004024  XER: 2004
TASK = df915240[788] 'irq/74-ide0' THREAD: deeea000 CPU: 1
GPR00: 70030390 deeebda0 df915240 72e17ac0 703683f8 0001 
645d28e8
GPR08:    0005 46f0b20f  00fe4600
007fff00
GPR16: 0400 003d4ba2 007ffeb0 0080 00ff690c 0340 00f7eba2
deeebf6c
GPR24: 0001   deeea000 72e17ac0  703683f8
703683f8
NIP [] (null)
LR [70030258] enqueue_task+0x3c/0x58
Call Trace:
[deeebda0] [001e] 0x1e (unreliable)
[deeebdb0] [70030390] activate_task+0x40/0x60
[deeebdc0] [70036850] try_to_wake_up+0x248/0x334
[deeebe00] [70069380] wakeup_next_waiter+0x148/0x14c
[deeebe20] [7029b1d4] rt_spin_lock_slowunlock+0x60/0x84
[deeebe30] [7001a168] marvell_disable_IPI_irq+0xfc/0x110
[deeebe50] [70073934] handle_level_irq+0x40/0x15c
[deeebe70] [70006418] do_IRQ+0xc8/0xf4
[deeebe90] [7001276c] ret_from_except+0x0/0x14
--- Exception: 501 at schedule+0x30/0x50
LR = schedule+0x24/0x50
[deeebf60] [700717bc] irq_thread+0x98/0x230
[deeebfa0] [7005686c] kthread+0x78/0x7c
[deeebff0] [70011ef4] kernel_thread+0x4c/0x68
Instruction dump:
       
       
Kernel panic - not syncing: Fatal exception in interrupt
Call Trace:
[deeebc20
-

IRQ CONFIGs:

CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
# CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK is not set
CONFIG_IRQ_PER_CPU=y
CONFIG_NR_IRQS=512
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y

-- 
Thanks,
Manik

Think twice about a tree before you take a printout
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH v2 4/7] Update Elf-ppc to support crash kernel and misc fixes

2010-07-20 Thread Matthew McClintock
Use current command line if none given, specifically useful for
when arguments are added causing the use of the current cmdline
to not occur

We also try to load the dtb above the kernel, this is useful for
relocatable kernels where they device tree needs to reside just
above the kernel base address

Set the kernel entry address in the relocatable purgatory code
so we jump to the correct start address if not the default. Useful
for relocatable kernels

Signed-off-by: Matthew McClintock m...@freescale.com
---
 kexec/arch/ppc/kexec-elf-ppc.c |   26 ++
 kexec/arch/ppc/kexec-ppc.c |7 ---
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c
index ab2d343..87e6507 100644
--- a/kexec/arch/ppc/kexec-elf-ppc.c
+++ b/kexec/arch/ppc/kexec-elf-ppc.c
@@ -182,6 +182,7 @@ int elf_ppc_load(int argc, char **argv, const char 
*buf, off_t len,
int target_is_gamecube = 0;
unsigned int addr;
unsigned long dtb_addr;
+   unsigned long kernel_addr;
 #endif
 #define FIXUP_ENTRYS   (20)
char *fixup_nodes[FIXUP_ENTRYS + 1];
@@ -228,6 +229,9 @@ int elf_ppc_load(int argc, char **argv, const char 
*buf, off_t len,
command_line_len = 0;
if (command_line) {
command_line_len = strlen(command_line) + 1;
+   } else {
+   command_line = get_command_line();
+   command_line_len = strlen(command_line) + 1;
}
 
fixup_nodes[cur_fixup] = NULL;
@@ -264,11 +268,11 @@ int elf_ppc_load(int argc, char **argv,   const char 
*buf, off_t len,
if (size  phdr-p_memsz)
size = phdr-p_memsz;
 
-   hole_addr = locate_hole(info, size, 0, 0, max_addr, 1);
+   kernel_addr = locate_hole(info, size, 0, 0, max_addr, 1);
 #ifdef CONFIG_PPC64
-   ehdr.e_phdr[0].p_paddr = (Elf64_Addr)hole_addr;
+   ehdr.e_phdr[0].p_paddr = (Elf64_Addr)kernel_addr;
 #else
-   ehdr.e_phdr[0].p_paddr = hole_addr;
+   ehdr.e_phdr[0].p_paddr = kernel_addr;
 #endif
 
/* Load the Elf data */
@@ -343,10 +347,11 @@ int elf_ppc_load(int argc, char **argv,   const char 
*buf, off_t len,
blob_buf = slurp_file(dtb, blob_size);
if (!blob_buf || !blob_size)
die(Device tree seems to be an empty file.\n);
+
blob_buf = fixup_dtb_nodes(blob_buf, blob_size, fixup_nodes,
cmdline_buf);
-   dtb_addr = add_buffer(info, blob_buf, blob_size, blob_size, 0, 
0,
-   KERNEL_ACCESS_TOP, -1);
+   dtb_addr = add_buffer(info, blob_buf, blob_size, blob_size, 0, 
kernel_addr,
+   kernel_addr + KERNEL_ACCESS_TOP, -1);
} else {
/* create from fs2dt */
seg_buf = NULL;
@@ -364,19 +369,16 @@ int elf_ppc_load(int argc, char **argv,   const char 
*buf, off_t len,
 
 
if (dtb) {
-   /* set various variables for the purgatory */
-   addr = ehdr.e_entry;
+   /* set various variables for the purgatory  ehdr.e_entry is a
+* virtual address, we can use kernel_addr which
+* should be the physical start address of the kernel */
+   addr = kernel_addr;
elf_rel_set_symbol(info-rhdr, kernel, addr, sizeof(addr));
 
addr = dtb_addr;
elf_rel_set_symbol(info-rhdr, dt_offset,
addr, sizeof(addr));
 
-   addr = rmo_top;
-
-   elf_rel_set_symbol(info-rhdr, mem_size,
-   addr, sizeof(addr));
-
 #define PUL_STACK_SIZE (16 * 1024)
addr = locate_hole(info, PUL_STACK_SIZE, 0, 0,
elf_max_addr(ehdr), 1);
diff --git a/kexec/arch/ppc/kexec-ppc.c b/kexec/arch/ppc/kexec-ppc.c
index d7afad6..d9f1d05 100644
--- a/kexec/arch/ppc/kexec-ppc.c
+++ b/kexec/arch/ppc/kexec-ppc.c
@@ -27,9 +27,10 @@
 #include config.h
 
 uint64_t rmo_top;
-unsigned long long crash_base, crash_size;
-unsigned long long initrd_base, initrd_size;
-unsigned long long devicetree_base, devicetree_size;
+unsigned long long crash_base = 0, crash_size = 0;
+unsigned long long initrd_base = 0, initrd_size = 0;
+unsigned long long ramdisk_base = 0, ramdisk_size = 0;
+unsigned long long devicetree_base = 0, devicetree_size = 0;
 unsigned int rtas_base, rtas_size;
 int max_memory_ranges;
 
-- 
1.6.0.6


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v2 3/7] Update uImage to support crash kernel and misc fixes

2010-07-20 Thread Matthew McClintock
Use current command line if none given, specifically useful for
when arguments are added causing the use of the current cmdline
to not occur.

We also try to load the dtb above the kernel, this is useful for
relocatable kernels where they device tree needs to reside just
above the kernel base address.

Only allocate 1 MiB extra for bss space after kernel as it appears
to be more than adequate.

Signed-off-by: Matthew McClintock m...@freescale.com
---
 kexec/arch/ppc/kexec-uImage-ppc.c |   32 ++--
 1 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/kexec/arch/ppc/kexec-uImage-ppc.c 
b/kexec/arch/ppc/kexec-uImage-ppc.c
index 4a8d28d..21a7c1b 100644
--- a/kexec/arch/ppc/kexec-uImage-ppc.c
+++ b/kexec/arch/ppc/kexec-uImage-ppc.c
@@ -10,6 +10,7 @@
 #include getopt.h
 #include arch/options.h
 #include ../../kexec.h
+#include ../../kexec-syscall.h
 #include kexec-ppc.h
 #include fixup_dtb.h
 #include kexec-uImage.h
@@ -45,7 +46,7 @@ static int ppc_load_bare_bits(int argc, char **argv, const 
char *buf,
off_t len, struct kexec_info *info, unsigned int load_addr,
unsigned int ep)
 {
-   char *command_line;
+   char *command_line, *cmdline_buf;
int command_line_len;
char *dtb;
unsigned int addr;
@@ -56,6 +57,7 @@ static int ppc_load_bare_bits(int argc, char **argv, const 
char *buf,
int opt;
int ret;
 
+   cmdline_buf = NULL;
command_line = NULL;
dtb = NULL;
 
@@ -89,24 +91,34 @@ static int ppc_load_bare_bits(int argc, char **argv, const 
char *buf,
}
 
command_line_len = 0;
-   if (command_line)
+   if (command_line) {
+   command_line_len = strlen(command_line) + 1;
+   } else {
+   command_line = get_command_line();
command_line_len = strlen(command_line) + 1;
+   }
 
fixup_nodes[cur_fixup] = NULL;
 
/*
 * len contains the length of the whole kernel image except the bss
-* section. The 3 MiB should cover it. The purgatory and the dtb are
+* section. The 1 MiB should cover it. The purgatory and the dtb are
 * allocated from memtop down towards zero so we should never get too
 * close to the bss :)
 */
-   ret = valid_memory_range(info, load_addr, len + 3 * 1024 * 1024);
+   ret = valid_memory_range(info, load_addr, load_addr + (len + (1 * 1024 
* 1024)));
if (!ret) {
printf(Can't add kernel to addr 0x%08x len %ld\n,
-   load_addr, len + 3 * 1024 * 1024);
+   load_addr, len + (1 * 1024 * 1024));
return -1;
}
-   add_segment(info, buf, len, load_addr, len + 3 * 1024 * 1024);
+   add_segment(info, buf, len, load_addr, len + (1 * 1024 * 1024));
+
+   cmdline_buf = xmalloc(COMMAND_LINE_SIZE);
+   memset((void *)cmdline_buf, 0, COMMAND_LINE_SIZE);
+   if (command_line)
+   strncat(cmdline_buf, command_line, command_line_len);
+
if (dtb) {
char *blob_buf;
off_t blob_size = 0;
@@ -115,10 +127,9 @@ static int ppc_load_bare_bits(int argc, char **argv, const 
char *buf,
blob_buf = slurp_file(dtb, blob_size);
if (!blob_buf || !blob_size)
die(Device tree seems to be an empty file.\n);
-   blob_buf = fixup_dtb_nodes(blob_buf, blob_size, fixup_nodes, 
command_line);
-
-   dtb_addr = add_buffer(info, blob_buf, blob_size, blob_size, 0, 
0,
-   KERNEL_ACCESS_TOP, -1);
+   blob_buf = fixup_dtb_nodes(blob_buf, blob_size, fixup_nodes, 
cmdline_buf);
+   dtb_addr = add_buffer(info, blob_buf, blob_size, blob_size, 0, 
load_addr,
+   load_addr + KERNEL_ACCESS_TOP, -1);
} else {
dtb_addr = 0;
}
@@ -142,6 +153,7 @@ static int ppc_load_bare_bits(int argc, char **argv, const 
char *buf,
 
addr = elf_rel_get_addr(info-rhdr, purgatory_start);
info-entry = (void *)addr;
+
return 0;
 }
 
-- 
1.6.0.6


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v2 7/7] Add documentation/howto for mpc85xx systems

2010-07-20 Thread Matthew McClintock
Signed-off-by: Matthew McClintock m...@freescale.com
---
 doc/mpc85xx.txt |  190 +++
 1 files changed, 190 insertions(+), 0 deletions(-)
 create mode 100644 doc/mpc85xx.txt

diff --git a/doc/mpc85xx.txt b/doc/mpc85xx.txt
new file mode 100644
index 000..af96841
--- /dev/null
+++ b/doc/mpc85xx.txt
@@ -0,0 +1,190 @@
+ mpc85xx kexec howto
+ ---
+
+ Matthew McClintock m...@freescale.com
+   Last Updated: 2010-07-20
+
+There is some terminology that will be useful which will be described here.
+
+boot kernel - the first one that you start, from u-boot for instance
+kexec kernel - the kernel that you reboot into when running kexec -e
+kdump kernel - the kernel that you reboot into after the boot kernel crash
+relocatable kernel - kernel that can boot from a 256MB alignment of physical
+memory (for mpc85xx systems at least)
+
+Each of the above types of kernels have specific requirements, they can
+all be different kernels or all the same kernel depending on your
+particular requirements.
+
+1) Build kernel for kexec (i.e. running kexec -e to reboot)
+
+This case is the simplest. You need to enable CONFIG_KEXEC for kexec for the
+boot kernel, the kexec kernel can be a any kernel that already boots on your
+platform. However, if you want to be able run kexec again after rebooting once
+you will need to have CONFIG_KEXEC enabled for the kexec kernel as well.
+   
+2) Build for kdump (i.e. for rebooting when your main kernel crashes)
+
+In this situation, you need to be aware that the kdump kernel will boot from
+a different physical address than your boot kernel (or even the kexec kernel). 
+There are two approaches to this. First, you can build a relocatable kernel
+which will boot from a different physical address with no changes. This method
+is ideal as it would even allow your boot kernel and kdump kernel to be the
+same one. Optionally, you can build a kernel with custom physical address and
+kernel base address according to where you will load the kdump kernel*, but
+it's much easier to just use a relocatable kernel and let things work
+themselves out at run time.
+
+You will need to enable CONFIG_CRASH_DUMP on the boot kernel. You can chose to
+enable CONFIG_RELOCATABLE for the kdump kernel, and you will still want to
+verify that CONFIG_KERNEL_START and CONFIG_PHYSICAL_START have sane defaults.
+Most likely, you can leave these as 0xC000 and 0x000 respectively.
+Finally, on the kdump kernel you will want to make sure CONFIG_PROC_VMCORE is
+enabled as well so the core dump is exported via /proc/vmcore. You can just 
+enable all these options on the boot and kdump and use the same kernel for both
+which is the simplest option.
+
+Summary of 1  2:
+
+Just enable kexec, crash support, and relocatable kernel and you should be good
+to go for all of the above scenarios using the same kernel.
+
+3) Obtaining a device tree
+
+You best bet for getting a working device tree is to pull the one the current
+kernel is using. The easiest way to do this is use the device tree compiler
+to create one from the proc file system
+
+   $ dtc -I fs -O dtb /proc/device-tree/  flat-device-tree
+
+Kexec should be able to take this flat device tree, and modifiy it/update it
+as needed for your particular scenario. It will update memreserve regions, add
+initrd/ramdisks, fixup the command line, etc.
+
+NOTE: If no device tree is given, kexec will do the above on it's own to 
+  obtain a useable device tree. You can specify the device tree to use
+  with the --dtb=flat_device_tree_blob kexec argument.
+
+4) Kexec'ing a new kernel
+
+If you have followed the procedure above you need to do the following to reboot
+into a new kexec kernel.
+
+   $ kexec -l {uImage,vmlinux}
+   $ kexec -e
+
+These options will boot the new kernel, you should see some message as shown
+below.  NOTE: The old command line is used, so if you are booting from an NFS
+mount it should work fine, however it you are using an initrd/ramdisk there are
+caveats to consider (see #6 below).
+
+   sd 2:0:0:0: [sda] Synchronizing SCSI cache
+   Starting new kernel
+   Bye!
+   Reserving 256MB of memory at 512MB for crashkernel (System RAM: 4096MB)
+   Using MPC8572 DS machine description
+   [snip]
+
+5) Setting for a kdump kernel
+
+For the boot kernel, you need to reserve a region of memory for the kdump 
kernel
+to use when the system crashes. This region is removed for use from the boot
+kernel and when the system crashes the kdump kernel will operate out of this
+region exclusively. For mpc85xx, we need to pick a region aligned at 256MB if 
we
+are using a relocatable kernel, other than that the size allocated needs to 
leave
+enough memory for your kdump environment to function properly as well as store
+the kdump kernel and any other 

[PATCH v2 6/7] Add support for reworking flat device tree support

2010-07-20 Thread Matthew McClintock
Currently, the device tree is passed as is. You can optionally
update the command line and specifically listed nodes but nothing
is updated automatically.

This patch updates the memreserve regions, memory node, initrd
nodes and attempts to make the device tree look as it should. Some
code is borrowed from the u-boot routines which do similiar things

Also, now if no flat device tree is passed to kexec it will attempt
to rebuild one from the /proc/device-tree file system to use for
the kexec'ed kernel for both uImage and elf formats

Signed-off-by: Matthew McClintock m...@freescale.com
---
 kexec/arch/ppc/fixup_dtb.c|  314 -
 kexec/arch/ppc/fixup_dtb.h|6 +-
 kexec/arch/ppc/kexec-elf-ppc.c|  148 +
 kexec/arch/ppc/kexec-ppc.h|1 +
 kexec/arch/ppc/kexec-uImage-ppc.c |   54 +--
 kexec/arch/ppc/ops.h  |1 -
 6 files changed, 400 insertions(+), 124 deletions(-)

diff --git a/kexec/arch/ppc/fixup_dtb.c b/kexec/arch/ppc/fixup_dtb.c
index 40e9350..0f9238b 100644
--- a/kexec/arch/ppc/fixup_dtb.c
+++ b/kexec/arch/ppc/fixup_dtb.c
@@ -8,13 +8,36 @@
 #include sys/stat.h
 
 #include ../../kexec.h
+#include ../../kexec-syscall.h
 #include libfdt.h
 #include ops.h
 #include page.h
 #include fixup_dtb.h
+#include kexec-ppc.h
 
 const char proc_dts[] = /proc/device-tree;
 
+#ifdef DEBUG
+static void print_fdt_reserve_regions(char *blob_buf)
+{
+   int i, num;
+
+   /* Print out a summary of the final reserve regions */
+   num =  fdt_num_mem_rsv(blob_buf);
+   printf (reserve regions: %d\n, num);
+   for (i = 0; i  num; i++)
+   {
+   uint64_t offset, size;
+
+   if (fdt_get_mem_rsv(blob_buf, i, offset, size) == 0) {
+   printf(%d: offset: %llx, size: %llx\n, i, offset, 
size);
+   } else {
+   printf(Error retreiving reserved region\n);
+   }
+   }
+}
+#endif
+
 static void fixup_nodes(char *nodes[])
 {
int index = 0;
@@ -92,14 +115,303 @@ static void fixup_cmdline(const char *cmdline)
return;
 }
 
-char *fixup_dtb_nodes(char *blob_buf, off_t *blob_size, char *nodes[], char 
*cmdline)
+#define EXPAND_GRANULARITY 1024
+
+static char *expand_buf(int minexpand, char *blob_buf, off_t *blob_size)
+{
+   int size = fdt_totalsize(blob_buf);
+   int rc;
+
+   size = _ALIGN(size + minexpand, EXPAND_GRANULARITY);
+   blob_buf = realloc(blob_buf, size);
+   if (!blob_buf)
+   fatal(Couldn't find %d bytes to expand device tree\n\r, size);
+   rc = fdt_open_into(blob_buf, blob_buf, size);
+   if (rc != 0)
+   fatal(Couldn't expand fdt into new buffer: %s\n\r,
+   fdt_strerror(rc));
+
+   *blob_size = fdt_totalsize(blob_buf);
+
+   return blob_buf;
+}
+
+static void fixup_reserve_regions(struct kexec_info *info, char *blob_buf, 
off_t *blob_size)
+{
+   int ret, i;
+   int nodeoffset;
+
+   /* If this is a KEXEC kernel we add all regions since they will
+* all need to be saved */
+   if (info-kexec_flags  KEXEC_ON_CRASH) {
+   for (i = 0; i  info-nr_segments; i++)
+   {
+   uint64_t address = (unsigned long)info-segment[i].mem;
+   uint64_t size = info-segment[i].memsz;
+
+   /* We add all except the device tree because it's 
already added */
+   if (address == devicetree_base) continue;
+
+   while ((i+1)  info-nr_segments 
+ (address + size == (unsigned 
long)info-segment[i+1].mem))
+   {
+   /* We add all except the device tree because 
it's already added */
+   if ( (unsigned long)info-segment[i+1].mem == 
devicetree_base)
+continue;
+
+   size += info-segment[++i].memsz;
+   }
+
+   ret = fdt_add_mem_rsv(blob_buf, address, size);
+   if (ret) {
+   printf(%s: Error adding memory range to 
memreserve!\n,
+   fdt_strerror(ret));
+   goto out;
+   }
+   }
+   } else {
+   /* Otherwise we just add back the ramdisk and the device tree
+* is already in the list */
+   ret = fdt_add_mem_rsv(blob_buf, ramdisk_base, ramdisk_size);
+   if (ret) {
+   printf(%s: Unable to add new reserved memory for 
initrd flat device tree\n,
+   fdt_strerror(ret));
+   goto out;
+   }
+   }
+
+   /* Add reserve regions for cpu-release-addr */
+   nodeoffset = fdt_node_offset_by_prop_value(blob_buf, -1, 

[PATCH v2 5/7] Add support for ramdisk on ppc32 for uImage-ppc and Elf-ppc

2010-07-20 Thread Matthew McClintock
This fixes --reuseinitrd and --ramdisk option for ppc32 on
uImage-ppc and Elf. It works for normal kexec as well as for
kdump.

When using --reuseinitrd you need to specifify retain_initrd
on the command line. Also, if you are doing kdump you need to make
sure your initrd lives in the crashdump region otherwise the
kdump kernel will not be able to access it. The --ramdisk option
should always work.

Signed-off-by: Matthew McClintock m...@freescale.com
---
 kexec/arch/ppc/Makefile   |1 +
 kexec/arch/ppc/include/arch/options.h |3 +
 kexec/arch/ppc/kexec-elf-ppc.c|   44 -
 kexec/arch/ppc/kexec-ppc.c|6 +++
 kexec/arch/ppc/kexec-ppc.h|2 +
 kexec/arch/ppc/kexec-uImage-ppc.c |   68 +++-
 6 files changed, 118 insertions(+), 6 deletions(-)

diff --git a/kexec/arch/ppc/Makefile b/kexec/arch/ppc/Makefile
index 5988213..c963175 100644
--- a/kexec/arch/ppc/Makefile
+++ b/kexec/arch/ppc/Makefile
@@ -21,6 +21,7 @@ libfdt_SRCS += $(LIBFDT_SRCS:%=kexec/arch/ppc/libfdt/%)
 CPPFLAGS+=-I$(srcdir)/kexec/arch/$(ARCH)/libfdt
 
 ppc_KEXEC_SRCS += $(libfdt_SRCS)
+ppc_ARCH_REUSE_INITRD =
 
 dist += kexec/arch/ppc/Makefile $(ppc_KEXEC_SRCS)  \
kexec/arch/ppc/kexec-ppc.h kexec/arch/ppc/ppc_asm.h \
diff --git a/kexec/arch/ppc/include/arch/options.h 
b/kexec/arch/ppc/include/arch/options.h
index f646ccc..0c00ea7 100644
--- a/kexec/arch/ppc/include/arch/options.h
+++ b/kexec/arch/ppc/include/arch/options.h
@@ -8,6 +8,7 @@
 #define OPT_GAMECUBE(OPT_ARCH_MAX+1)
 #define OPT_DTB (OPT_ARCH_MAX+2)
 #define OPT_NODES   (OPT_ARCH_MAX+3)
+#define OPT_RAMDISK(OPT_ARCH_MAX+4)
 
 /* Options relevant to the architecture (excluding loader-specific ones),
  * in this case none:
@@ -35,6 +36,8 @@
KEXEC_ARCH_OPTIONS \
{command-line, 1, 0, OPT_APPEND},\
{append,   1, 0, OPT_APPEND},\
+   {ramdisk,  1, 0, OPT_APPEND},\
+   {initrd,   1, 0, OPT_APPEND},\
{gamecube, 1, 0, OPT_GAMECUBE},\
{dtb, 1, 0, OPT_DTB},\
{reuse-node, 1, 0, OPT_NODES},\
diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c
index 87e6507..58bba54 100644
--- a/kexec/arch/ppc/kexec-elf-ppc.c
+++ b/kexec/arch/ppc/kexec-elf-ppc.c
@@ -127,6 +127,8 @@ static const struct option options[] = {
KEXEC_ARCH_OPTIONS
{command-line, 1, 0, OPT_APPEND},
{append,   1, 0, OPT_APPEND},
+   {ramdisk,  1, 0, OPT_RAMDISK},
+   {initrd,   1, 0, OPT_RAMDISK},
{gamecube, 1, 0, OPT_GAMECUBE},
{dtb, 1, 0, OPT_DTB},
{reuse-node, 1, 0, OPT_NODES},
@@ -139,10 +141,12 @@ void elf_ppc_usage(void)
printf(
 --command-line=STRING Set the kernel command line to 
STRING.\n
 --append=STRING   Set the kernel command line to 
STRING.\n
+--ramdisk=filename  Initial RAM disk.\n
+--initrd=filename   same as --ramdisk\n
 --gamecube=1|0Enable/disable support for ELFs with 
changed\n
   addresses suitable for the GameCube.\n
- --dtb=filename Specify device tree blob file.\n
- --reuse-node=nodeSpecify nodes which should be taken 
from /proc/device-tree.\n
+--dtb=filename Specify device tree blob file.\n
+--reuse-node=nodeSpecify nodes which should be taken 
from /proc/device-tree.\n
   Can be set multiple times.\n
 );
 }
@@ -177,7 +181,7 @@ int elf_ppc_load(int argc, char **argv, const char 
*buf, off_t len,
unsigned long my_kernel, my_dt_offset;
unsigned long my_stack, my_backup_start;
unsigned int slave_code[256 / sizeof(unsigned int)], master_entry;
-   unsigned char *seg_buf = NULL;
+   char *seg_buf = NULL;
off_t seg_size = 0;
int target_is_gamecube = 0;
unsigned int addr;
@@ -193,6 +197,8 @@ int elf_ppc_load(int argc, char **argv, const char 
*buf, off_t len,
dtb = NULL;
max_addr = LONG_MAX;
hole_addr = 0;
+   kernel_addr = 0;
+   ramdisk = 0;
 
while ((opt = getopt_long(argc, argv, short_options, options, 0)) != 
-1) {
switch (opt) {
@@ -207,6 +213,9 @@ int elf_ppc_load(int argc, char **argv, const char 
*buf, off_t len,
case OPT_APPEND:
command_line = optarg;
break;
+   case OPT_RAMDISK:
+   ramdisk = optarg;
+   break;
case OPT_GAMECUBE:
target_is_gamecube = atoi(optarg);
break;
@@ -234,6 +243,9 @@ int elf_ppc_load(int argc, char **argv, const char 
*buf, off_t len,
command_line_len = 

[PATCH v2 1/7] Restore kexec uImage-ppc to working state

2010-07-20 Thread Matthew McClintock
Booting with uImage-ppc was broken by previous work, this
patch should restore it to working order

Signed-off-by: Matthew McClintock m...@freescale.com
---
 kexec/arch/ppc/kexec-ppc.c |   68 ++-
 kexec/arch/ppc/kexec-uImage-ppc.c  |5 +--
 purgatory/arch/ppc/purgatory-ppc.c |5 +++
 3 files changed, 49 insertions(+), 29 deletions(-)

diff --git a/kexec/arch/ppc/kexec-ppc.c b/kexec/arch/ppc/kexec-ppc.c
index 55cadd6..c073f56 100644
--- a/kexec/arch/ppc/kexec-ppc.c
+++ b/kexec/arch/ppc/kexec-ppc.c
@@ -261,11 +261,28 @@ static int get_base_ranges(void)
break;
}
}
-   base_memory_range[local_memory_ranges].start =
-   ((uint32_t *)buf)[0];
-   base_memory_range[local_memory_ranges].end  =
-   base_memory_range[local_memory_ranges].start +
-   ((uint32_t *)buf)[1];
+
+   if (n == 8)
+   {
+   base_memory_range[local_memory_ranges].start =
+   ((uint32_t *)buf)[0];
+   base_memory_range[local_memory_ranges].end  =
+   
base_memory_range[local_memory_ranges].start +
+   ((uint32_t *)buf)[1];
+   }
+   else if (n == 16)
+   {
+   base_memory_range[local_memory_ranges].start =
+((uint64_t *)buf)[0];
+base_memory_range[local_memory_ranges].end  =
+
base_memory_range[local_memory_ranges].start +
+((uint64_t *)buf)[1];
+   }
+   else
+   {
+   fprintf(stderr, Mem node has invalid size: 
%d\n, n);
+   return -1;
+   }
base_memory_range[local_memory_ranges].type = RANGE_RAM;
local_memory_ranges++;
dbgprintf(%016llx-%016llx : %x\n,
@@ -327,27 +344,28 @@ static int get_devtree_details(unsigned long kexec_flags)
}
 
if (strncmp(dentry-d_name, chosen, 6) == 0) {
-   strcat(fname, /linux,kernel-end);
-   file = fopen(fname, r);
-   if (!file) {
-   perror(fname);
-   goto error_opencdir;
-   }
-   if (fread(tmp_long, sizeof(unsigned long), 1, file)
-   != 1) {
-   perror(fname);
-   goto error_openfile;
-   }
-   kernel_end = tmp_long;
-   fclose(file);
-
-   /* Add kernel memory to exclude_range */
-   exclude_range[i].start = 0x0UL;
-   exclude_range[i].end = kernel_end;
-   i++;
-   if (i = max_memory_ranges)
-   realloc_memory_ranges();
+   /* only reserve kernel region if we are doing a crash 
kernel */
if (kexec_flags  KEXEC_ON_CRASH) {
+   strcat(fname, /linux,kernel-end);
+   file = fopen(fname, r);
+   if (!file) {
+   perror(fname);
+   goto error_opencdir;
+   }
+   if (fread(tmp_long, sizeof(unsigned long), 1, 
file)
+   != 1) {
+   perror(fname);
+   goto error_openfile;
+   }
+   kernel_end = tmp_long;
+   fclose(file);
+
+   /* Add kernel memory to exclude_range */
+   exclude_range[i].start = 0x0UL;
+   exclude_range[i].end = kernel_end;
+   i++;
+   if (i = max_memory_ranges)
+   realloc_memory_ranges();
memset(fname, 0, sizeof(fname));
strcpy(fname, device_tree);
strcat(fname, dentry-d_name);
diff --git a/kexec/arch/ppc/kexec-uImage-ppc.c 
b/kexec/arch/ppc/kexec-uImage-ppc.c
index 45cde2f..4a8d28d 100644
--- 

[PATCH v2 2/7] Fix case where phys_addr_t != unsigned long when reading proc entries

2010-07-20 Thread Matthew McClintock
On some actitectures the physical memory can be 64 bits, therefore
the code that reads proc entries needs to take into account it could
read either a 32 bit or 64bit value for the physical addresses.

Signed-off-by: Matthew McClintock m...@freescale.com
---
 kexec/arch/ppc/kexec-elf-ppc.c |1 -
 kexec/arch/ppc/kexec-ppc.c |  210 
 kexec/arch/ppc/kexec-ppc.h |1 +
 3 files changed, 148 insertions(+), 64 deletions(-)

diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c
index d155bde..ab2d343 100644
--- a/kexec/arch/ppc/kexec-elf-ppc.c
+++ b/kexec/arch/ppc/kexec-elf-ppc.c
@@ -32,7 +32,6 @@
 
 static const int probe_debug = 0;
 
-unsigned long long initrd_base, initrd_size;
 unsigned char reuse_initrd;
 const char *ramdisk;
 int create_flatten_tree(struct kexec_info *, unsigned char **, unsigned long *,
diff --git a/kexec/arch/ppc/kexec-ppc.c b/kexec/arch/ppc/kexec-ppc.c
index c073f56..d7afad6 100644
--- a/kexec/arch/ppc/kexec-ppc.c
+++ b/kexec/arch/ppc/kexec-ppc.c
@@ -28,6 +28,8 @@
 
 uint64_t rmo_top;
 unsigned long long crash_base, crash_size;
+unsigned long long initrd_base, initrd_size;
+unsigned long long devicetree_base, devicetree_size;
 unsigned int rtas_base, rtas_size;
 int max_memory_ranges;
 
@@ -320,9 +322,7 @@ static int get_devtree_details(unsigned long kexec_flags)
DIR *dir, *cdir;
FILE *file;
struct dirent *dentry;
-   struct stat fstat;
int n, i = 0;
-   unsigned long tmp_long;
 
if ((dir = opendir(device_tree)) == NULL) {
perror(device_tree);
@@ -352,12 +352,18 @@ static int get_devtree_details(unsigned long kexec_flags)
perror(fname);
goto error_opencdir;
}
-   if (fread(tmp_long, sizeof(unsigned long), 1, 
file)
-   != 1) {
+   if ((n = fread(buf, 1, MAXBYTES, file))  0) {
perror(fname);
goto error_openfile;
}
-   kernel_end = tmp_long;
+   if (n == 4) {
+   kernel_end = ((uint32_t *)buf)[0];
+   } else if (n == 8) {
+   kernel_end = ((uint64_t *)buf)[0];
+   } else {
+   fprintf(stderr, %s node has invalid 
size: %d\n, fname, n);
+   goto error_openfile;
+   }
fclose(file);
 
/* Add kernel memory to exclude_range */
@@ -375,12 +381,18 @@ static int get_devtree_details(unsigned long kexec_flags)
perror(fname);
goto error_opencdir;
}
-   if (fread(tmp_long, sizeof(unsigned long), 1,
-   file) != 1) {
+   if ((n = fread(buf, 1, MAXBYTES, file))  0) {
perror(fname);
goto error_openfile;
}
-   crash_base = tmp_long;
+   if (n == 4) {
+   crash_base = ((uint32_t *)buf)[0];
+   } else if (n == 8) {
+   crash_base = ((uint64_t *)buf)[0];
+   } else {
+   fprintf(stderr, %s node has invalid 
size: %d\n, fname, n);
+   goto error_openfile;
+   }
fclose(file);
 
memset(fname, 0, sizeof(fname));
@@ -392,12 +404,19 @@ static int get_devtree_details(unsigned long kexec_flags)
perror(fname);
goto error_opencdir;
}
-   if (fread(tmp_long, sizeof(unsigned long), 1,
-   file) != 1) {
+   if ((n = fread(buf, 1, MAXBYTES, file))  0) {
perror(fname);
goto error_openfile;
}
-   crash_size = tmp_long;
+   if (n == 4) {
+   crash_size = ((uint32_t *)buf)[0];
+   } else if (n == 8) {
+  

[PATCH] DTS: Adding device tree source for the STx GP3 SSA MPC8555-based board.

2010-07-20 Thread Bradley Hughes
DTS: Adding device tree source for the STx GP3 SSA MPC8555-based board.

---
 arch/powerpc/boot/dts/stxssa.dts |  380 ++
 1 files changed, 380 insertions(+), 0 deletions(-)
 create mode 100644 arch/powerpc/boot/dts/stxssa.dts

diff --git a/arch/powerpc/boot/dts/stxssa.dts b/arch/powerpc/boot/dts/stxssa.dts
new file mode 100644
index 000..94d12d7
--- /dev/null
+++ b/arch/powerpc/boot/dts/stxssa.dts
@@ -0,0 +1,380 @@
+/*
+ * MPC8555-based STx GP3 Device Tree Source
+ *
+ * Copyright 2006, 2008 Freescale Semiconductor Inc.
+ *
+ * Copyright 2010 Silicon Turnkey Express LLC.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+/dts-v1/;
+
+/ {
+   model = stx,gp3;
+compatible = stx,gp3-8560, stx,gp3;
+   #address-cells = 1;
+   #size-cells = 1;
+
+   aliases {
+   ethernet0 = enet0;
+   ethernet1 = enet1;
+   serial0 = serial0;
+   serial1 = serial1;
+   pci0 = pci0;
+   };
+
+   cpus {
+   #address-cells = 1;
+   #size-cells = 0;
+
+   PowerPC,8...@0 {
+   device_type = cpu;
+   reg = 0x0;
+   d-cache-line-size = 32;   // 32 bytes
+   i-cache-line-size = 32;   // 32 bytes
+   d-cache-size = 0x8000;// L1, 32K
+   i-cache-size = 0x8000;// L1, 32K
+   timebase-frequency = 0;   //  33 MHz, from uboot
+   bus-frequency = 0;// 166 MHz
+   clock-frequency = 0;  // 825 MHz, from uboot
+   next-level-cache = L2;
+   };
+   };
+
+   memory {
+   device_type = memory;
+   reg = 0x 0x1000;
+   };
+
+   soc8...@e000 {
+   #address-cells = 1;
+   #size-cells = 1;
+   device_type = soc;
+   compatible = simple-bus;
+   ranges = 0x0 0xe000 0x10;
+   bus-frequency = 0;
+
+   ecm-...@0 {
+   compatible = fsl,ecm-law;
+   reg = 0x0 0x1000;
+   fsl,num-laws = 8;
+   };
+
+   e...@1000 {
+   compatible = fsl,mpc8555-ecm, fsl,ecm;
+   reg = 0x1000 0x1000;
+   interrupts = 17 2;
+   interrupt-parent = mpic;
+   };
+
+   memory-control...@2000 {
+   compatible = fsl,8555-memory-controller;
+   reg = 0x2000 0x1000;
+   interrupt-parent = mpic;
+   interrupts = 18 2;
+   };
+
+   L2: l2-cache-control...@2 {
+   compatible = fsl,8555-l2-cache-controller;
+   reg = 0x2 0x1000;
+   cache-line-size = 32; // 32 bytes
+   cache-size = 0x4; // L2, 256K
+   interrupt-parent = mpic;
+   interrupts = 16 2;
+   };
+
+   i...@3000 {
+   #address-cells = 1;
+   #size-cells = 0;
+   cell-index = 0;
+   compatible = fsl-i2c;
+   reg = 0x3000 0x100;
+   interrupts = 43 2;
+   interrupt-parent = mpic;
+   dfsrr;
+   };
+
+   d...@21300 {
+   #address-cells = 1;
+   #size-cells = 1;
+   compatible = fsl,mpc8555-dma, fsl,eloplus-dma;
+   reg = 0x21300 0x4;
+   ranges = 0x0 0x21100 0x200;
+   cell-index = 0;
+   dma-chan...@0 {
+   compatible = fsl,mpc8555-dma-channel,
+   fsl,eloplus-dma-channel;
+   reg = 0x0 0x80;
+   cell-index = 0;
+   interrupt-parent = mpic;
+   interrupts = 20 2;
+   };
+   dma-chan...@80 {
+   compatible = fsl,mpc8555-dma-channel,
+   fsl,eloplus-dma-channel;
+   reg = 0x80 0x80;
+   cell-index = 1;
+   interrupt-parent = mpic;
+   interrupts = 21 2;
+   };
+

Re: [PATCH] math-emu: correct test for downshifting fraction in _FP_FROM_INT()

2010-07-20 Thread David Miller
From: Mikael Pettersson mi...@it.uu.se
Date: Mon, 19 Jul 2010 23:58:42 +0200

 The kernel's math-emu code contains a macro _FP_FROM_INT() which is
 used to convert an integer to a raw normalized floating-point value.
 It does this basically in three steps:
 ...
 The fix is simple: the exponent comparison used to determine if the
 fraction should be downshifted must be = not .
 
 I'm sending a kernel module to test this as a reply to this message.
 There are also SPARC user-space test cases in the GCC bug entry.
 
 Signed-off-by: Mikael Pettersson mi...@it.uu.se

Applied and I'll make sure this gets into -stable too.

Thanks!
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: one more question about dts

2010-07-20 Thread Grant Likely
On Tue, Jul 20, 2010 at 8:37 PM, hacklu embedway.t...@gmail.com wrote:
 my board is mpc8247,and i write it's dts by   imitating mpc8272's dts

 how can i set the localbus address?

 local...@f0010100 {
 compatible = fsl,mpc8272-localbus,
  fsl,pq2-localbus;
 #address-cells = 2;
 #size-cells = 1;
 reg = f0010100 40;
 ranges = 
  0 0 7000 100  #my flash1
  1 0 7100 100  #my flash2
  2 ?  ???    ???   #how to set it
 for board-control?
  3  ?      # how to set it for
 pci_pic   ;

These values reflect the base address and translation range of each
chip select.  How are your hardware chips selects configured.

If I assume that cs2 is configured for 0xc100 to 0xc100, and
cs3 is configured for 0xc200 to 0xc203, then your ranges
property would be:

ranges =  0 0 7000 100  #my flash1
   1 0 7100 100  #my flash2
   2 0 c100 1
   3 0 c200 4 ;



 
  board-cont...@2,0 {
 reg = 1 0 20;

If this is attached to chipselect #2, then this should be reg = 2 0 20;

 compatible = fsl,mpc8272ads-bcsr;
 };
 PCI_PIC: interrupt-control...@3,0 {
 compatible = fsl,mpc8272ads-pci-pic,
  fsl,pq2ads-pci-pic;
 #interrupt-cells = 1;
 interrupt-controller;
 reg = 3 0 8;
 interrupt-parent = PIC;
 interrupts = 14 8;
 };

 thanks for answering~
 2010-07-21
 
 hacklu



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev