All of lore.kernel.org
 help / color / mirror / Atom feed
* [parisc-linux] Anyone got a few moments?
@ 1999-06-28 15:21 Matthew Wilcox
  1999-06-28 17:09 ` Grant Grundler
  0 siblings, 1 reply; 9+ messages in thread
From: Matthew Wilcox @ 1999-06-28 15:21 UTC (permalink / raw)
  To: parisc-linux


Which of the people involved in this project know PA-RISC assembler?

We need xchg() written (in include/asm-parisc/system.h) before the
networking will compile.  We're going to need other stuff written too of
course; I know ARM assembler, so I guess I could probably learn PA-RISC
asm if no-one else wants to.

-- 
Matthew Wilcox <willy@bofh.ai>
"Windows and MacOS are products, contrived by engineers in the service of
specific companies. Unix, by contrast, is not so much a product as it is a
painstakingly compiled oral history of the hacker subculture." - N Stephenson

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 15:21 [parisc-linux] Anyone got a few moments? Matthew Wilcox
@ 1999-06-28 17:09 ` Grant Grundler
  1999-06-28 17:34   ` Matthew Wilcox
  0 siblings, 1 reply; 9+ messages in thread
From: Grant Grundler @ 1999-06-28 17:09 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: parisc-linux

Matthew Wilcox wrote:
> 
> Which of the people involved in this project know PA-RISC assembler?
> 
> We need xchg() written (in include/asm-parisc/system.h) before the
> networking will compile.  We're going to need other stuff written too of
> course; I know ARM assembler, so I guess I could probably learn PA-RISC
> asm if no-one else wants to.

What does xchg() do?

If it's a byte swapper, look at "PA-RISC 2.0 Architecture", by Gerry Kane
from HP Professionl books, page I-6. That's "Programming Notes" section.
Gives examples for "Endian byte swapping" for 32 and 64-bit quantities.
They work - HP-UX is using them.

grant


Grant Grundler
Enterprise Systems Technology Lab
+1.408.447.7253

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 17:09 ` Grant Grundler
@ 1999-06-28 17:34   ` Matthew Wilcox
  1999-06-28 17:47     ` Jeffrey A Law
  0 siblings, 1 reply; 9+ messages in thread
From: Matthew Wilcox @ 1999-06-28 17:34 UTC (permalink / raw)
  To: Grant Grundler; +Cc: Matthew Wilcox, parisc-linux

On Mon, Jun 28, 1999 at 10:09:16AM -0700, Grant Grundler wrote:
> Matthew Wilcox wrote:
> > 
> > Which of the people involved in this project know PA-RISC assembler?
> > 
> > We need xchg() written (in include/asm-parisc/system.h) before the
> > networking will compile.  We're going to need other stuff written too of
> > course; I know ARM assembler, so I guess I could probably learn PA-RISC
> > asm if no-one else wants to.
> 
> What does xchg() do?

/*
 * Atomic [test&set] exchange
 *
 *      void *xchg_u32(void *ptr, unsigned long val)
 * Changes the memory location '*ptr' to be val and returns
 * the previous value stored there.
 */

It's atomic with respect to interrupts and other CPUs.

PA-RISC 2.0 seems to have LDC{W,D}, but that's going to make implementation
a real pain.

> If it's a byte swapper, look at "PA-RISC 2.0 Architecture", by Gerry Kane
> from HP Professionl books, page I-6. That's "Programming Notes" section.
> Gives examples for "Endian byte swapping" for 32 and 64-bit quantities.
> They work - HP-UX is using them.

thanks for the tip.  No-one's written those yet; I'll do those next.

-- 
Matthew Wilcox <willy@bofh.ai>
"Windows and MacOS are products, contrived by engineers in the service of
specific companies. Unix, by contrast, is not so much a product as it is a
painstakingly compiled oral history of the hacker subculture." - N Stephenson

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 17:34   ` Matthew Wilcox
@ 1999-06-28 17:47     ` Jeffrey A Law
  1999-06-28 18:10       ` Matthew Wilcox
  1999-06-28 18:39       ` Alan Cox
  0 siblings, 2 replies; 9+ messages in thread
From: Jeffrey A Law @ 1999-06-28 17:47 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: Grant Grundler, parisc-linux

  In message <19990628193404.I30362@mencheca.ch.genedata.com>you write:
  > > What does xchg() do?
  > 
  > /*
  >  * Atomic [test&set] exchange
  >  *
  >  *      void *xchg_u32(void *ptr, unsigned long val)
  >  * Changes the memory location '*ptr' to be val and returns
  >  * the previous value stored there.
  >  */
  > 
tsk tsk, that is a highly non-portable API for atomic operations.

  > It's atomic with respect to interrupts and other CPUs.
  > 
  > PA-RISC 2.0 seems to have LDC{W,D}, but that's going to make implementation
  > a real pain.
Yes.  Major pain since the only useful atomic operations are load & clear
word/double as you noted.

