atomic_load_acq_int in sequential_heuristic

Mateusz Guzik mjguzik at gmail.com
Sun Aug 24 11:57:35 UTC 2014


Writer side is:
fp->f_seqcount = (arg + bsize - 1) / bsize;
do {
	new = old = fp->f_flag;
	new |= FRDAHEAD;
} while (!atomic_cmpset_rel_int(&fp->f_flag, old, new));

Reader side is:
if (atomic_load_acq_int(&(fp->f_flag)) & FRDAHEAD)
	return (fp->f_seqcount << IO_SEQSHIFT);

We can easily get the following despite load_acq:
CPU0				CPU1
				load_acq fp->f_flag
fp->f_seqcount = ...
store_rel fp->f_flag
				read fp->f_seqcount
				
So the barrier does not seem to serve any purpose.
Given that this is only a hint and rarely changes it should be fine.

So how about the following:
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index f1d19ac..2e056de 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -438,7 +438,7 @@ static int
 sequential_heuristic(struct uio *uio, struct file *fp)
 {
 
-       if (atomic_load_acq_int(&(fp->f_flag)) & FRDAHEAD)
+       if (fp->f_flag & FRDAHEAD)
                return (fp->f_seqcount << IO_SEQSHIFT);
 
        /*

I make no claims about any performance difference in this one. This is
only a cleanup.

-- 
Mateusz Guzik <mjguzik gmail.com>


More information about the freebsd-hackers mailing list