Remove use of early_vprintk, tile neatening
cover Remove use of early_vprintk, tile neatening
Joe Perches (3):
printk: Remove used-once early_vprintk
tile: Neaten early_printk uses
tile: Use pr_warn instead of pr_warning
arch/tile/kernel/early_printk.c | 19 +++++++++++------ arch/tile/kernel/setup.c | 45 ++++++++++++++++++----------------------- include/linux/printk.h | 1 - kernel/printk/printk.c | 19 ++++++++--------- 4 files changed, 41 insertions(+), 43 deletions(-)
Signature · 1 line
2.1.2
PATCH 1/3 printk: Remove used-once early_vprintk
Eliminate the unlikely possibility of message interleaving for early_printk/early_vprintk use.
early_vprintk can be done via the %pV extension so remove this unnecessary function and change early_printk to have the equivalent vprintk code.
All uses of early_printk already end with a newline so also remove the unnecessary newline from the early_printk function.
--- arch/tile/kernel/early_printk.c | 19 +++++++++++++------ include/linux/printk.h | 1 - kernel/printk/printk.c | 19 ++++++++----------- 3 files changed, 21 insertions(+), 18 deletions(-)
arch/tile/kernel/early_printk.c +13 -6
@@ -43,13 +43,20 @@ static struct console early_hv_console = {void early_panic (const char *fmt, ...) { -va_list ap; +struct va_format vaf; +va_list args; +arch_local_irq_disable_all (); -va_start (ap, fmt); -early_printk ("Kernel panic - not syncing: " ); -early_vprintk (fmt, ap); -early_printk ("\n" ); -va_end (ap); + +va_start (args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + +early_printk ("Kernel panic - not syncing: %pV" , &vaf); + +va_end (args); +dump_stack ();hv_halt (); }
include/linux/printk.h +0 -1
@@ -118,7 +118,6 @@ int no_printk(const char *fmt, ...)#ifdef CONFIG_EARLY_PRINTK extern asmlinkage __printf(1, 2)void early_printk (const char *fmt, ...); -void early_vprintk (const char *fmt,va_list ap); #else static inline __printf(1, 2) __cold void early_printk(const char *s, ...) { }
kernel/printk/printk.c +8 -11
@@ -1881,23 +1881,20 @@ static size_t cont_print_text(char *text, size_t size) { return 0; }#ifdef CONFIG_EARLY_PRINTK struct console *early_console; -void early_vprintk (const char *fmt,va_list ap) -{ -if (early_console) { -char buf[512 ]; -int n =vscnprintf (buf,sizeof (buf), fmt, ap); - - early_console->write (early_console, buf, n); - } -} - asmlinkage __visible void early_printk(const char *fmt, ...) {va_list ap; +char buf[512 ]; +int n; + +if (!early_console) +return ;va_start (ap, fmt); -early_vprintk (fmt, ap); + n =vscnprintf (buf,sizeof (buf), fmt, ap);va_end (ap); + + early_console->write (early_console, buf, n); }#endif
Signature · 1 line
2.1.2
PATCH 3/3 tile: Use pr_warn instead of pr_warning
In reply to Joe PerchesUse the more common pr_warn.
Coalesce formats, realign arguments.
--- arch/tile/kernel/setup.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-)
arch/tile/kernel/setup.c +15 -18
@@ -534,11 +534,10 @@ static void __init setup_memory(void) } } physpages -= dropped_pages; -pr_warning ("Only using %ldMB memory;" -" ignoring %ldMB.\n" , - physpages >> (20 -PAGE_SHIFT ), - dropped_pages >> (20 -PAGE_SHIFT )); -pr_warning ("Consider using a larger page size.\n" ); +pr_warn ("Only using %ldMB memory - ignoring %ldMB\n" , + physpages >> (20 -PAGE_SHIFT ), + dropped_pages >> (20 -PAGE_SHIFT )); +pr_warn ("Consider using a larger page size\n" ); }#endif
@@ -566,9 +565,8 @@ static void __init setup_memory(void)#ifndef __tilegx__if (node_end_pfn[0 ] >MAXMEM_PFN ) { -pr_warning ("Only using %ldMB LOWMEM.\n" , -MAXMEM >>20 ); -pr_warning ("Use a HIGHMEM enabled kernel.\n" ); +pr_warn ("Only using %ldMB LOWMEM\n" ,MAXMEM >>20 ); +pr_warn ("Use a HIGHMEM enabled kernel\n" ); max_low_pfn =MAXMEM_PFN ; max_pfn =MAXMEM_PFN ; node_end_pfn[0 ] =MAXMEM_PFN ;
@@ -1112,8 +1110,8 @@ static void __init load_hv_initrd(void) fd =hv_fs_findfile ((HV_VirtAddr ) initramfs_file);if (fd ==HV_ENOENT ) {if (set_initramfs_file) { -pr_warning ("No such hvfs initramfs file '%s'\n" , - initramfs_file); +pr_warn ("No such hvfs initramfs file '%s'\n" , + initramfs_file);return ; }else {/* Try old backwards-compatible name. */
@@ -1126,8 +1124,8 @@ static void __init load_hv_initrd(void) stat =hv_fs_fstat (fd);BUG_ON (stat.size <0 );if (stat.flags &HV_FS_ISDIR ) { -pr_warning ("Ignoring hvfs file '%s': it's a directory.\n" , - initramfs_file); +pr_warn ("Ignoring hvfs file '%s': it's a directory\n" , + initramfs_file);return ; } initrd =alloc_bootmem_pages (stat.size);
@@ -1185,9 +1183,8 @@ static void __init validate_hv(void)HV_Topology topology =hv_inquire_topology ();BUG_ON (topology.coord.x !=0 || topology.coord.y !=0 );if (topology.width !=1 || topology.height !=1 ) { -pr_warning ("Warning: booting UP kernel on %dx%d grid;" -" will ignore all but first tile.\n" , - topology.width, topology.height); +pr_warn ("Warning: booting UP kernel on %dx%d grid; will ignore all but first tile\n" , + topology.width, topology.height); }#endif
@@ -1393,7 +1390,7 @@ static void __init setup_cpu_maps(void)static int __init dataplane (char *str) { -pr_warning ("WARNING: dataplane support disabled in this kernel\n" ); +pr_warn ("WARNING: dataplane support disabled in this kernel\n" );return 0 ; }
@@ -1411,8 +1408,8 @@ void __init setup_arch(char **cmdline_p) len =hv_get_command_line ((HV_VirtAddr ) boot_command_line,COMMAND_LINE_SIZE );if (boot_command_line[0 ]) -pr_warning ("WARNING: ignoring dynamic command line \"%s\"\n" , - boot_command_line); +pr_warn ("WARNING: ignoring dynamic command line \"%s\"\n" , + boot_command_line);strlcpy (boot_command_line, builtin_cmdline,COMMAND_LINE_SIZE );#else char *hv_cmdline;
Signature · 1 line
2.1.2
PATCH 2/3 tile: Neaten early_printk uses
In reply to Joe PerchesCoalesce the formats and align arguments.
--- arch/tile/kernel/setup.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
arch/tile/kernel/setup.c +5 -7
@@ -1208,9 +1208,8 @@ static void __init validate_hv(void)* We use a struct cpumask for this, so it must be big enough. */ if ((smp_height * smp_width) > nr_cpu_ids) -early_panic ("Hypervisor %d x %d grid too big for Linux" -" NR_CPUS %d\n" , smp_height, smp_width, - nr_cpu_ids); +early_panic ("Hypervisor %d x %d grid too big for Linux NR_CPUS %d\n" , + smp_height, smp_width, nr_cpu_ids);#endif /*
@@ -1265,10 +1264,9 @@ static void __init validate_va(void)/* Kernel PCs must have their high bit set; see intvec.S. */ if ((long )VMALLOC_START >=0 ) -early_panic ( -"Linux VMALLOC region below the 2GB line (%#lx)!\n" -"Reconfigure the kernel with smaller VMALLOC_RESERVE.\n" , -VMALLOC_START ); +early_panic ("Linux VMALLOC region below the 2GB line (%#lx)!\n" +"Reconfigure the kernel with smaller VMALLOC_RESERVE\n" , +VMALLOC_START );#endif }
Signature · 1 line
2.1.2
Quoted 11 lines · Joe Perches
Joe Perches (3):
printk: Remove used-onceearly_vprintk
tile: Neatenearly_printkuses
tile: Usepr_warninstead ofpr_warningarch/tile/kernel/early_printk.c | 19 +++++++++++------ arch/tile/kernel/setup.c | 45 ++++++++++++++++++----------------------- include/linux/printk.h | 1 - kernel/printk/printk.c | 19 ++++++++--------- 4 files changed, 41 insertions(+), 43 deletions(-)
You can put my
on this series. Looks like akpm is taking it into -mm so I won't bother to take it into the tile tree.
Signature · 2 lines
Chris Metcalf, Tilera Corp. http://www.tilera.com
PATCH 1/1 tile: Use the more common pr_warn instead of pr_warning
And other message logging neatening.
Other miscellanea:
o coalesce formats
o realign arguments
o standardize a couple of macros
o use __func__ instead of embedding the function name
---
Quoted 3 lines · In reply to the early_vprintk removal stuff Chris
You can put my Acked-by: Chris Metcalf <[email protected]>
on this series. Looks like akpm is taking it into -mm so I won't bother to take it into the tile tree.
Hey Chris.
If you want, here are a few more neatenings of the logging bits of tile on top of those patches.
(uncompiled so untested too)
arch/tile/include/asm/io.h | 5 +- arch/tile/include/asm/pgtable.h | 4 +- arch/tile/include/asm/pgtable_64.h | 2 +- arch/tile/kernel/hardwall.c | 6 +-- arch/tile/kernel/irq.c | 5 +- arch/tile/kernel/kprobes.c | 3 +- arch/tile/kernel/machine_kexec.c | 28 +++++------ arch/tile/kernel/messaging.c | 5 +- arch/tile/kernel/module.c | 12 ++--- arch/tile/kernel/pci.c | 7 ++- arch/tile/kernel/pci_gx.c | 95 ++++++++++++++++---------------------- arch/tile/kernel/process.c | 16 +++---- arch/tile/kernel/setup.c | 36 +++++++-------- arch/tile/kernel/signal.c | 6 +-- arch/tile/kernel/single_step.c | 6 +-- arch/tile/kernel/smpboot.c | 5 +- arch/tile/kernel/stack.c | 7 +-- arch/tile/kernel/time.c | 4 +- arch/tile/kernel/traps.c | 10 ++-- arch/tile/kernel/unaligned.c | 22 ++++----- arch/tile/mm/fault.c | 34 ++++++-------- arch/tile/mm/homecache.c | 6 +-- arch/tile/mm/hugetlbpage.c | 18 ++++---- arch/tile/mm/init.c | 32 ++++++------- arch/tile/mm/pgtable.c | 4 +- 25 files changed, 158 insertions(+), 220 deletions(-)
arch/tile/include/asm/io.h +2 -3
@@ -392,8 +392,7 @@ extern void ioport_unmap(void __iomem *addr);static inline long ioport_panic (void ) {#ifdef __tilegx__ -panic ("PCI IO space support is disabled. Configure the kernel with" -" CONFIG_TILE_PCI_IO to enable it" ); +panic ("PCI IO space support is disabled. Configure the kernel with CONFIG_TILE_PCI_IO to enable it" );#else panic ("inb/outb and friends do not exist on tile" );#endif
@@ -402,7 +401,7 @@ static inline long ioport_panic(void)static inline void __iomem *ioport_map (unsigned long port,unsigned int len) { -pr_info ("ioport_map: mapping IO resources is unsupported on tile.\n" ); +pr_info ("ioport_map: mapping IO resources is unsupported on tile\n" );return NULL ; }
arch/tile/include/asm/pgtable.h +2 -2
@@ -235,9 +235,9 @@ static inline void __pte_clear(pte_t *ptep)#define pte_donemigrate (x) hv_pte_set_present(hv_pte_clear_migrating(x))#define pte_ERROR (e) \ - pr_err("%s:%d: bad pte 0x%016llx.\n", __FILE__, __LINE__, pte_val(e)) + pr_err("%s:%d: bad pte 0x%016llx\n", __FILE__, __LINE__, pte_val(e))#define pgd_ERROR (e) \ - pr_err("%s:%d: bad pgd 0x%016llx.\n", __FILE__, __LINE__, pgd_val(e)) + pr_err("%s:%d: bad pgd 0x%016llx\n", __FILE__, __LINE__, pgd_val(e))/* Return PA and protection info for a given kernel VA. */ int va_to_cpa_and_pte (void *va,phys_addr_t *cpa,pte_t *pte);
arch/tile/include/asm/pgtable_64.h +1 -1
@@ -86,7 +86,7 @@ static inline int pud_huge_page(pud_t pud) }#define pmd_ERROR (e) \ - pr_err("%s:%d: bad pmd 0x%016llx.\n", __FILE__, __LINE__, pmd_val(e)) + pr_err("%s:%d: bad pmd 0x%016llx\n", __FILE__, __LINE__, pmd_val(e))static inline void pud_clear (pud_t *pudp) {
arch/tile/kernel/hardwall.c +2 -4
@@ -365,8 +365,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)* to quiesce. */ if (rect->teardown_in_progress) { -pr_notice ("cpu %d: detected %s hardwall violation %#lx" -" while teardown already in progress\n" , +pr_notice ("cpu %d: detected %s hardwall violation %#lx while teardown already in progress\n" , cpu, hwt->name, (long )mfspr_XDN (hwt,DIRECTION_PROTECT )); goto done;
@@ -630,8 +629,7 @@ static void _hardwall_deactivate(struct hardwall_type *hwt,struct thread_struct *ts = &task->thread;if (cpumask_weight (&task->cpus_allowed) !=1 ) { -pr_err ("pid %d (%s) releasing %s hardwall with" -" an affinity mask containing %d cpus!\n" , +pr_err ("pid %d (%s) releasing %s hardwall with an affinity mask containing %d cpus!\n" , task->pid, task->comm, hwt->name,cpumask_weight (&task->cpus_allowed));BUG ();
arch/tile/kernel/irq.c +2 -3
@@ -107,9 +107,8 @@ void tile_dev_intr(struct pt_regs *regs, int intnum) {long sp = stack_pointer - (long )current_thread_info ();if (unlikely (sp < (sizeof (struct thread_info ) +STACK_WARN ))) { -pr_emerg ("tile_dev_intr: " -"stack overflow: %ld\n" , - sp -sizeof (struct thread_info )); +pr_emerg ("%s: stack overflow: %ld\n" , + __func__, sp -sizeof (struct thread_info ));dump_stack (); } }
arch/tile/kernel/kprobes.c +1 -2
@@ -90,8 +90,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)return -EINVAL ;if (insn_has_control (*p->addr)) { -pr_notice ("Kprobes for control instructions are not " -"supported\n" ); +pr_notice ("Kprobes for control instructions are not supported\n" );return -EINVAL ; }
arch/tile/kernel/machine_kexec.c +11 -17
@@ -77,16 +77,13 @@ void machine_crash_shutdown(struct pt_regs *regs)int machine_kexec_prepare (struct kimage *image) {if (num_online_cpus () >1 ) { -pr_warning ("%s: detected attempt to kexec " -"with num_online_cpus() > 1\n" , - __func__); +pr_warn ("%s: detected attempt to kexec with num_online_cpus() > 1\n" , + __func__);return -ENOSYS ; }if (image->type !=KEXEC_TYPE_DEFAULT ) { -pr_warning ("%s: detected attempt to kexec " -"with unsupported type: %d\n" , - __func__, - image->type); +pr_warn ("%s: detected attempt to kexec with unsupported type: %d\n" , + __func__, image->type);return -ENOSYS ; }return 0 ;
@@ -131,8 +128,8 @@ static unsigned char *kexec_bn2cl(void *pg)*/ csum =ip_compute_csum (pg, bhdrp->b_size);if (csum !=0 ) { -pr_warning ("%s: bad checksum %#x (size %d)\n" , - __func__, csum, bhdrp->b_size); +pr_warn ("%s: bad checksum %#x (size %d)\n" , + __func__, csum, bhdrp->b_size);return 0 ; }
@@ -160,8 +157,7 @@ static unsigned char *kexec_bn2cl(void *pg)while (*desc !='\0' ) { desc++;if (((unsigned long )desc &PAGE_MASK ) != (unsigned long )pg) { -pr_info ("%s: ran off end of page\n" , - __func__); +pr_info ("%s: ran off end of page\n" , __func__);return 0 ; } }
@@ -195,20 +191,18 @@ static void kexec_find_and_set_command_line(struct kimage *image) }if (command_line !=0 ) { -pr_info ("setting new command line to \"%s\"\n" , - command_line); +pr_info ("setting new command line to \"%s\"\n" , command_line); hverr =hv_set_command_line ( (HV_VirtAddr ) command_line,strlen (command_line));kunmap_atomic (command_line); }else { -pr_info ("%s: no command line found; making empty\n" , - __func__); +pr_info ("%s: no command line found; making empty\n" , __func__); hverr =hv_set_command_line ((HV_VirtAddr ) command_line,0 ); }if (hverr) -pr_warning ("%s: hv_set_command_line returned error: %d\n" , - __func__, hverr); +pr_warn ("%s: hv_set_command_line returned error: %d\n" , + __func__, hverr); }/*
arch/tile/kernel/messaging.c +2 -3
@@ -59,9 +59,8 @@ void hv_message_intr(struct pt_regs *regs, int intnum) {long sp = stack_pointer - (long )current_thread_info ();if (unlikely (sp < (sizeof (struct thread_info ) +STACK_WARN ))) { -pr_emerg ("hv_message_intr: " -"stack overflow: %ld\n" , - sp -sizeof (struct thread_info )); +pr_emerg ("%s: stack overflow: %ld\n" , + __func__, sp -sizeof (struct thread_info ));dump_stack (); } }
arch/tile/kernel/module.c +6 -6
@@ -96,8 +96,8 @@ void module_free(struct module *mod, void *module_region)static int validate_hw2_last (long value,struct module *me) {if (((value <<16 ) >>16 ) != value) { -pr_warning ("module %s: Out of range HW2_LAST value %#lx\n" , - me->name, value); +pr_warn ("module %s: Out of range HW2_LAST value %#lx\n" , + me->name, value);return 0 ; }return 1 ;
@@ -210,10 +210,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs, value -= (unsigned long ) location;/* pc-relative */ value = (long ) value >>3 ;/* count by instrs */ if (!validate_jumpoff (value)) { -pr_warning ("module %s: Out of range jump to" -" %#llx at %#llx (%p)\n" , me->name, - sym->st_value + rel[i].r_addend, - rel[i].r_offset, location); +pr_warn ("module %s: Out of range jump to %#llx at %#llx (%p)\n" , + me->name, + sym->st_value + rel[i].r_addend, + rel[i].r_offset, location);return -ENOEXEC ; }MUNGE (create_JumpOff_X1);
arch/tile/kernel/pci.c +3 -4
@@ -178,8 +178,8 @@ int __init tile_pci_init(void)continue ; hv_cfg_fd1 =tile_pcie_open (i,1 );if (hv_cfg_fd1 <0 ) { -pr_err ("PCI: Couldn't open config fd to HV " -"for controller %d\n" , i); +pr_err ("PCI: Couldn't open config fd to HV for controller %d\n" , + i); goto err_cont; }
@@ -423,8 +423,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)for (i =0 ; i <6 ; i++) { r = &dev->resource[i];if (r->flags &IORESOURCE_UNSET ) { -pr_err ("PCI: Device %s not available " -"because of resource collisions\n" , +pr_err ("PCI: Device %s not available because of resource collisions\n" ,pci_name (dev));return -EINVAL ; }
arch/tile/kernel/pci_gx.c +39 -56
216 lines not on this page · raw message
arch/tile/kernel/process.c +7 -9
@@ -52,7 +52,7 @@ static int __init idle_setup(char *str)return -EINVAL ;if (!strcmp (str,"poll" )) { -pr_info ("using polling idle threads.\n" ); +pr_info ("using polling idle threads\n" );cpu_idle_poll_ctrl (true);return 0 ; }else if (!strcmp (str,"halt" )) {
@@ -547,27 +547,25 @@ void show_regs(struct pt_regs *regs)struct task_struct *tsk =validate_current ();int i; -pr_err ("\n" );if (tsk != &corrupt_current)show_regs_print_info (KERN_ERR );#ifdef __tilegx__for (i =0 ; i <17 ; i++) -pr_err (" r%-2d: " REGFMT " r%-2d: " REGFMT " r%-2d: " REGFMT "\n" , +pr_err (" r%-2d: " REGFMT " r%-2d: " REGFMT " r%-2d: " REGFMT "\n" , i, regs->regs[i], i+18 , regs->regs[i+18 ], i+36 , regs->regs[i+36 ]); -pr_err (" r17: " REGFMT " r35: " REGFMT " tp : " REGFMT "\n" , +pr_err (" r17: " REGFMT " r35: " REGFMT " tp : " REGFMT "\n" , regs->regs[17 ], regs->regs[35 ], regs->tp); -pr_err (" sp : " REGFMT " lr : " REGFMT "\n" , regs->sp, regs->lr); +pr_err (" sp : " REGFMT " lr : " REGFMT "\n" , regs->sp, regs->lr);#else for (i =0 ; i <13 ; i++) -pr_err (" r%-2d: " REGFMT " r%-2d: " REGFMT -" r%-2d: " REGFMT " r%-2d: " REGFMT "\n" , +pr_err (" r%-2d: " REGFMT " r%-2d: " REGFMT " r%-2d: " REGFMT " r%-2d: " REGFMT "\n" , i, regs->regs[i], i+14 , regs->regs[i+14 ], i+27 , regs->regs[i+27 ], i+40 , regs->regs[i+40 ]); -pr_err (" r13: " REGFMT " tp : " REGFMT " sp : " REGFMT " lr : " REGFMT "\n" , +pr_err (" r13: " REGFMT " tp : " REGFMT " sp : " REGFMT " lr : " REGFMT "\n" , regs->regs[13 ], regs->tp, regs->sp, regs->lr);#endif -pr_err (" pc : " REGFMT " ex1: %ld faultnum: %ld\n" , +pr_err (" pc : " REGFMT " ex1: %ld faultnum: %ld\n" , regs->pc, regs->ex1, regs->faultnum);dump_stack_regs (regs);
arch/tile/kernel/setup.c +16 -20
@@ -130,7 +130,7 @@ static int __init setup_maxmem(char *str) maxmem_pfn = (maxmem >>HPAGE_SHIFT ) << (HPAGE_SHIFT -PAGE_SHIFT );pr_info ("Forcing RAM used to no more than %dMB\n" , - maxmem_pfn >> (20 -PAGE_SHIFT )); + maxmem_pfn >> (20 -PAGE_SHIFT ));return 0 ; }early_param ("maxmem" , setup_maxmem);
@@ -149,7 +149,7 @@ static int __init setup_maxnodemem(char *str) maxnodemem_pfn[node] = (maxnodemem >>HPAGE_SHIFT ) << (HPAGE_SHIFT -PAGE_SHIFT );pr_info ("Forcing RAM used on node %ld to no more than %dMB\n" , - node, maxnodemem_pfn[node] >> (20 -PAGE_SHIFT )); + node, maxnodemem_pfn[node] >> (20 -PAGE_SHIFT ));return 0 ; }early_param ("maxnodemem" , setup_maxnodemem);
@@ -417,8 +417,7 @@ static void __init setup_memory(void) range.start = (start_pa +HPAGE_SIZE -1 ) &HPAGE_MASK ; range.size -= (range.start - start_pa); range.size &=HPAGE_MASK ; -pr_err ("Range not hugepage-aligned: %#llx..%#llx:" -" now %#llx-%#llx\n" , +pr_err ("Range not hugepage-aligned: %#llx..%#llx: now %#llx-%#llx\n" , start_pa, start_pa + orig_size, range.start, range.start + range.size); }
@@ -437,8 +436,8 @@ static void __init setup_memory(void)if (PFN_DOWN (range.size) > maxnodemem_pfn[i]) {int max_size = maxnodemem_pfn[i];if (max_size >0 ) { -pr_err ("Maxnodemem reduced node %d to" -" %d pages\n" , i, max_size); +pr_err ("Maxnodemem reduced node %d to %d pages\n" , + i, max_size); range.size =PFN_PHYS (max_size); }else {pr_err ("Maxnodemem disabled node %d\n" , i);
@@ -490,8 +489,8 @@ static void __init setup_memory(void)NR_CPUS * (PFN_UP (per_cpu_size) >>PAGE_SHIFT );if (end < pci_reserve_end_pfn + percpu_pages) { end = pci_reserve_start_pfn; -pr_err ("PCI mapping region reduced node %d to" -" %ld pages\n" , i, end - start); +pr_err ("PCI mapping region reduced node %d to %ld pages\n" , + i, end - start); } }#endif
@@ -555,10 +554,9 @@ static void __init setup_memory(void) MAXMEM_PFN : mappable_physpages; highmem_pages = (long ) (physpages - lowmem_pages); -pr_notice ("%ldMB HIGHMEM available.\n" , -pages_to_mb (highmem_pages >0 ? highmem_pages :0 )); -pr_notice ("%ldMB LOWMEM available.\n" , -pages_to_mb (lowmem_pages)); +pr_notice ("%ldMB HIGHMEM available\n" , +pages_to_mb (highmem_pages >0 ? highmem_pages :0 )); +pr_notice ("%ldMB LOWMEM available\n" ,pages_to_mb (lowmem_pages));#else /* Set max_low_pfn based on what node 0 can directly address. */ max_low_pfn = node_end_pfn[0 ];
@@ -571,8 +569,8 @@ static void __init setup_memory(void) max_pfn =MAXMEM_PFN ; node_end_pfn[0 ] =MAXMEM_PFN ; }else { -pr_notice ("%ldMB memory available.\n" , -pages_to_mb (node_end_pfn[0 ])); +pr_notice ("%ldMB memory available\n" , +pages_to_mb (node_end_pfn[0 ])); }for (i =1 ; i <MAX_NUMNODES ; ++i) { node_start_pfn[i] =0 ;
@@ -587,8 +585,7 @@ static void __init setup_memory(void)if (pages) high_memory =pfn_to_kaddr (node_end_pfn[i]); } -pr_notice ("%ldMB memory available.\n" , -pages_to_mb (lowmem_pages)); +pr_notice ("%ldMB memory available\n" ,pages_to_mb (lowmem_pages));#endif #endif }
@@ -1535,8 +1532,7 @@ static void __init pcpu_fc_populate_pte(unsigned long addr)BUG_ON (pgd_addr_invalid (addr));if (addr <VMALLOC_START || addr >=VMALLOC_END ) -panic ("PCPU addr %#lx outside vmalloc range %#lx..%#lx;" -" try increasing CONFIG_VMALLOC_RESERVE\n" , +panic ("PCPU addr %#lx outside vmalloc range %#lx..%#lx; try increasing CONFIG_VMALLOC_RESERVE\n" , addr,VMALLOC_START ,VMALLOC_END ); pgd = swapper_pg_dir +pgd_index (addr);
@@ -1591,8 +1587,8 @@ void __init setup_per_cpu_areas(void) lowmem_va = (unsigned long )pfn_to_kaddr (pfn); ptep =virt_to_kpte (lowmem_va);if (pte_huge (*ptep)) { -printk (KERN_DEBUG "early shatter of huge page" -" at %#lx\n" , lowmem_va); +printk (KERN_DEBUG "early shatter of huge page at %#lx\n" , + lowmem_va);shatter_pmd ((pmd_t *)ptep); ptep =virt_to_kpte (lowmem_va);BUG_ON (pte_huge (*ptep));
arch/tile/kernel/signal.c +2 -4
@@ -345,7 +345,6 @@ static void dump_mem(void __user *address)int i, j, k;int found_readable_mem =0 ; -pr_err ("\n" );if (!access_ok (VERIFY_READ , address,1 )) {pr_err ("Not dumping at address 0x%lx (kernel address)\n" , (unsigned long )address);
@@ -367,7 +366,7 @@ static void dump_mem(void __user *address) (unsigned long)address); found_readable_mem =1 ; } - j =sprintf (line,REGFMT ":" , (unsigned long )addr); + j =sprintf (line,REGFMT ":" , (unsigned long )addr);for (k =0 ; k < bytes_per_line; ++k) j +=sprintf (&line[j]," %02x" , buf[k]);pr_err ("%s\n" , line);
@@ -411,8 +410,7 @@ void trace_unhandled_signal(const char *type, struct pt_regs *regs,case SIGFPE :case SIGSEGV :case SIGBUS : -pr_err ("User crash: signal %d," -" trap %ld, address 0x%lx\n" , +pr_err ("User crash: signal %d, trap %ld, address 0x%lx\n" , sig, regs->faultnum, address);show_regs (regs);dump_mem ((void __user *)address);
arch/tile/kernel/single_step.c +2 -4
@@ -222,11 +222,9 @@ static tilepro_bundle_bits rewrite_load_store_unaligned( }if (unaligned_printk || unaligned_fixup_count ==0 ) { -pr_info ("Process %d/%s: PC %#lx: Fixup of" -" unaligned %s at %#lx.\n" , +pr_info ("Process %d/%s: PC %#lx: Fixup of unaligned %s at %#lx\n" , current->pid, current->comm, regs->pc, - (mem_op ==MEMOP_LOAD || - mem_op ==MEMOP_LOAD_POSTINCR ) ? + mem_op ==MEMOP_LOAD || mem_op ==MEMOP_LOAD_POSTINCR ?"load" :"store" , (unsigned long )addr);if (!unaligned_printk) {
arch/tile/kernel/smpboot.c +2 -3
@@ -127,8 +127,7 @@ static __init int reset_init_affinity(void) {long rc =sched_setaffinity (current->pid, &init_affinity);if (rc !=0 ) -pr_warning ("couldn't reset init affinity (%ld)\n" , - rc); +pr_warn ("couldn't reset init affinity (%ld)\n" , rc);return 0 ; }late_initcall (reset_init_affinity);
@@ -174,7 +173,7 @@ static void start_secondary(void)/* Indicate that we're ready to come up. */ /* Must not do this before we're ready to receive messages */ if (cpumask_test_and_set_cpu (cpuid, &cpu_started)) { -pr_warning ("CPU#%d already started!\n" , cpuid); +pr_warn ("CPU#%d already started!\n" , cpuid);for (;;)local_irq_enable (); }
arch/tile/kernel/stack.c +2 -5
@@ -387,9 +387,7 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers)* then bust_spinlocks() spit out a space in front of us * and it will mess up our KERN_ERR. */ -pr_err ("\n" ); -pr_err ("Starting stack dump of tid %d, pid %d (%s)" -" on cpu %d at cycle %lld\n" , +pr_err ("Starting stack dump of tid %d, pid %d (%s) on cpu %d at cycle %lld\n" , kbt->task->pid, kbt->task->tgid, kbt->task->comm,raw_smp_processor_id (),get_cycles ()); }
@@ -411,8 +409,7 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers) i++, address, namebuf, (unsigned long)(kbt->it.sp));if (i >=100 ) { -pr_err ("Stack dump truncated" -" (%d frames)\n" , i); +pr_err ("Stack dump truncated (%d frames)\n" , i);break ; } }
arch/tile/kernel/time.c +2 -2
@@ -98,8 +98,8 @@ void __init calibrate_delay(void) { loops_per_jiffy =get_clock_rate () /HZ ;pr_info ("Clock rate yields %lu.%02lu BogoMIPS (lpj=%lu)\n" , - loops_per_jiffy/(500000 /HZ ), - (loops_per_jiffy/(5000 /HZ )) %100 , loops_per_jiffy); + loops_per_jiffy / (500000 /HZ ), + (loops_per_jiffy / (5000 /HZ )) %100 , loops_per_jiffy); }/* Called fairly late in init/main.c, but before we go smp. */
arch/tile/kernel/traps.c +5 -5
@@ -46,9 +46,9 @@ static int __init setup_unaligned_fixup(char *str)return 0 ;pr_info ("Fixups for unaligned data accesses are %s\n" , - unaligned_fixup >=0 ? - (unaligned_fixup ?"enabled" :"disabled" ) : -"completely disabled" ); + unaligned_fixup >=0 ? + (unaligned_fixup ?"enabled" :"disabled" ) : +"completely disabled" );return 1 ; }__setup ("unaligned_fixup=" , setup_unaligned_fixup);
@@ -305,8 +305,8 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num,case INT_ILL :if (copy_from_user (&instr, (void __user *)regs->pc,sizeof (instr))) { -pr_err ("Unreadable instruction for INT_ILL:" -" %#lx\n" , regs->pc); +pr_err ("Unreadable instruction for INT_ILL: %#lx\n" , + regs->pc);do_exit (SIGKILL );return ; }
arch/tile/kernel/unaligned.c +10 -12
@@ -969,8 +969,7 @@ void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle, unaligned_fixup_count++;if (unaligned_printk) { -pr_info ("%s/%d. Unalign fixup for kernel access " -"to userspace %lx." , +pr_info ("%s/%d - Unalign fixup for kernel access to userspace %lx\n" , current->comm, current->pid, regs->regs[ra]); }
@@ -985,7 +984,7 @@ void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle, .si_addr = (unsigned char __user *)0 };if (unaligned_printk) -pr_info ("Unalign bundle: unexp @%llx, %llx" , +pr_info ("Unalign bundle: unexp @%llx, %llx\n" , (unsigned long long )regs->pc, (unsigned long long )bundle);
@@ -1370,8 +1369,7 @@ void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle, frag.bundle = bundle;if (unaligned_printk) { - pr_info("%s/%d, Unalign fixup: pc=%lx " - "bundle=%lx %d %d %d %d %d %d %d %d.", + pr_info("%s/%d, Unalign fixup: pc=%lx bundle=%lx %d %d %d %d %d %d %d %d\n", current->comm, current->pid, (unsigned long)frag.pc, (unsigned long)frag.bundle,
@@ -1380,8 +1378,8 @@ void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle, (int)y1_lr, (int)y1_br, (int)x1_add);for (k =0 ; k < n; k +=2 ) -pr_info ("[%d] %016llx %016llx" , k, - (unsigned long long )frag.insn[k], +pr_info ("[%d] %016llx %016llx\n" , + k, (unsigned long long )frag.insn[k], (unsigned long long )frag.insn[k+1 ]); }
@@ -1402,7 +1400,7 @@ void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle, .si_addr = (void __user *)&jit_code_area[idx] }; -pr_warn ("Unalign fixup: pid=%d %s jit_code_area=%llx" , +pr_warn ("Unalign fixup: pid=%d %s jit_code_area=%llx\n" , current->pid, current->comm, (unsigned long long )&jit_code_area[idx]);
@@ -1485,7 +1483,7 @@ void do_unaligned(struct pt_regs *regs, int vecnum)/* If exception came from kernel, try fix it up. */ if (fixup_exception (regs)) {if (unaligned_printk) -pr_info ("Unalign fixup: %d %llx @%llx" , +pr_info ("Unalign fixup: %d %llx @%llx\n" , (int )unaligned_fixup, (unsigned long long )regs->ex1, (unsigned long long )regs->pc);
@@ -1519,7 +1517,7 @@ void do_unaligned(struct pt_regs *regs, int vecnum) };if (unaligned_printk) -pr_info ("Unalign fixup: %d %llx @%llx" , +pr_info ("Unalign fixup: %d %llx @%llx\n" , (int )unaligned_fixup, (unsigned long long )regs->ex1, (unsigned long long )regs->pc);
@@ -1579,14 +1577,14 @@ void do_unaligned(struct pt_regs *regs, int vecnum) 0);if (IS_ERR ((void __force *)user_page)) { -pr_err ("Out of kernel pages trying do_mmap.\n" ); +pr_err ("Out of kernel pages trying do_mmap\n" );return ; }/* Save the address in the thread_info struct */ info->unalign_jit_base = user_page;if (unaligned_printk) -pr_info ("Unalign bundle: %d:%d, allocate page @%llx" , +pr_info ("Unalign bundle: %d:%d, allocate page @%llx\n" ,raw_smp_processor_id (), current->pid, (unsigned long long )user_page); }
arch/tile/mm/fault.c +15 -19
@@ -169,8 +169,7 @@ static void wait_for_migration(pte_t *pte)while (pte_migrating (*pte)) {barrier ();if (++retries > bound) -panic ("Hit migrating PTE (%#llx) and" -" page PFN %#lx still migrating" , +panic ("Hit migrating PTE (%#llx) and page PFN %#lx still migrating" , pte->val,pte_pfn (*pte)); } }
@@ -292,11 +291,10 @@ static int handle_page_fault(struct pt_regs *regs,*/ stack_offset = stack_pointer & (THREAD_SIZE -1 );if (stack_offset <THREAD_SIZE /8 ) { -pr_alert ("Potential stack overrun: sp %#lx\n" , - stack_pointer); +pr_alert ("Potential stack overrun: sp %#lx\n" , stack_pointer);show_regs (regs);pr_alert ("Killing current process %d/%s\n" , - tsk->pid, tsk->comm); + tsk->pid, tsk->comm);do_group_exit (SIGKILL ); }
@@ -421,7 +419,7 @@ good_area: }else if (write) {#ifdef TEST_VERIFY_AREA if (!is_page_fault && regs->cs ==KERNEL_CS ) -pr_err ("WP fault at " REGFMT "\n" , regs->eip); +pr_err ("WP fault at " REGFMT "\n" , regs->eip);#endif if (!(vma->vm_flags &VM_WRITE )) goto bad_area;
@@ -519,16 +517,15 @@ no_context:pte_t *pte =lookup_address (address);if (pte &&pte_present (*pte) && !pte_exec_kernel (*pte)) -pr_crit ("kernel tried to execute" -" non-executable page - exploit attempt?" - " (uid: %d)\n", current->uid); +pr_crit ("kernel tried to execute non-executable page - exploit attempt? (uid: %d)\n" , + current->uid); }#endif if (address <PAGE_SIZE )pr_alert ("Unable to handle kernel NULL pointer dereference\n" );else pr_alert ("Unable to handle kernel paging request\n" ); -pr_alert (" at virtual address " REGFMT ", pc " REGFMT "\n" , +pr_alert (" at virtual address " REGFMT ", pc " REGFMT "\n" , address, regs->pc);show_regs (regs);
@@ -575,9 +572,10 @@ do_sigbus:#ifndef __tilegx__/* We must release ICS before panicking or we won't get anywhere. */ -#define ics_panic (fmt, ...) do { \ - __insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 0); \ - panic(fmt, __VA_ARGS__); \ +#define ics_panic (fmt, ...) \ +do { \ + __insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 0); \ + panic(fmt, ##__VA_ARGS__); \ } while (0)/*
@@ -615,8 +613,7 @@ struct intvec_state do_page_fault_ics(struct pt_regs *regs, int fault_num, fault_num != INT_DTLB_ACCESS)) {unsigned long old_pc = regs->pc; regs->pc = pc; -ics_panic ("Bad ICS page fault args:" -" old PC %#lx, fault %d/%d at %#lx\n" , +ics_panic ("Bad ICS page fault args: old PC %#lx, fault %d/%d at %#lx" , old_pc, fault_num, write, address); }
@@ -669,8 +666,8 @@ struct intvec_state do_page_fault_ics(struct pt_regs *regs, int fault_num,#endif fixup =search_exception_tables (pc);if (!fixup) -ics_panic ("ICS atomic fault not in table:" -" PC %#lx, fault %d" , pc, fault_num); +ics_panic ("ICS atomic fault not in table: PC %#lx, fault %d" , + pc, fault_num); regs->pc = fixup->fixup; regs->ex1 =PL_ICS_EX1 (KERNEL_PL ,0 ); }
@@ -826,8 +823,7 @@ void do_page_fault(struct pt_regs *regs, int fault_num,set_thread_flag (TIF_ASYNC_TLB );if (async->fault_num !=0 ) { -panic ("Second async fault %d;" -" old fault was %d (%#lx/%ld)" , +panic ("Second async fault %d; old fault was %d (%#lx/%ld)" , fault_num, async->fault_num, address, write); }
arch/tile/mm/homecache.c +2 -4
@@ -152,12 +152,10 @@ void flush_remote(unsigned long cache_pfn, unsigned long cache_control,cpumask_scnprintf (cache_buf,sizeof (cache_buf), &cache_cpumask_copy);cpumask_scnprintf (tlb_buf,sizeof (tlb_buf), &tlb_cpumask_copy); -pr_err ("hv_flush_remote(%#llx, %#lx, %p [%s]," -" %#lx, %#lx, %#lx, %p [%s], %p, %d) = %d\n" , +pr_err ("hv_flush_remote(%#llx, %#lx, %p [%s], %#lx, %#lx, %#lx, %p [%s], %p, %d) = %d\n" , cache_pa, cache_control, cache_cpumask, cache_buf, (unsigned long )tlb_va, tlb_length, tlb_pgsize, - tlb_cpumask, tlb_buf, - asids, asidcount, rc); + tlb_cpumask, tlb_buf, asids, asidcount, rc);panic ("Unsafe to continue." ); }
arch/tile/mm/hugetlbpage.c +8 -10
@@ -284,22 +284,21 @@ static __init int __setup_hugepagesz(unsigned long ps)int level, base_shift;if ((1UL << log_ps) != ps || (log_ps &1 ) !=0 ) { -pr_warn ("Not enabling %ld byte huge pages;" -" must be a power of four.\n" , ps); +pr_warn ("Not enabling %ld byte huge pages; must be a power of four\n" , + ps);return -EINVAL ; }if (ps >64 *1024 *1024 *1024UL ) { -pr_warn ("Not enabling %ld MB huge pages;" -" largest legal value is 64 GB .\n" , ps >>20 ); +pr_warn ("Not enabling %ld MB huge pages; largest legal value is 64 GB\n" , + ps >>20 );return -EINVAL ; }else if (ps >=PUD_SIZE ) {static long hv_jpage_size;if (hv_jpage_size ==0 ) hv_jpage_size =hv_sysconf (HV_SYSCONF_PAGE_SIZE_JUMBO );if (hv_jpage_size !=PUD_SIZE ) { -pr_warn ("Not enabling >= %ld MB huge pages:" -" hypervisor reports size %ld\n" , +pr_warn ("Not enabling >= %ld MB huge pages: hypervisor reports size %ld\n" ,PUD_SIZE >>20 , hv_jpage_size);return -EINVAL ; }
@@ -320,14 +319,13 @@ static __init int __setup_hugepagesz(unsigned long ps)int shift_val = log_ps - base_shift;if (huge_shift[level] !=0 ) {int old_shift = base_shift + huge_shift[level]; -pr_warn ("Not enabling %ld MB huge pages;" -" already have size %ld MB.\n" , +pr_warn ("Not enabling %ld MB huge pages; already have size %ld MB\n" , ps >>20 , (1UL << old_shift) >>20 );return -EINVAL ; }if (hv_set_pte_super_shift (level, shift_val) !=0 ) { -pr_warn ("Not enabling %ld MB huge pages;" -" no hypervisor support.\n" , ps >>20 ); +pr_warn ("Not enabling %ld MB huge pages; no hypervisor support\n" , + ps >>20 );return -EINVAL ; }printk (KERN_DEBUG "Enabled %ld MB huge pages\n" , ps >>20 );
arch/tile/mm/init.c +13 -19
@@ -357,11 +357,11 @@ static int __init setup_ktext(char *str)cpulist_scnprintf (buf,sizeof (buf), &ktext_mask);if (cpumask_weight (&ktext_mask) >1 ) { ktext_small =1 ; -pr_info ("ktext: using caching neighborhood %s " -"with small pages\n" , buf); +pr_info ("ktext: using caching neighborhood %s with small pages\n" , + buf); }else {pr_info ("ktext: caching on cpu %s with one huge page\n" , - buf); + buf); } }
@@ -413,19 +413,16 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)int rc, i;if (ktext_arg_seen && ktext_hash) { -pr_warning ("warning: \"ktext\" boot argument ignored" -" if \"kcache_hash\" sets up text hash-for-home\n" ); +pr_warn ("warning: \"ktext\" boot argument ignored if \"kcache_hash\" sets up text hash-for-home\n" ); ktext_small =0 ; }if (kdata_arg_seen && kdata_hash) { -pr_warning ("warning: \"kdata\" boot argument ignored" -" if \"kcache_hash\" sets up data hash-for-home\n" ); +pr_warn ("warning: \"kdata\" boot argument ignored if \"kcache_hash\" sets up data hash-for-home\n" ); }if (kdata_huge && !hash_default) { -pr_warning ("warning: disabling \"kdata=huge\"; requires" -" kcache_hash=all or =allbutstack\n" ); +pr_warn ("warning: disabling \"kdata=huge\"; requires kcache_hash=all or =allbutstack\n" ); kdata_huge =0 ; }
@@ -470,8 +467,8 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) pte[pte_ofs] =pfn_pte (pfn, prot); }else {if (kdata_huge) -printk (KERN_DEBUG "pre-shattered huge" -" page at %#lx\n" , address); +printk (KERN_DEBUG "pre-shattered huge page at %#lx\n" , + address);for (pte_ofs =0 ; pte_ofs <PTRS_PER_PTE ; pfn++, pte_ofs++, address +=PAGE_SIZE ) {pgprot_t prot =init_pgprot (address);
@@ -501,8 +498,8 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)pr_info ("ktext: not using unavailable cpus %s\n" , buf); }if (cpumask_empty (&ktext_mask)) { -pr_warning ("ktext: no valid cpus; caching on %d.\n" , -smp_processor_id ()); +pr_warn ("ktext: no valid cpus; caching on %d\n" , +smp_processor_id ());cpumask_copy (&ktext_mask,cpumask_of (smp_processor_id ())); }
@@ -798,11 +795,9 @@ void __init mem_init(void)#ifdef CONFIG_HIGHMEM /* check that fixmap and pkmap do not overlap */ if (PKMAP_ADDR (LAST_PKMAP -1 ) >=FIXADDR_START ) { -pr_err ("fixmap and kmap areas overlap" -" - this will crash\n" ); +pr_err ("fixmap and kmap areas overlap - this will crash\n" );pr_err ("pkstart: %lxh pkend: %lxh fixstart %lxh\n" , -PKMAP_BASE ,PKMAP_ADDR (LAST_PKMAP -1 ), -FIXADDR_START ); +PKMAP_BASE ,PKMAP_ADDR (LAST_PKMAP -1 ),FIXADDR_START );BUG (); }#endif
@@ -926,8 +921,7 @@ static void free_init_pages(char *what, unsigned long begin, unsigned long end)unsigned long addr = (unsigned long ) begin;if (kdata_huge && !initfree) { -pr_warning ("Warning: ignoring initfree=0:" -" incompatible with kdata=huge\n" ); +pr_warn ("Warning: ignoring initfree=0: incompatible with kdata=huge\n" ); initfree =1 ; } end = (end +PAGE_SIZE -1 ) &PAGE_MASK ;
arch/tile/mm/pgtable.c +1 -3
@@ -44,9 +44,7 @@ void show_mem(unsigned int filter) {struct zone *zone; - pr_err("Active:%lu inactive:%lu dirty:%lu writeback:%lu unstable:%lu" - " free:%lu\n slab:%lu mapped:%lu pagetables:%lu bounce:%lu" - " pagecache:%lu swap:%lu\n", + pr_err("Active:%lu inactive:%lu dirty:%lu writeback:%lu unstable:%lu free:%lu\n slab:%lu mapped:%lu pagetables:%lu bounce:%lu pagecache:%lu swap:%lu\n", (global_page_state(NR_ACTIVE_ANON) + global_page_state(NR_ACTIVE_FILE)), (global_page_state(NR_INACTIVE_ANON) +
Signature · 1 line
2.1.2
Re: [PATCH] tile: Use the more common pr_warn instead of pr_warning
Quoted 10 lines · Joe Perches
And other message logging neatening.
Other miscellanea:
o coalesce formats
o realign arguments
o standardize a couple of macros
o use__func__instead of embedding the function nameSigned-off-by Joe Perches<[email protected]>
Thanks! Taken into the tile tree.
Signature · 2 lines
Chris Metcalf, EZChip Semiconductor http://www.ezchip.com