* Re: sysmips call and glibc atomic set [not found] <3A46F4D8.9060605@redhat.com> @ 2000-12-26 16:02 ` Ralf Baechle 2000-12-26 16:49 ` Joe deBlaquiere 2000-12-28 12:06 ` Maciej W. Rozycki 0 siblings, 2 replies; 5+ messages in thread From: Ralf Baechle @ 2000-12-26 16:02 UTC (permalink / raw) To: Joe deBlaquiere; +Cc: the list, linux-mips, linux-mips On Mon, Dec 25, 2000 at 01:18:48AM -0600, Joe deBlaquiere wrote: > I'm working with a vr4181 target and started digging into the atomic > test and set stuff in the kernel and glibc. The first problem I had was > that the glibc code assumes that all mips III targets implement the mips > III ISA (funny assumption, no?) but the vr4181 doesn't include the > miltiprocessor oriented LL/SC operations for atomic test and set. Ok, but since the kernel disables MIPS III you're limited to MIPS II anyway ... > So I started looking at the glibc code (yes, I know this is the kernel > list... I'm getting there I promise) and notice the following operations: > > __asm__ __volatile__ > (".set mips2\n\t" > "/* Inline spinlock test & set */\n\t" > "1:\n\t" > "ll %0,%3\n\t" > ".set push\n\t" > ".set noreorder\n\t" > "bnez %0,2f\n\t" > " li %1,1\n\t" > ".set pop\n\t" > "sc %1,%2\n\t" > "beqz %1,1b\n" > "2:\n\t" > "/* End spinlock test & set */" > : "=&r" (ret), "=&r" (temp), "=m" (*spinlock) > : "m" (*spinlock) > : "memory"); > > The significant code here being the 'll' and 'sc' operations which are > supposed to ensure that the operation is atomic. > > QUESTION 1) Will this _ALWAYS_ work from user land? I realize the > operations are temporally close, but isn't there the possibility that an > interrupt occurs in the meantime? Read the ISA manual; sc will fail if the LL-bit in c0_status is cleared which will be cleared when the interrupt returns using the eret instruction. > Of course none of this code applies to my case anyway, since the vr4181 > doesn't implement these ops. So once I hack^H^H^H^Hadjust glibc to use > the 'mips1' implementation, it uses the sysmips system call. regard : > > _test_and_set (int *p, int v) __THROW > { > return sysmips (MIPS_ATOMIC_SET, (int) p, v, 0); > } > > So then I looked at the kernel and find the code below. The system I'm > working with is expressedly uniprocessor and doesn't have any swap, so > it looks like the initial caveats are met, but it looks to me like there > could be some confusion if the value of *arg1 at entry looks like > -ENOSYS or something like that. Not having swap doesn't mean you're safe. Think of any kind of previously unmapped page. > QUESTION 2) Wouldn't it be better to pass back the initial value of > *arg1 in *arg3 and return zero or negative error code? The semantics of this syscall were previously defined by Risc/OS and later on continued to be used by IRIX. > case MIPS_ATOMIC_SET: { > /* This is broken in case of page faults and SMP ... > Risc/OS faults after maximum 20 tries with EAGAIN. */ > unsigned int tmp; > > p = (int *) arg1; > errno = verify_area(VERIFY_WRITE, p, sizeof(*p)); > if (errno) > return errno; > errno = 0; > save_and_cli(flags); > errno |= __get_user(tmp, p); > errno |= __put_user(arg2, p); > restore_flags(flags); > > if (errno) > return tmp; > > return tmp; /* This is broken ... */ > } > > QUESTION 3) I notice that the code for this particular case of sysmips > has changed recently. The old code looked more like the 'll/sc' version > of glibc above. I would think that the 'll/sc' code would be better on > SMP systems. Don't think about SMP without ll/sc. There's algorithems available for that but their complexity leaves them a unpractical, theoretical construct. > Is there a good reason why this reverted? Above code will break if the old content of memory has bit 31 set or you take pagefaults. The latter problem is a problem even on UP - think multi- threading. Finally, post such things to one of the MIPS-related mailing lists. If you're unlucky nobody of the MIPS'ers might see your posting on l-k. Ralf ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: sysmips call and glibc atomic set 2000-12-26 16:02 ` sysmips call and glibc atomic set Ralf Baechle @ 2000-12-26 16:49 ` Joe deBlaquiere 2000-12-26 20:53 ` Pavel Machek 2000-12-28 12:25 ` Maciej W. Rozycki 2000-12-28 12:06 ` Maciej W. Rozycki 1 sibling, 2 replies; 5+ messages in thread From: Joe deBlaquiere @ 2000-12-26 16:49 UTC (permalink / raw) To: Ralf Baechle; +Cc: the list, linux-mips, linux-mips Ralf, firstly, thank you for the answers :) Ralf Baechle wrote: > > Ok, but since the kernel disables MIPS III you're limited to MIPS II anyway ... > This makes sense... > > > Read the ISA manual; sc will fail if the LL-bit in c0_status is cleared > which will be cleared when the interrupt returns using the eret instruction. > I tried to find a MIPSIII manual from mips.com but all I could find was mips32 and mips64 (which are not the same as MIPSII/MIPSIII/MIPSIV). > > > Not having swap doesn't mean you're safe. Think of any kind of previously > unmapped page. > Is there a reason why it doesn't just force that page to be mapped first? > >> QUESTION 2) Wouldn't it be better to pass back the initial value of >> *arg1 in *arg3 and return zero or negative error code? > > > The semantics of this syscall were previously defined by Risc/OS and later > on continued to be used by IRIX. > > >> case MIPS_ATOMIC_SET: { >> /* This is broken in case of page faults and SMP ... >> Risc/OS faults after maximum 20 tries with EAGAIN. */ >> unsigned int tmp; >> >> p = (int *) arg1; >> errno = verify_area(VERIFY_WRITE, p, sizeof(*p)); >> if (errno) >> return errno; >> errno = 0; >> save_and_cli(flags); >> errno |= __get_user(tmp, p); >> errno |= __put_user(arg2, p); >> restore_flags(flags); >> >> if (errno) >> return tmp; >> >> return tmp; /* This is broken ... */ >> } >> >> QUESTION 3) I notice that the code for this particular case of sysmips >> has changed recently. The old code looked more like the 'll/sc' version >> of glibc above. I would think that the 'll/sc' code would be better on >> SMP systems. > > > Don't think about SMP without ll/sc. There's algorithems available for > that but their complexity leaves them a unpractical, theoretical construct. > > >> Is there a good reason why this reverted? > Looking at 2.4.0-test5 I see the ll/sc code, but -test12 doesn't use it. I was just curious at why it was taken out. > > Above code will break if the old content of memory has bit 31 set or you take > pagefaults. The latter problem is a problem even on UP - think multi- > threading. > > Finally, post such things to one of the MIPS-related mailing lists. If > you're unlucky nobody of the MIPS'ers might see your posting on l-k. > > Ralf -- Joe deBlaquiere Red Hat, Inc. 307 Wynn Drive Huntsville AL, 35805 voice : (256)-704-9200 fax : (256)-837-3839 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: sysmips call and glibc atomic set 2000-12-26 16:49 ` Joe deBlaquiere @ 2000-12-26 20:53 ` Pavel Machek 2000-12-28 12:25 ` Maciej W. Rozycki 1 sibling, 0 replies; 5+ messages in thread From: Pavel Machek @ 2000-12-26 20:53 UTC (permalink / raw) To: Joe deBlaquiere, Ralf Baechle; +Cc: the list, linux-mips, linux-mips Hi! > > Not having swap doesn't mean you're safe. Think of any kind of previously > > unmapped page. > > > > Is there a reason why it doesn't just force that page to be mapped > first? You can map it in... But background daemon can map it out in the meantime :-). You'd have to map in and pagelock. Pavel -- I'm pavel@ucw.cz. "In my country we have almost anarchy and I don't care." Panos Katsaloulis describing me w.r.t. patents at discuss@linmodems.org ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: sysmips call and glibc atomic set 2000-12-26 16:49 ` Joe deBlaquiere 2000-12-26 20:53 ` Pavel Machek @ 2000-12-28 12:25 ` Maciej W. Rozycki 1 sibling, 0 replies; 5+ messages in thread From: Maciej W. Rozycki @ 2000-12-28 12:25 UTC (permalink / raw) To: Joe deBlaquiere; +Cc: Ralf Baechle, the list, linux-mips, linux-mips On Tue, 26 Dec 2000, Joe deBlaquiere wrote: > > Read the ISA manual; sc will fail if the LL-bit in c0_status is cleared > > which will be cleared when the interrupt returns using the eret instruction. > > I tried to find a MIPSIII manual from mips.com but all I could find was > mips32 and mips64 (which are not the same as MIPSII/MIPSIII/MIPSIV). Get "IDT MIPS Microprocessor Software Reference Manual" from http://decstation.unix-ag.org/docs/ic_docs/3715.pdf (the original is no longer available from IDT servers). -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: sysmips call and glibc atomic set 2000-12-26 16:02 ` sysmips call and glibc atomic set Ralf Baechle 2000-12-26 16:49 ` Joe deBlaquiere @ 2000-12-28 12:06 ` Maciej W. Rozycki 1 sibling, 0 replies; 5+ messages in thread From: Maciej W. Rozycki @ 2000-12-28 12:06 UTC (permalink / raw) To: Ralf Baechle; +Cc: Joe deBlaquiere, the list, linux-mips, linux-mips On Tue, 26 Dec 2000, Ralf Baechle wrote: > The semantics of this syscall were previously defined by Risc/OS and later > on continued to be used by IRIX. Ralf, could you please provide me a copy of a man page for the call? I don't have access to either of the systems and a search of the Net returned nothing. > Don't think about SMP without ll/sc. There's algorithems available for > that but their complexity leaves them a unpractical, theoretical construct. For SMP there is a simple kernel solution available. It suitable for a syscall or a ll/sc emulation. There is no easy userland-only solution AFAIK. > Above code will break if the old content of memory has bit 31 set or you take > pagefaults. The latter problem is a problem even on UP - think multi- > threading. If the code is written carefully you don't ever get a pagefault that would break consistency. -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2000-12-28 12:29 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <3A46F4D8.9060605@redhat.com>
2000-12-26 16:02 ` sysmips call and glibc atomic set Ralf Baechle
2000-12-26 16:49 ` Joe deBlaquiere
2000-12-26 20:53 ` Pavel Machek
2000-12-28 12:25 ` Maciej W. Rozycki
2000-12-28 12:06 ` Maciej W. Rozycki
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox