Messages in this thread | | | Date | Tue, 16 Sep 2008 14:57:16 +0000 (GMT) | From | Michael Trimarchi <> | Subject | Re: [PATCH] VFS: make file->f_pos access atomic on 32bit arch |
| |
Hi,
----- Messaggio originale ----- > Da: Nick Piggin <nickpiggin@yahoo.com.au> > A: Michael Trimarchi <trimarchimichael@yahoo.it> > Cc: Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>; akpm@linux-foundation.org; linux-kernel@vger.kernel.org; linux-fsdevel@vger.kernel.org > Inviato: Martedì 16 settembre 2008, 16:11:21 > Oggetto: Re: [PATCH] VFS: make file->f_pos access atomic on 32bit arch > ... > > i was thinking about introducing a file_pos_update() not implemented using > > file_pos_read()/file_pos_write() and taking the seq_lock or > > disabling preemption only one time > > AFAIK, the only way to do an atomic 64 bit store on 32-bit x86 is > "cmpxchg8b" (with lock prefix on SMP). That would be far slower > I'm sure.
Maybe it is clear with an example: +/* + * file_pos_read/write is atomic by using sequence lock on 32bit arch. + */ +static inline loff_t file_pos_read(struct file *file) +{ +#if BITS_PER_LONG == 32 && defined(CONFIG_SMP) + loff_t pos; + unsigned int seq; + + do { + seq = read_seqbegin(&file->f_pos_seqlock); + pos = file->f_pos; + } while (read_seqretry(&file->f_pos_seqlock, seq)); + return pos; +#elif BITS_PER_LONG == 32 && defined(CONFIG_PREEMPT) + loff_t pos; + + preempt_disable(); + pos = file->f_pos; + preempt_enable(); + return pos; +#else + return file->f_pos; +#endif +} + +static inline void file_pos_write(struct file *file, loff_t pos) +{ +#if BITS_PER_LONG == 32 && defined(CONFIG_SMP) + write_seqlock(&file->f_pos_seqlock); + file->f_pos = pos; + write_sequnlock(&file->f_pos_seqlock); +#elif BITS_PER_LONG == 32 && defined(CONFIG_PREEMPT) + preempt_disable(); + file->f_pos = pos; + preempt_enable(); +#else + file->f_pos = pos; +#endif +} + if (offset != file_pos_read(file)) file_pos_write(file, offset);
Compile with: BITS_PER_LONG=32 CONFIG_PREEMPT
The code does:
file_pos_read(...) preempt_disable .... preempt_enable
file_pos_write(...) preempt_disable .... preempt_enable
with the file_pos_update() the code does:
preempt_disable ... ... preempt_enable
Regards Michael
__________________________________________________ Do You Yahoo!? Poco spazio e tanto spam? Yahoo! Mail ti protegge dallo spam e ti da tanto spazio gratuito per i tuoi file e i messaggi http://mail.yahoo.it -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |