Hi, On Fri, Jun 14, 2019 at 4:56 AM Ulf Hansson <ulf.hansson@xxxxxxxxxx> wrote: > > > I was more worried about the safety of mmc_card_set_suspended() > > itself. That is: > > > > #define mmc_card_set_suspended(c) ((c)->state |= MMC_STATE_SUSPENDED) > > > > ...so it's doing a read-modify-write of "state". Is that safe to do > > without any type of locking? > > In this case, yes I think so. > > The point is, it really doesn't matter if the reader (work or thread), > reads a non-updated value, because the synchronization is managed by > the later mmc_claim_host() and the cancel_delayed_work_sync(). If this were just an "int" then perhaps, but this is a bitfield. So if someone else updates the bitfield at the same time then we can fully clobber their modification or they can clobber ours, right? task 1: load "state" from memory into CPU register on cpu0 task 2: load "state" from memory into CPU register on cpu1 task 1: OR in MMC_CARD_REMOVED task 1: write "state" from CPU register on cpu0 task 2: OR in MMC_STATE_SUSPENDED task 2: write "state" from CPU register on cpu1 ...so now we've clobbered MMC_CARD_REMOVED. ...or am I just being paranoid here and everything else in "state" is somehow guaranteed to not be touched at the same time this function is running? -Doug