A kernel 110KB smaller!? Just how small is the total... Is this small enough the push the compressed kernel into 256KB flash?
> -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED]]On Behalf Of Jeremy Jackson > Sent: Friday, March 22, 2002 10:23 AM > To: [EMAIL PROTECTED] > Subject: Fw: [patch] smaller kernels > > > Thought this might be relevant to the Linux-as-bootloader-in-256k > thread. > > ----- Original Message ----- > From: "Andrew Morton" <[EMAIL PROTECTED]> > To: "Marcelo Tosatti" <[EMAIL PROTECTED]> > Cc: "lkml" <[EMAIL PROTECTED]> > Sent: Tuesday, March 19, 2002 10:11 PM > Subject: [patch] smaller kernels > > > > This is the result of a search-and-destroy mission against > > oft-repeated strings in the kernel text. These come about > > due to the toolchain's inability to common up strings between > > compilation units. > > > > In particular, if there is a printk inside an inline function > > then the string gets expanded into every object file which > > included that inline function. > > > > So the patch goes through and removes the offending strings > > in various ways. > > > > Kernel size is reduced by another 110 kbytes in my build. > > > > I haven't sent this to Linus. gcc-3.0.x does the right thing, > > and as 3.x will likely be the preferred compiler when 2.6 is > > released, this change isn't needed for Linus kernels. But it's > > needed for 2.4. > > > > > > --- 2.4.19-pre3/include/asm-i386/mmu_context.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/asm-i386/mmu_context.h Tue Mar 19 21:56:15 > 2002 > > @@ -48,7 +48,7 @@ static inline void switch_mm(struct mm_s > > else { > > cpu_tlbstate[cpu].state = TLBSTATE_OK; > > if(cpu_tlbstate[cpu].active_mm != next) > > - BUG(); > > + out_of_line_bug(); > > if(!test_and_set_bit(cpu, &next->cpu_vm_mask)) { > > /* We were in lazy tlb mode and leave_mm disabled > > * tlb flush IPI delivery. We must flush our tlb. > > --- 2.4.19-pre3/include/linux/kernel.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/linux/kernel.h Tue Mar 19 21:56:15 2002 > > @@ -181,4 +181,6 @@ struct sysinfo { > > char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 > uses this.. */ > > }; > > > > +extern void out_of_line_bug(void) ATTRIB_NORET; > > + > > #endif > > --- 2.4.19-pre3/include/asm-i386/pci.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/asm-i386/pci.h Tue Mar 19 21:56:15 2002 > > @@ -73,7 +73,7 @@ static inline dma_addr_t pci_map_single( > > size_t size, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > flush_write_buffers(); > > return virt_to_bus(ptr); > > } > > @@ -89,7 +89,7 @@ static inline void pci_unmap_single(stru > > size_t size, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > /* Nothing to do */ > > } > > > > @@ -101,7 +101,7 @@ static inline dma_addr_t pci_map_page(st > > unsigned long offset, size_t size, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > > > return (page - mem_map) * PAGE_SIZE + offset; > > } > > @@ -110,7 +110,7 @@ static inline void pci_unmap_page(struct > > size_t size, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > /* Nothing to do */ > > } > > > > @@ -143,16 +143,16 @@ static inline int pci_map_sg(struct pci_ > > int i; > > > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > > > /* > > * temporary 2.4 hack > > */ > > for (i = 0; i < nents; i++ ) { > > if (sg[i].address && sg[i].page) > > - BUG(); > > + out_of_line_bug(); > > else if (!sg[i].address && !sg[i].page) > > - BUG(); > > + out_of_line_bug(); > > > > if (sg[i].address) > > sg[i].dma_address = virt_to_bus(sg[i].address); > > @@ -172,7 +172,7 @@ static inline void pci_unmap_sg(struct p > > int nents, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > /* Nothing to do */ > > } > > > > @@ -190,7 +190,7 @@ static inline void pci_dma_sync_single(s > > size_t size, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > flush_write_buffers(); > > } > > > > @@ -205,7 +205,7 @@ static inline void pci_dma_sync_sg(struc > > int nelems, int direction) > > { > > if (direction == PCI_DMA_NONE) > > - BUG(); > > + out_of_line_bug(); > > flush_write_buffers(); > > } > > > > --- 2.4.19-pre3/include/asm-i386/smplock.h~inline-BUG Tue Mar > 19 21:56:15 > 2002 > > +++ 2.4.19-pre3-akpm/include/asm-i386/smplock.h Tue Mar 19 21:56:15 2002 > > @@ -59,7 +59,7 @@ static __inline__ void lock_kernel(void) > > static __inline__ void unlock_kernel(void) > > { > > if (current->lock_depth < 0) > > - BUG(); > > + out_of_line_bug(); > > #if 1 > > if (--current->lock_depth < 0) > > spin_unlock(&kernel_flag); > > --- 2.4.19-pre3/include/linux/dcache.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/linux/dcache.h Tue Mar 19 21:56:15 2002 > > @@ -242,11 +242,8 @@ extern char * __d_path(struct dentry *, > > > > static __inline__ struct dentry * dget(struct dentry *dentry) > > { > > - if (dentry) { > > - if (!atomic_read(&dentry->d_count)) > > - BUG(); > > + if (dentry) > > atomic_inc(&dentry->d_count); > > - } > > return dentry; > > } > > > > --- 2.4.19-pre3/include/linux/file.h~inline-BUG Tue Mar 19 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/linux/file.h Tue Mar 19 21:56:15 2002 > > @@ -71,30 +71,7 @@ static inline void put_unused_fd(unsigne > > write_unlock(&files->file_lock); > > } > > > > -/* > > - * Install a file pointer in the fd array. > > - * > > - * The VFS is full of places where we drop the files lock between > > - * setting the open_fds bitmap and installing the file in the file > > - * array. At any such point, we are vulnerable to a dup2() race > > - * installing a file in the array before us. We need to > detect this and > > - * fput() the struct file we are about to overwrite in this case. > > - * > > - * It should never happen - if we allow dup2() do it, _really_ > bad things > > - * will follow. > > - */ > > - > > -static inline void fd_install(unsigned int fd, struct file * file) > > -{ > > - struct files_struct *files = current->files; > > - > > - write_lock(&files->file_lock); > > - if (files->fd[fd]) > > - BUG(); > > - files->fd[fd] = file; > > - write_unlock(&files->file_lock); > > -} > > - > > +void fd_install(unsigned int fd, struct file * file); > > void put_files_struct(struct files_struct *fs); > > > > #endif /* __LINUX_FILE_H */ > > --- 2.4.19-pre3/include/linux/nfs_fs.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/linux/nfs_fs.h Tue Mar 19 21:56:15 2002 > > @@ -168,7 +168,7 @@ nfs_file_cred(struct file *file) > > struct rpc_cred *cred = (struct rpc_cred *)(file->private_data); > > #ifdef RPC_DEBUG > > if (cred && cred->cr_magic != RPCAUTH_CRED_MAGIC) > > - BUG(); > > + out_of_line_bug(); > > #endif > > return cred; > > } > > --- 2.4.19-pre3/include/linux/quotaops.h~inline-BUG Tue Mar 19 21:56:15 > 2002 > > +++ 2.4.19-pre3-akpm/include/linux/quotaops.h Tue Mar 19 21:56:15 2002 > > @@ -40,8 +40,6 @@ extern int dquot_transfer(struct inode > > > > static __inline__ void DQUOT_INIT(struct inode *inode) > > { > > - if (!inode->i_sb) > > - BUG(); > > lock_kernel(); > > if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode)) > > inode->i_sb->dq_op->initialize(inode, -1); > > @@ -51,11 +49,8 @@ static __inline__ void DQUOT_INIT(struct > > static __inline__ void DQUOT_DROP(struct inode *inode) > > { > > lock_kernel(); > > - if (IS_QUOTAINIT(inode)) { > > - if (!inode->i_sb) > > - BUG(); > > + if (IS_QUOTAINIT(inode)) > > inode->i_sb->dq_op->drop(inode); /* Ops must be set when there's any > quota... */ > > - } > > unlock_kernel(); > > } > > > > --- 2.4.19-pre3/include/linux/sched.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/linux/sched.h Tue Mar 19 21:56:15 2002 > > @@ -896,7 +896,6 @@ static inline int task_on_runqueue(struc > > > > static inline void unhash_process(struct task_struct *p) > > { > > - if (task_on_runqueue(p)) BUG(); > > write_lock_irq(&tasklist_lock); > > nr_threads--; > > unhash_pid(p); > > --- 2.4.19-pre3/include/linux/highmem.h~inline-BUG Tue Mar 19 21:56:15 > 2002 > > +++ 2.4.19-pre3-akpm/include/linux/highmem.h Tue Mar 19 21:56:15 2002 > > @@ -63,8 +63,6 @@ static inline void memclear_highpage_flu > > { > > char *kaddr; > > > > - if (offset + size > PAGE_SIZE) > > - BUG(); > > kaddr = kmap(page); > > memset(kaddr + offset, 0, size); > > flush_dcache_page(page); > > --- 2.4.19-pre3/include/linux/skbuff.h~inline-BUG Tue Mar 19 > 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/linux/skbuff.h Tue Mar 19 21:56:15 2002 > > @@ -756,9 +756,9 @@ static inline int skb_headlen(const stru > > return skb->len - skb->data_len; > > } > > > > -#define SKB_PAGE_ASSERT(skb) do { if > (skb_shinfo(skb)->nr_frags) BUG(); } > while (0) > > -#define SKB_FRAG_ASSERT(skb) do { if (skb_shinfo(skb)->frag_list) > BUG(); } while (0) > > -#define SKB_LINEAR_ASSERT(skb) do { if (skb_is_nonlinear(skb)) BUG(); } > while (0) > > +#define SKB_PAGE_ASSERT(skb) do { if (skb_shinfo(skb)->nr_frags) > out_of_line_bug(); } while (0) > > +#define SKB_FRAG_ASSERT(skb) do { if (skb_shinfo(skb)->frag_list) > out_of_line_bug(); } while (0) > > +#define SKB_LINEAR_ASSERT(skb) do { if (skb_is_nonlinear(skb)) > out_of_line_bug(); } while (0) > > > > /* > > * Add data to an sk_buff > > @@ -825,8 +825,6 @@ static inline unsigned char *skb_push(st > > static inline char *__skb_pull(struct sk_buff *skb, unsigned int len) > > { > > skb->len-=len; > > - if (skb->len < skb->data_len) > > - BUG(); > > return skb->data+=len; > > } > > > > @@ -1094,7 +1092,7 @@ static inline void *kmap_skb_frag(const > > { > > #ifdef CONFIG_HIGHMEM > > if (in_irq()) > > - BUG(); > > + out_of_line_bug(); > > > > local_bh_disable(); > > #endif > > --- 2.4.19-pre3/include/asm-i386/highmem.h~inline-BUG Tue Mar > 19 21:56:15 > 2002 > > +++ 2.4.19-pre3-akpm/include/asm-i386/highmem.h Tue Mar 19 21:56:15 2002 > > @@ -62,7 +62,7 @@ extern void FASTCALL(kunmap_high(struct > > static inline void *kmap(struct page *page) > > { > > if (in_interrupt()) > > - BUG(); > > + out_of_line_bug(); > > if (page < highmem_start_page) > > return page_address(page); > > return kmap_high(page); > > @@ -71,7 +71,7 @@ static inline void *kmap(struct page *pa > > static inline void kunmap(struct page *page) > > { > > if (in_interrupt()) > > - BUG(); > > + out_of_line_bug(); > > if (page < highmem_start_page) > > return; > > kunmap_high(page); > > @@ -95,7 +95,7 @@ static inline void *kmap_atomic(struct p > > vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); > > #if HIGHMEM_DEBUG > > if (!pte_none(*(kmap_pte-idx))) > > - BUG(); > > + out_of_line_bug(); > > #endif > > set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); > > __flush_tlb_one(vaddr); > > @@ -113,7 +113,7 @@ static inline void kunmap_atomic(void *k > > return; > > > > if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx)) > > - BUG(); > > + out_of_line_bug(); > > > > /* > > * force other mappings to Oops if they'll try to access > > --- 2.4.19-pre3/include/net/tcp.h~inline-BUG Tue Mar 19 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/include/net/tcp.h Tue Mar 19 21:56:15 2002 > > @@ -1329,8 +1329,6 @@ static __inline__ int tcp_prequeue(struc > > if (tp->ucopy.memory > sk->rcvbuf) { > > struct sk_buff *skb1; > > > > - if (sk->lock.users) BUG(); > > - > > while ((skb1 = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) { > > sk->backlog_rcv(sk, skb1); > > NET_INC_STATS_BH(TCPPrequeueDropped); > > --- 2.4.19-pre3/fs/open.c~inline-BUG Tue Mar 19 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/fs/open.c Tue Mar 19 21:56:15 2002 > > @@ -71,6 +71,30 @@ out: > > return error; > > } > > > > +/* > > + * Install a file pointer in the fd array. > > + * > > + * The VFS is full of places where we drop the files lock between > > + * setting the open_fds bitmap and installing the file in the file > > + * array. At any such point, we are vulnerable to a dup2() race > > + * installing a file in the array before us. We need to > detect this and > > + * fput() the struct file we are about to overwrite in this case. > > + * > > + * It should never happen - if we allow dup2() do it, _really_ > bad things > > + * will follow. > > + */ > > + > > +void fd_install(unsigned int fd, struct file * file) > > +{ > > + struct files_struct *files = current->files; > > + > > + write_lock(&files->file_lock); > > + if (files->fd[fd]) > > + BUG(); > > + files->fd[fd] = file; > > + write_unlock(&files->file_lock); > > +} > > + > > int do_truncate(struct dentry *dentry, loff_t length) > > { > > struct inode *inode = dentry->d_inode; > > --- 2.4.19-pre3/kernel/ksyms.c~inline-BUG Tue Mar 19 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/kernel/ksyms.c Tue Mar 19 21:56:15 2002 > > @@ -164,6 +164,7 @@ EXPORT_SYMBOL(mark_buffer_dirty); > > EXPORT_SYMBOL(set_buffer_async_io); /* for reiserfs_writepage */ > > EXPORT_SYMBOL(__mark_buffer_dirty); > > EXPORT_SYMBOL(__mark_inode_dirty); > > +EXPORT_SYMBOL(fd_install); > > EXPORT_SYMBOL(get_empty_filp); > > EXPORT_SYMBOL(init_private_file); > > EXPORT_SYMBOL(filp_open); > > @@ -452,6 +453,7 @@ EXPORT_SYMBOL(nr_running); > > > > /* misc */ > > EXPORT_SYMBOL(panic); > > +EXPORT_SYMBOL(out_of_line_bug); > > EXPORT_SYMBOL(sprintf); > > EXPORT_SYMBOL(snprintf); > > EXPORT_SYMBOL(sscanf); > > --- 2.4.19-pre3/kernel/panic.c~inline-BUG Tue Mar 19 21:56:15 2002 > > +++ 2.4.19-pre3-akpm/kernel/panic.c Tue Mar 19 21:56:15 2002 > > @@ -124,3 +124,21 @@ const char *print_tainted() > > } > > > > int tainted = 0; > > + > > +/* > > + * A BUG() call in an inline function in a header should be avoided, > > + * because it can seriously bloat the kernel. So here we have > > + * helper functions. > > + * We lose the BUG()-time file-and-line info this way, but it's > > + * usually not very useful from an inline anyway. The backtrace > > + * tells us what we want to know. > > + */ > > + > > +void out_of_line_bug(void) > > +{ > > + BUG(); > > + > > + /* Satisfy __attribute__((noreturn)) */ > > + for ( ; ; ) > > + ; > > +} > > > > > > - > > - > > To unsubscribe from this list: send the line "unsubscribe > linux-kernel" in > > the body of a message to [EMAIL PROTECTED] > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > Please read the FAQ at http://www.tux.org/lkml/ > > >