Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261393AbVEaI5Z (ORCPT ); Tue, 31 May 2005 04:57:25 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261412AbVEaI5Y (ORCPT ); Tue, 31 May 2005 04:57:24 -0400 Received: from lirs02.phys.au.dk ([130.225.28.43]:4562 "EHLO lirs02.phys.au.dk") by vger.kernel.org with ESMTP id S261393AbVEaIye (ORCPT ); Tue, 31 May 2005 04:54:34 -0400 Date: Tue, 31 May 2005 10:53:28 +0200 (METDST) From: Esben Nielsen To: Karim Yaghmour Cc: Nick Piggin , kus Kusche Klaus , James Bruce , "Bill Huey (hui)" , Andi Kleen , Sven-Thorsten Dietrich , Ingo Molnar , dwalker@mvista.com, hch@infradead.org, akpm@osdl.org, linux-kernel@vger.kernel.org Subject: Re: RT patch acceptance In-Reply-To: <429B70F2.20602@opersys.com> Message-Id: Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 12918 Lines: 388 On Mon, 30 May 2005, Karim Yaghmour wrote: > > Here's for the fun of history, a diff between the 8390.c in 2.2.16 and the > one in rt-net 0.9.0: Hats off! But it goes two ways: If the driver is running RT RTAI, the same driver is running RT under PREEMPT_RT - with no modifications :-) Esben > > 0a1,12 > > /* > > rtnet/module/driver/8390.c > > driver for 8390-based network interfaces > > > > rtnet - real-time networking subsystem > > Copyright (C) 1999,2000 Zentropic Computing, LLC > > > > This file is a modified version of a source file located in the > > standard Linux source tree. Information about how to find the > > original version of this file is located in rtnet/original_files. > > */ > > > 49a62,63 > > #define EXPORT_SYMTAB > > > 71a86,137 > > #if defined(CONFIG_RTNET) || defined(CONFIG_RTNET_MODULE) > > #include > > #define RT_DRIVER > > static int ei_rt_start_xmit(struct sk_buff *skb, struct rt_device *rtdev); > > #define RT_dev_alloc_skb(a) ((!ei_local->rt)?dev_alloc_skb(a):dev_alloc_rtskb(a)) > > #define RT_mark_bh(a) do{if(!ei_local->rt)mark_bh(a);}while(0) > > #define RT_dev_kfree_skb(a) do{if(!ei_local->rt){dev_kfree_skb(a);}else{dev_kfree_rtskb(a);}}while(0) > > #define RT_netif_rx(a) ((!ei_local->rt)?netif_rx(a):rtnetif_rx(a)) > > #define RT_printk(format,args...) rt_printk(format,##args) > > #define RT_enable_irq(a) do{if(!ei_local->rt)enable_irq(a);else rt_enable_irq(a);}while(0) > > #define RT_disable_irq_nosync(a) do{if(!ei_local->rt)disable_irq_nosync(a);else rt_disable_irq(a);}while(0) > > #define RT_spin_lock(a) \ > > do{if(!ei_local->rt){ \ > > spin_lock(a); \ > > }else{ \ > > rt_spin_lock(a); \ > > }}while(0) > > #define RT_spin_unlock(a) \ > > do{if(!ei_local->rt){ \ > > spin_unlock(a); \ > > }else{ \ > > rt_spin_unlock(a); \ > > }}while(0) > > #define RT_spin_lock_irqsave(a,b) \ > > do{if(!ei_local->rt){ \ > > spin_lock_irqsave(a,b); \ > > }else{ \ > > (b)=rt_spin_lock_irqsave(a); \ > > }}while(0) > > #define RT_spin_unlock_irqrestore(a,b) \ > > do{if(!ei_local->rt){ \ > > spin_unlock_irqrestore(a,b); \ > > }else{ \ > > rt_spin_unlock_irqrestore(b,a); \ > > }}while(0) > > #define RT_spin_lock_init(a) spin_lock_init(a) > > #else > > #define DIFE(a,b) (a) > > #define RT_dev_alloc_skb dev_alloc_skb > > #define RT_mark_bh(a) mark_bh(a) > > #define RT_dev_kfree_skb(a) dev_kfree_skb(a) > > #define RT_netif_rx(a) netif_rx(a) > > #define RT_printk printk > > #define RT_enable_irq(a) enable_irq(a) > > #define RT_disable_irq_nosync(a) disable_irq_nosync(a) > > #define RT_spin_lock(a) spin_lock(a) > > #define RT_spin_unlock(a) spin_unlock(a) > > #define RT_spin_lock_irqsave(a,b) spin_lock_irqsave(a,b) > > #define RT_spin_unlock_irqrestore(a,b) spin_unlock_irqrestore(a,b) > > #define RT_spin_lock_init(a) spin_lock_init(a) > > #endif > > > 157c223 > < printk(KERN_EMERG "%s: ei_open passed a non-existent device!\n", dev->name); > --- > > RT_printk(KERN_EMERG "%s: ei_open passed a non-existent device!\n", dev->name); > 166c232 > < spin_lock_irqsave(&ei_local->page_lock, flags); > --- > > RT_spin_lock_irqsave(&ei_local->page_lock, flags); > 171c237 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 186c252 > < spin_lock_irqsave(&ei_local->page_lock, flags); > --- > > RT_spin_lock_irqsave(&ei_local->page_lock, flags); > 188c254 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 192a259,267 > > #ifdef RT_DRIVER > > static int ei_start_xmit(struct sk_buff *skb, struct device *dev); > > > > static int ei_rt_start_xmit(struct sk_buff *skb, struct rt_device *rtdev) > > { > > return ei_start_xmit(skb,rtdev->dev); > > } > > #endif > > > 218c293 > < spin_lock_irqsave(&ei_local->page_lock, flags); > --- > > RT_spin_lock_irqsave(&ei_local->page_lock, flags); > 222c297 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 230,231c305,306 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > < printk(KERN_WARNING "%s: xmit on stopped card\n", dev->name); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > > RT_printk(KERN_WARNING "%s: xmit on stopped card\n", dev->name); > 241c316 > < printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n", > --- > > RT_printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n", > 256c331 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 260,261c335,336 > < disable_irq_nosync(dev->irq); > < spin_lock(&ei_local->page_lock); > --- > > RT_disable_irq_nosync(dev->irq); > > RT_spin_lock(&ei_local->page_lock); > 263a339 > > /* XXX not realtime! */ > 267,268c343,344 > < spin_unlock(&ei_local->page_lock); > < enable_irq(dev->irq); > --- > > RT_spin_unlock(&ei_local->page_lock); > > RT_enable_irq(dev->irq); > 279c355 > < spin_lock_irqsave(&ei_local->page_lock, flags); > --- > > RT_spin_lock_irqsave(&ei_local->page_lock, flags); > 281c357 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 288c364 > < disable_irq_nosync(dev->irq); > --- > > RT_disable_irq_nosync(dev->irq); > 290c366 > < spin_lock(&ei_local->page_lock); > --- > > RT_spin_lock(&ei_local->page_lock); > 294c370 > < printk(KERN_WARNING "%s: Tx request while isr active.\n",dev->name); > --- > > RT_printk(KERN_WARNING "%s: Tx request while isr active.\n",dev->name); > 296,297c372,373 > < spin_unlock(&ei_local->page_lock); > < enable_irq(dev->irq); > --- > > RT_spin_unlock(&ei_local->page_lock); > > RT_enable_irq(dev->irq); > 299c375 > < dev_kfree_skb(skb); > --- > > RT_dev_kfree_skb(skb); > 321c397 > < printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n", > --- > > RT_printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n", > 329c405 > < printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n", > --- > > RT_printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n", > 335c411 > < printk(KERN_DEBUG "%s: No Tx buffers free! irq=%ld tx1=%d tx2=%d last=%d\n", > --- > > RT_printk(KERN_DEBUG "%s: No Tx buffers free! irq=%ld tx1=%d tx2=%d last=%d\n", > 340,341c416,417 > < spin_unlock(&ei_local->page_lock); > < enable_irq(dev->irq); > --- > > RT_spin_unlock(&ei_local->page_lock); > > RT_enable_irq(dev->irq); > 393,394c469,470 > < spin_unlock(&ei_local->page_lock); > < enable_irq(dev->irq); > --- > > RT_spin_unlock(&ei_local->page_lock); > > RT_enable_irq(dev->irq); > 396c472 > < dev_kfree_skb (skb); > --- > > RT_dev_kfree_skb (skb); > 414c490 > < printk ("net_interrupt(): irq %d for unknown device.\n", irq); > --- > > RT_printk ("net_interrupt(): irq %d for unknown device.\n", irq); > 425c501 > < spin_lock(&ei_local->page_lock); > --- > > RT_spin_lock(&ei_local->page_lock); > 431c507 > < printk(ei_local->irqlock > --- > > RT_printk(ei_local->irqlock > 437c513 > < spin_unlock(&ei_local->page_lock); > --- > > RT_spin_unlock(&ei_local->page_lock); > 447c523 > < printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name, > --- > > RT_printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name, > 456c532 > < printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name); > --- > > RT_printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name); > 495c571 > < printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n", > --- > > RT_printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n", > 499c575 > < printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts); > --- > > RT_printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts); > 504c580 > < spin_unlock(&ei_local->page_lock); > --- > > RT_spin_unlock(&ei_local->page_lock); > 527c603 > < printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr); > --- > > RT_printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr); > 529c605 > < printk("excess-collisions "); > --- > > RT_printk("excess-collisions "); > 531c607 > < printk("non-deferral "); > --- > > RT_printk("non-deferral "); > 533c609 > < printk("lost-carrier "); > --- > > RT_printk("lost-carrier "); > 535c611 > < printk("FIFO-underrun "); > --- > > RT_printk("FIFO-underrun "); > 537,538c613,614 > < printk("lost-heartbeat "); > < printk("\n"); > --- > > RT_printk("lost-heartbeat "); > > RT_printk("\n"); > 576c652 > < printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n", > --- > > RT_printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n", > 593c669 > < printk("%s: bogus last_tx_buffer %d, tx2=%d.\n", > --- > > RT_printk("%s: bogus last_tx_buffer %d, tx2=%d.\n", > 608c684 > < else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n", > --- > > else RT_printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n", > 641c717 > < mark_bh (NET_BH); > --- > > RT_mark_bh (NET_BH); > 674c750 > < printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n", > --- > > RT_printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n", > 704c780 > < printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", > --- > > RT_printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", > 714c790 > < skb = dev_alloc_skb(pkt_len+2); > --- > > skb = RT_dev_alloc_skb(pkt_len+2); > 718c794 > < printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n", > --- > > RT_printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n", > 730c806 > < netif_rx(skb); > --- > > RT_netif_rx(skb); > 740c816 > < printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n", > --- > > RT_printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n", > 752c828 > < printk("%s: next frame inconsistency, %#2x\n", dev->name, > --- > > RT_printk("%s: next frame inconsistency, %#2x\n", dev->name, > 790c866 > < printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name); > --- > > RT_printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name); > 855c931 > < spin_lock_irqsave(&ei_local->page_lock,flags); > --- > > RT_spin_lock_irqsave(&ei_local->page_lock,flags); > 860c936 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 901c977 > < printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name); > --- > > RT_printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name); > 980c1056 > < spin_lock_irqsave(&ei_local->page_lock, flags); > --- > > RT_spin_lock_irqsave(&ei_local->page_lock, flags); > 982c1058 > < spin_unlock_irqrestore(&ei_local->page_lock, flags); > --- > > RT_spin_unlock_irqrestore(&ei_local->page_lock, flags); > 1004c1080 > < spin_lock_init(&ei_local->page_lock); > --- > > RT_spin_lock_init(&ei_local->page_lock); > 1010a1087,1097 > > #ifdef RT_DRIVER > > { > > struct ei_device *ei_priv = (struct ei_device *)dev->priv; > > > > if(ei_priv->rtdev == NULL) > > ei_priv->rtdev = rt_dev_alloc(dev); > > > > ei_priv->rtdev->xmit = ei_rt_start_xmit; > > } > > #endif > > > 1061c1148 > < printk(KERN_ERR "Hw. address read/write mismap %d\n",i); > --- > > RT_printk(KERN_ERR "Hw. address read/write mismap %d\n",i); > 1098c1185 > < printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n", > --- > > RT_printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n", > > Of course this is ancient, but I just thought I'd illustrate my point. > > Again, I suggest you drop the single vs. double application/driver, you > get the same results and limitations regardless of the RT method you > adopt. > > Karim > -- > Author, Speaker, Developer, Consultant > Pushing Embedded and Real-Time Linux Systems Beyond the Limits > http://www.opersys.com || karim@opersys.com || 1-866-677-4546 > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/