On Saturday 15 October 2005 07:32, Peter Barada wrote:
>
> I'm not sure about POSIX, but using raw 'down' is frowned upon in the
> kernel since you can end up with processes that take quite a while to
> respond to signals(if at all) since the 'down' is not interruptible.
>
> If I change the lock to use down_interruptible, where in yaffs_fs.c do I
> have to be *very* careful about exitting with an -ERESTARTSYS?
Yes, this is the bit that makes me antsy!
> Actually I've modified the lock/unlock code to be:
>
> atomic_t n_locksRequested = ATOMIC_INIT(0);
> atomic_t n_locksGranted = ATOMIC_INIT(0);
> static unsigned long maxJiffies;
> atomic_t sumLockTime = ATOMIC_INIT(0);
> atomic_t sumLockTimeSquared = ATOMIC_INIT(0);
>
> static void yaffs_GrossLock(yaffs_Device *dev)
> {
> unsigned long reqJiffies, diffJiffies;
> T(YAFFS_TRACE_OS,("yaffs locking\n"));
>
> atomic_inc(&n_locksRequested);
> reqJiffies = jiffies;
> down(&dev->grossLock);
> atomic_inc(&n_locksGranted);
> diffJiffies = jiffies - reqJiffies;
> if (diffJiffies > maxJiffies) {
> maxJiffies = diffJiffies;
> printk("%s: wait %lu for lock\n", __FUNCTION__, maxJiffies);
> }
> atomic_add(diffJiffies, &sumLockTime);
> atomic_add(diffJiffies*diffJiffies, &sumLockTimeSquared);
> }
>
> static void yaffs_GrossUnlock(yaffs_Device *dev)
> {
> int yieldToRequestor;
> T(YAFFS_TRACE_OS,("yaffs unlocking\n"));
>
> yieldToRequestor = atomic_read(&n_locksGranted) - atomic_read
> (&n_locksRequested);
> up(&dev->grossLock);
> if (yieldToRequestor)
> yield();
>
> }
>
>
> Which sees if on an up() if another thread is waiting, and if so, then
> it executes 'yield()' to give the other thread a chance to get in. This
> works much better for two processes trying to access the same YAFFS.
It would seem that the above is a fair thing to do if it improves things for
you.
As previously mentioned, this is not my area of expertise. I just copied
something out of jffs2 or Linux Device Drivers a few years back. I would
appreciate the opinions of anyone with better knowledge.
I don't know if this is something that everyone would always want, so perhaps
this could be conditional code.
> I
> haven't instrumented JFFS/2, but I have a feeling that the asynch
> garbage collection would give better numbers.
My hunch too is that this would give the biggest payback. It would at least
get rid of the outliers (waiting for erase).
> > > 2) Is there anyway to more finely lock YAFFS instead of the gross lock
> > > that exists now?
> > > 3) How can yaffs_file_flush take *so* long is nShortOpCache is set to
> > > zero so yaffs_FlushFilesChunkCache should take no time?
> >
> > Agreed. That does seem rather bizarre. Did the real-world time match the
> > instrumenting?
>
> Yes.
Did these improve with the new yield stuff?
-- CHarles