Why does linux want an "exchange"-like API for atomic operations?  That
just seems totally weird and stupid.


jeff

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 17:47     ` Jeffrey A Law
@ 1999-06-28 18:10       ` Matthew Wilcox
  1999-06-28 18:37         ` Alan Cox
  1999-06-28 18:39       ` Alan Cox
  1 sibling, 1 reply; 9+ messages in thread
From: Matthew Wilcox @ 1999-06-28 18:10 UTC (permalink / raw)
  To: Jeffrey A Law; +Cc: Matthew Wilcox, Grant Grundler, parisc-linux

On Mon, Jun 28, 1999 at 11:47:56AM -0600, Jeffrey A Law wrote:
> Yes.  Major pain since the only useful atomic operations are load & clear
> word/double as you noted.

That does seem to be the majority of uses (based on a grep).  But not all
are, unfortunately:

./drivers/net/slip.c:   rbuff = xchg(&sl->rbuff, rbuff);
./drivers/net/slip.c:   xbuff = xchg(&sl->xbuff, xbuff);
./drivers/net/slip.c:   cbuff = xchg(&sl->cbuff, cbuff);
./drivers/net/slip.c:   slcomp = xchg(&sl->slcomp, slcomp);
./drivers/net/slip.c:   xbuff    = xchg(&sl->xbuff, xbuff);
./drivers/net/slip.c:   rbuff    = xchg(&sl->rbuff, rbuff);
./drivers/net/slip.c:   cbuff    = xchg(&sl->cbuff, cbuff);
./drivers/scsi/scsi_queue.c:    cpnt = xchg(&host->pending_commands, cmd);
./drivers/scsi/scsi_queue.c:    cmd = xchg(&host->pending_commands, cpnt);
./fs/smbfs/sock.c:      data_ready = xchg(&sk->data_ready, smb_data_callback);
./fs/smbfs/sock.c:      data_ready = xchg(&sk->data_ready, server->data_ready);
./kernel/sys.c: mask = xchg(&current->fs->umask, mask & S_IRWXUGO);
./mm/slab.c:    if (xchg((unsigned long *)objp, SLAB_RED_MAGIC2) != SLAB_RED_MAG
IC1)
./mm/slab.c:    if (xchg((unsigned long *)(objp+cachep->c_org_size), SLAB_RED_MA
GIC2) != SLAB_RED_MAGIC1)
./mm/slab.c:    if (xchg((unsigned long *)objp, SLAB_RED_MAGIC1) != SLAB_RED_MAG
IC2) {
./mm/slab.c:    if (xchg((unsigned long *)(objp+cachep->c_org_size+BYTES_PER_WOR
D), SLAB_RED_MAGIC1) != SLAB_RED_MAGIC2) {
./net/core/utils.c:     toks += now - xchg(&last_msg, now);
./net/ipv4/ip_forward.c:                        dst_release(xchg(&skb->dev->fast
path[h], dst_clone(&rt->u.dst)));
./net/ipv4/ip_sockglue.c:                       opt = xchg(&sk->opt, opt);
./net/ipv4/tcp_ipv4.c:  dst_release(xchg(&sk->dst_cache, rt));
./net/ipv4/tcp_ipv4.c:          dst_release(xchg(&sk->dst_cache, &rt->u.dst));
./net/ipv6/ipv6_sockglue.c:             opt = xchg(&np->opt, opt);
./net/ipv6/tcp_ipv6.c:                          skb = xchg(&sk->net_pinfo.af_ine
t6.pktoptions, skb2);
./net/sched/cls_rsvp.h:                 tcf_police_release(xchg(&f->police, poli
ce));
./net/sched/cls_u32.c:          ht_down = xchg(&n->ht_down, ht_down);
./net/sched/cls_u32.c:          tcf_police_release(xchg(&n->police, police));
./net/sched/sch_cbq.c:          if ((*old = xchg(&cl->q, new)) != NULL)
./net/sched/sch_cbq.c:                  rtab = xchg(&cl->R_tab, rtab);
./net/sched/sch_generic.c:      qdisc = xchg(&dev->qdisc, &noop_qdisc);
./net/sched/sch_prio.c: *old = xchg(&q->queues[band], new);
./net/sched/sch_teql.c:         teql_neigh_release(xchg(&q->ncache, n));


and that's it.  That's only 31 uses where xchg couldn't be replaced
with get_and_zero.  I suspect most of these are using this mechanism to
walk a list without using a spinlock.  The slab uses are debug code only
(so they aren't performance critical by any means).  I bet most of these
uses could be removed without _too_ many problems.  I wonder what Linus'
opinion is on this.

-- 
Matthew Wilcox <willy@bofh.ai>
"Windows and MacOS are products, contrived by engineers in the service of
specific companies. Unix, by contrast, is not so much a product as it is a
painstakingly compiled oral history of the hacker subculture." - N Stephenson

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 18:10       ` Matthew Wilcox
@ 1999-06-28 18:37         ` Alan Cox
  1999-06-28 19:00           ` Matthew Wilcox
  0 siblings, 1 reply; 9+ messages in thread
From: Alan Cox @ 1999-06-28 18:37 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: law, Matthew.Wilcox, grundler, parisc-linux

> > Yes.  Major pain since the only useful atomic operations are load & clear
> > word/double as you noted.
> 
> and that's it.  That's only 31 uses where xchg couldn't be replaced
> with get_and_zero.  I suspect most of these are using this mechanism to
> walk a list without using a spinlock.  The slab uses are debug code only
> (so they aren't performance critical by any means).  I bet most of these
> uses could be removed without _too_ many problems.  I wonder what Linus'
> opinion is on this.

The sparc only has swap byte with 0xFF. They also have to use a small spinlock
for doing 32/64bit xchg ops. Thats ok. Xchg is only hopefully fast - since
on most machines xchg is a bus locker or pushes to ram the difference will
be minimal. 

The Alpha/Mips probably have it the nicest with the load locked/conditional
store.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 17:47     ` Jeffrey A Law
  1999-06-28 18:10       ` Matthew Wilcox
@ 1999-06-28 18:39       ` Alan Cox
  1 sibling, 0 replies; 9+ messages in thread
From: Alan Cox @ 1999-06-28 18:39 UTC (permalink / raw)
  To: law; +Cc: Matthew.Wilcox, grundler, parisc-linux

> Yes.  Major pain since the only useful atomic operations are load & clear
> word/double as you noted.
> 
> Why does linux want an "exchange"-like API for atomic operations?  That
> just seems totally weird and stupid.

Its very very efficient if you have an exchange operation or you have
ll/sc. Most platforms Linux runs on have these.

Alan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 18:37         ` Alan Cox
@ 1999-06-28 19:00           ` Matthew Wilcox
  1999-06-28 19:12             ` Alan Cox
  0 siblings, 1 reply; 9+ messages in thread
From: Matthew Wilcox @ 1999-06-28 19:00 UTC (permalink / raw)
  To: Alan Cox; +Cc: Matthew Wilcox, law, grundler, parisc-linux

On Mon, Jun 28, 1999 at 07:37:05PM +0100, Alan Cox wrote:
> > > Yes.  Major pain since the only useful atomic operations are load & clear
> > > word/double as you noted.
> > 
> > and that's it.  That's only 31 uses where xchg couldn't be replaced
> > with get_and_zero.  I suspect most of these are using this mechanism to
> > walk a list without using a spinlock.  The slab uses are debug code only
> > (so they aren't performance critical by any means).  I bet most of these
> > uses could be removed without _too_ many problems.  I wonder what Linus'
> > opinion is on this.
> 
> The sparc only has swap byte with 0xFF. They also have to use a small spinlock
> for doing 32/64bit xchg ops. Thats ok. Xchg is only hopefully fast - since
> on most machines xchg is a bus locker or pushes to ram the difference will
> be minimal. 

Okay.  Do you think we stand a chance of pushing a new call past linux
-- get_and_zero(*ptr), as this will make most of the calls efficient
on PA-RISC?  Or would a better idea be to check if the argument to be
swapped is zero; if it is use the special instructions; if not fall back
to a spinlock?

-- 
Matthew Wilcox <willy@bofh.ai>
"Windows and MacOS are products, contrived by engineers in the service of
specific companies. Unix, by contrast, is not so much a product as it is a
painstakingly compiled oral history of the hacker subculture." - N Stephenson

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [parisc-linux] Anyone got a few moments?
  1999-06-28 19:00           ` Matthew Wilcox
@ 1999-06-28 19:12             ` Alan Cox
  0 siblings, 0 replies; 9+ messages in thread
From: Alan Cox @ 1999-06-28 19:12 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: alan, Matthew.Wilcox, law, grundler, parisc-linux

> Okay.  Do you think we stand a chance of pushing a new call past linux
> -- get_and_zero(*ptr), as this will make most of the calls efficient
> on PA-RISC?  Or would a better idea be to check if the argument to be
> swapped is zero; if it is use the special instructions; if not fall back
> to a spinlock?

For now I'd get it working with xchg() - the zero check isnt worth it. Get
it going the stupid way then worry

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~1999-06-28 19:16 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
1999-06-28 15:21 [parisc-linux] Anyone got a few moments? Matthew Wilcox
1999-06-28 17:09 ` Grant Grundler
1999-06-28 17:34   ` Matthew Wilcox
1999-06-28 17:47     ` Jeffrey A Law
1999-06-28 18:10       ` Matthew Wilcox
1999-06-28 18:37         ` Alan Cox
1999-06-28 19:00           ` Matthew Wilcox
1999-06-28 19:12             ` Alan Cox
1999-06-28 18:39       ` Alan Cox

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.