On 3/5/06, Andrew Morton <[email protected]> wrote:
> Chris Leech <[email protected]> wrote:
> >
> > +#ifdef CONFIG_NET_DMA
> > + tp->ucopy.dma_chan = NULL;
> > + if ((len > sysctl_tcp_dma_copybreak) && !(flags & MSG_PEEK) && !sysctl_tcp_low_latency && __get_cpu_var(softnet_data.net_dma))
> > + dma_lock_iovec_pages(msg->msg_iov, len, &tp->ucopy.locked_list);
> > +#endif
>
> The __get_cpu_var() here will run smp_processor_id() from preemptible
> context. You'll get a big warning if the correct debug options are set.
>
> The reason for this is that preemption could cause this code to hop between
> CPUs.
I've been playing with different models of where to select which DMA
channel to use in order to reduce cache thrash and lock contention in
the driver. It's not a clean per-cpu issue because per I/O there are
potentially operations happening in both the process syscall and the
netrx softirq context.
Right now the code delays selection of a DMA channel until the first
offload copy is ready to go, so the __get_cpu_var() you point out is
just checking to see if any hardware exists for I/OAT at this point
before doing the page pinning. Before anything is done with the
channel the per-cpu pointer is re-read safely with preemption disabled
and a reference count is incremented.
- Chris
-
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/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]