repost I/OAT fixes
Subsystems (5)
PATCH 1/1 repost I/OAT fixes
I/OAT fixes and missing documentation.
Please pull from,git://lost.foo-projects.org/~cleech/linux-2.6#master
--
Andrew Morton (1):
I/OAT: warning fix
Chris Leech (6):
ioatdma: Push pending transactions to hardware more frequently
ioatdma: Remove the wrappers around read(bwl)/write(bwl) in ioatdma
ioatdma: Remove the use of writeq from the ioatdma driver I/OAT: Add documentation for the tcp_dma_copybreak sysctl I/OAT: Add entries to MAINTAINERS for the DMA memcpy subsystem and ioatdma I/OAT: Only offload copies for TCP when there will be a context switch
Dan Aloni (1):
I/OAT: fix I/OAT for kexec
Jeff Garzik (1):
drivers/dma: handle sysfs errors
Documentation/networking/ip-sysctl.txt | 6 + MAINTAINERS | 12 +++ drivers/dma/dmaengine.c | 22 +++++- drivers/dma/ioatdma.c | 81 ++++++++++++---------- drivers/dma/ioatdma_io.h | 118 --------------------------------- net/ipv4/tcp.c | 26 +++++-- 6 files changed, 100 insertions(+), 165 deletions(-)
commit 3ac82a51550c649c67f42f218e5d1ccc4e865685
Author: Dan Aloni <da\[email protected]> Date: Thu Mar 8 09:57:36 2007 -0800
I/OAT: fix I/OAT for kexec
Under kexec, I/OAT initialization breaks over busy resources because the previous kernel did not release them.
I'm not sure this fix can be considered a complete one but it works for me.
I guess something similar to the *_remove method should occur there..
drivers/dma/ioatdma.c +13 -0
@@ -41,6 +41,7 @@/* internal functions */ static int __devinit ioat_probe (struct pci_dev *pdev,const struct pci_device_id *ent); +static void ioat_shutdown (struct pci_dev *pdev); static void __devexit ioat_remove(struct pci_dev *pdev);static int enumerate_dma_channels (struct ioat_device *device)
@@ -557,6 +558,7 @@ static struct pci_driver ioat_pci_drv = { .name = "ioatdma", .id_table = ioat_pci_tbl, .probe = ioat_probe, + .shutdown = ioat_shutdown, .remove = __devexit_p(ioat_remove), };
@@ -781,9 +783,20 @@ err_request_regions: err_set_dma_mask:pci_disable_device (pdev); err_enable_device: + +printk (KERN_ERR "Intel(R) I/OAT DMA Engine initialization failed\n" ); +return err; } +static void ioat_shutdown (struct pci_dev *pdev) +{ +struct ioat_device *device; + device =pci_get_drvdata (pdev); + +dma_async_device_unregister (&device->common); +} + static void __devexit ioat_remove(struct pci_dev *pdev) {struct ioat_device *device;
commit 1fa77931067fac6fb2fa01008854da9c77cdcd87
Author: Andrew Morton <[email protected]> Date: Thu Mar 8 09:57:36 2007 -0800
I/OAT: warning fix
net/ipv4/tcp.c: In function 'tcp_recvmsg':
net/ipv4/tcp.c:1111: warning: unused variable 'available'
net/ipv4/tcp.c +16 -10
@@ -1110,7 +1110,6 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,long timeo;struct task_struct *user_recv =NULL ;int copied_early =0 ; -int available =0 ;struct sk_buff *skb;lock_sock (sk);
@@ -1139,15 +1138,22 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, tp->ucopy.dma_chan =NULL ;preempt_disable (); skb =skb_peek_tail (&sk->sk_receive_queue); -if (skb) - available =TCP_SKB_CB (skb)->seq + skb->len - (*seq); -if ((available < target) && - (len > sysctl_tcp_dma_copybreak) && !(flags &MSG_PEEK ) && - !sysctl_tcp_low_latency &&__get_cpu_var (softnet_data).net_dma) { -preempt_enable_no_resched (); - tp->ucopy.pinned_list =dma_pin_iovec_pages (msg->msg_iov, len); - }else -preempt_enable_no_resched (); + { +int available =0 ; + +if (skb) + available =TCP_SKB_CB (skb)->seq + skb->len - (*seq); +if ((available < target) && + (len > sysctl_tcp_dma_copybreak) && !(flags &MSG_PEEK ) && + !sysctl_tcp_low_latency && +__get_cpu_var (softnet_data).net_dma) { +preempt_enable_no_resched (); + tp->ucopy.pinned_list = +dma_pin_iovec_pages (msg->msg_iov, len); + }else { +preempt_enable_no_resched (); + } + }#endif do {
commit 8cd23a330acae071adcba62f13c088990da5c9e5
Author: Chris Leech <[email protected]> Date: Thu Mar 8 09:57:36 2007 -0800
I/OAT: Only offload copies for TCP when there will be a context switch The performance wins come with having the DMA copy engine doing the copies in parallel with the context switch. If there is enough data ready on the socket at recv time just use a regular copy.
net/ipv4/tcp.c +7 -3
@@ -1110,6 +1110,8 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,long timeo;struct task_struct *user_recv =NULL ;int copied_early =0 ; +int available =0 ; +struct sk_buff *skb;lock_sock (sk);
@@ -1136,7 +1138,11 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,#ifdef CONFIG_NET_DMA tp->ucopy.dma_chan =NULL ;preempt_disable (); -if ((len > sysctl_tcp_dma_copybreak) && !(flags &MSG_PEEK ) && + skb =skb_peek_tail (&sk->sk_receive_queue); +if (skb) + available =TCP_SKB_CB (skb)->seq + skb->len - (*seq); +if ((available < target) && + (len > sysctl_tcp_dma_copybreak) && !(flags &MSG_PEEK ) && !sysctl_tcp_low_latency &&__get_cpu_var (softnet_data).net_dma) {preempt_enable_no_resched (); tp->ucopy.pinned_list =dma_pin_iovec_pages (msg->msg_iov, len);
@@ -1145,7 +1151,6 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,#endif do { - struct sk_buff *skb; u32 offset; /* Are we at urgent data? Stop if we have read anything or have SIGURG pending. */
@@ -1433,7 +1438,6 @@ skip_copy:#ifdef CONFIG_NET_DMA if (tp->ucopy.dma_chan) { -struct sk_buff *skb;dma_cookie_t done, used;dma_async_memcpy_issue_pending (tp->ucopy.dma_chan);
commit cbd91dd397a1286ac7e5e8d97c666e84ed08de0b
Author: Chris Leech <[email protected]> Date: Thu Mar 8 09:57:36 2007 -0800
I/OAT: Add entries to MAINTAINERS for the DMA memcpy subsystem and ioatdma
MAINTAINERS +12 -0
@@ -1156,6 +1156,12 @@ M: [email protected] L: [email protected] S: Maintained +DMA GENERIC MEMCPY SUBSYSTEM +P: Chris Leech +M: [email protected] +L: [email protected] +S: Maintained + DOCBOOK FOR DOCUMENTATION P: Randy Dunlap M: [email protected]
@@ -1777,6 +1783,12 @@ P: Tigran Aivazian M: [email protected] S: Maintained +INTEL I/OAT DMA DRIVER +P: Chris Leech +M: [email protected] +L: [email protected] +S: Supported + INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT P: Deepak Saxena M: [email protected]
commit 2a333aed28ca11d4fbd7be2792933374d211fb97
Author: Chris Leech <[email protected]> Date: Thu Mar 8 09:57:35 2007 -0800
I/OAT: Add documentation for the tcp_dma_copybreak sysctl
Documentation/networking/ip-sysctl.txt +6 -0
@@ -413,6 +413,12 @@ tcp_workaround_signed_windows - BOOLEAN not receive a window scaling option from them. Default: 0 +tcp_dma_copybreak - INTEGER + Lower limit, in bytes, of the size of socket reads that will be + offloaded to a DMA copy engine, if one is present in the system + and CONFIG_NET_DMA is enabled. + Default: 4096 + CIPSOv4 Variables: cipso_cache_enable - BOOLEAN
commit 892995f3a51a1ff5abe9baddb25cc792d87cf47a
Author: Chris Leech <[email protected]> Date: Thu Mar 8 09:57:35 2007 -0800
ioatdma: Remove the use of writeq from the ioatdma driver There's only one now anyway, and it's not in a performance path, so make it behave the same on 32-bit and 64-bit CPUs.
drivers/dma/ioatdma.c +4 -6
@@ -608,13 +608,11 @@ static void ioat_start_null_desc(struct ioat_dma_chan *ioat_chan)list_add_tail (&desc->node, &ioat_chan->used_desc);spin_unlock_bh (&ioat_chan->desc_lock); -#if (BITS_PER_LONG ==64 ) -writeq (desc->phys, ioat_chan->reg_base +IOAT_CHAINADDR_OFFSET ); -#else -writel ((u32 ) desc->phys, +writel (((u64 ) desc->phys) &0x00000000FFFFFFFF , ioat_chan->reg_base +IOAT_CHAINADDR_OFFSET_LOW ); -writel (0 , ioat_chan->reg_base +IOAT_CHAINADDR_OFFSET_HIGH ); -#endif +writel (((u64 ) desc->phys) >>32 , + ioat_chan->reg_base +IOAT_CHAINADDR_OFFSET_HIGH ); +writeb (IOAT_CHANCMD_START , ioat_chan->reg_base +IOAT_CHANCMD_OFFSET ); }
commit baaf4536e07a0358f0317bd22d98f0c9f18b64c3
Author: Chris Leech <[email protected]> Date: Thu Mar 8 09:57:35 2007 -0800
ioatdma: Remove the wrappers around read(bwl)/write(bwl) in ioatdma
drivers/dma/ioatdma.c +28 -32
155 lines not on this page · raw message
drivers/dma/ioatdma_io.h deleted +0 -118
118 lines not on this page · raw message
commit 09a62b373409fc39d81a32688d7fef3768e8b802
Author: Jeff Garzik <[email protected]> Date: Thu Mar 8 09:57:34 2007 -0800
drivers/dma: handle sysfs errors
From: Jeff Garzik <[email protected]>
drivers/dma/dmaengine.c +20 -2
@@ -312,7 +312,7 @@ void dma_async_client_chan_request(struct dma_client *client,int dma_async_device_register (struct dma_device *device) {static int id; -int chancnt =0 ; +int chancnt =0 , rc;struct dma_chan * chan;if (!device)
@@ -334,8 +334,15 @@ int dma_async_device_register(struct dma_device *device)snprintf (chan->class_dev.class_id,BUS_ID_SIZE ,"dma%dchan%d" , device->dev_id, chan->chan_id); + rc =class_device_register (&chan->class_dev); +if (rc) { + chancnt--; +free_percpu (chan->local); + chan->local =NULL ; + goto err_out; + } +kref_get (&device->refcount); -class_device_register (&chan->class_dev); }mutex_lock (&dma_list_mutex);
@@ -345,6 +352,17 @@ int dma_async_device_register(struct dma_device *device)dma_chans_rebalance ();return 0 ; + +err_out: +list_for_each_entry (chan, &device->channels, device_node) { +if (chan->local ==NULL ) +continue ; +kref_put (&device->refcount, dma_async_device_cleanup); +class_device_unregister (&chan->class_dev); + chancnt--; +free_percpu (chan->local); + } +return rc; }/**
commit 29969b129af92259545fca0cfca55a72bbebcb55
Author: Chris Leech <[email protected]> Date: Thu Mar 8 09:57:33 2007 -0800
ioatdma: Push pending transactions to hardware more frequently Every 20 descriptors turns out to be to few append commands with newer/faster CPUs. Pushing every 4 still cuts down on MMIO writes to an acceptable level without letting the DMA engine run out of work.
drivers/dma/ioatdma.c +2 -2
@@ -310,7 +310,7 @@ static dma_cookie_t do_ioat_dma_memcpy(struct ioat_dma_chan *ioat_chan,list_splice_init (&new_chain, ioat_chan->used_desc.prev); ioat_chan->pending += desc_count; -if (ioat_chan->pending >=20 ) { +if (ioat_chan->pending >=4 ) { append =1 ; ioat_chan->pending =0 ; }
@@ -818,7 +818,7 @@ static void __devexit ioat_remove(struct pci_dev *pdev) }/* MODULE API */ -MODULE_VERSION ("1.7" ); +MODULE_VERSION ("1.9" );MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Intel Corporation" );