<div style="-webkit-text-size-adjust: auto;">Hi,</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">I find this function __up_writer refering to an anonymous a writer? How does it occur?<br></div><div style="-webkit-text-size-adjust: auto;">```</div><div style="-webkit-text-size-adjust: auto;">// kernel/locking/rwsem.c<br></div><div style="-webkit-text-size-adjust: auto;">static inline void __up_write(struct rw_semaphore *sem)                        <br>{                                                                              <br>        long tmp;                                                              <br>                                                                               <br>        DEBUG_RWSEMS_WARN_ON(sem->magic != sem, sem);                          <br>        /*                                                                     <br>         * sem->owner may differ from current if the ownership is transferred  <br>         * to an anonymous writer by setting the RWSEM_NONSPINNABLE bits.      <br>         */                                                                    <br>        DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) &&                  <br>                            !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE), sem);                <------------------  is it necessary?<br>                                                                               <br>        preempt_disable();                                                     <br>        rwsem_clear_owner(sem);                                                <br>        tmp = atomic_long_fetch_add_release(-RWSEM_WRITER_LOCKED, &sem->count);<br>        if (unlikely(tmp & RWSEM_FLAG_WAITERS))                                <br>                rwsem_wake(sem);                                               <br>        preempt_enable();                                                      <br>}                                                                              <br>```</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">I do a search by using `git blame` and find it's added in this commit 02f1082b003a0cd48f48f12533d969cdbf1c2b63,</div><div style="-webkit-text-size-adjust: auto;">and in this commit d7d760efad70c7a030725499bf9f342f04af24dd, it refers to below situation that can have an anonymous writer:</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">> There are use cases where a rwsem can be acquired by one task, but<br>> released by another task. In thess cases, optimistic spinning may need<br>> to be disabled. One example will be the filesystem freeze/thaw code<br>> where the task that freezes the filesystem will acquire a write lock<br>> on a rwsem and then un-owns it before returning to userspace. Later on,<br>> another task will come along, acquire the ownership, thaw the filesystem<br>> and release the rwsem.<br>><br>> Bit 0 of the owner field was used to designate that it is a reader<br>> owned rwsem. It is now repurposed to mean that the owner of the rwsem<br>> is not known. If only bit 0 is set, the rwsem is reader owned. If bit<br>> 0 and other bits are set, it is writer owned with an unknown owner.<br>> One such value for the latter case is (-1L). So we can set owner to 1 for<br>> reader-owned, -1 for writer-owned. The owner is unknown in both cases.<br>> <br>> To handle transfer of rwsem ownership, the higher level code should<br>> set the owner field to -1 to indicate a write-locked rwsem with unknown<br>> owner. Optimistic spinning will be disabled in this case.<br>> <br>> Once the higher level code figures who the new owner is, it can then<br>> set the owner field accordingly.</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">As it mentions that at higher level, we set -1 to owner subjectively in order to do an owner migration, and I only find it's used in only</div><div style="-webkit-text-size-adjust: auto;">one place, i.e. percpu-rwsem in this commit 5a817641f68a6399a5fac8b7d2da67a73698ffed which has been removed in commit </div><div style="-webkit-text-size-adjust: auto;">7f26482a872c36b2ee87ea95b9dcd96e3d5805df.</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">So does it mean an anonymous writer don't exist at current kernel? should we remove the second condition in this assert check?</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) &&                  <br>                            !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE), sem);</div><div style="-webkit-text-size-adjust: auto;"><br></div><div style="-webkit-text-size-adjust: auto;">Thanks,</div><div style="-webkit-text-size-adjust: auto;">Mu</div>