Hi, ----- Messaggio originale ----- > Da: Nick Piggin <nickpiggin@xxxxxxxxxxxx> > A: Michael Trimarchi <trimarchimichael@xxxxxxxx> > Cc: Hisashi Hifumi <hifumi.hisashi@xxxxxxxxxxxxx>; akpm@xxxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; linux-fsdevel@xxxxxxxxxxxxxxx > 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-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html