mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 19:19:32 +03:00
Linux 5.2 compat: rw_tryupgrade()
Commit torvalds/linux@46ad0840b has removed the architecture specific rwsem source and headers leaving only the generic version. As part of this change the RWSEM_ACTIVE_READ_BIAS and RWSEM_ACTIVE_WRITE_BIAS macros were moved to the private kernel/locking/rwsem.h header. This results in a build failure because these macros were required to implement the rw_tryupgrade() compatibility function. In practice, this isn't a major problem because there are only a few consumers of rw_tryupgrade() and because consumers of rw_tryupgrade should be written to retry using rw_enter(RW_WRITER). After auditing all of the callers only dmu_zfetch() was determined not to perform a retry. It has been updated in this commit to resolve this issue. That said, the rw_tryupgrade() functionality should be considered for possible removal in a future release due to the difficultly in supporting the interface. Reviewed-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com> Reviewed-by: Chunwei Chen <tuxoko@gmail.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #8730
This commit is contained in:
parent
e34c3ee2fc
commit
bff2361aeb
@ -36,7 +36,7 @@
|
|||||||
#elif defined(CONFIG_RWSEM_GENERIC_SPINLOCK)
|
#elif defined(CONFIG_RWSEM_GENERIC_SPINLOCK)
|
||||||
#define SPL_RWSEM_SINGLE_READER_VALUE (1)
|
#define SPL_RWSEM_SINGLE_READER_VALUE (1)
|
||||||
#define SPL_RWSEM_SINGLE_WRITER_VALUE (-1)
|
#define SPL_RWSEM_SINGLE_WRITER_VALUE (-1)
|
||||||
#else
|
#elif defined(RWSEM_ACTIVE_MASK)
|
||||||
#define SPL_RWSEM_SINGLE_READER_VALUE (RWSEM_ACTIVE_READ_BIAS)
|
#define SPL_RWSEM_SINGLE_READER_VALUE (RWSEM_ACTIVE_READ_BIAS)
|
||||||
#define SPL_RWSEM_SINGLE_WRITER_VALUE (RWSEM_ACTIVE_WRITE_BIAS)
|
#define SPL_RWSEM_SINGLE_WRITER_VALUE (RWSEM_ACTIVE_WRITE_BIAS)
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,7 +85,8 @@ __rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
|||||||
spl_rwsem_unlock_irqrestore(&rwsem->wait_lock, flags);
|
spl_rwsem_unlock_irqrestore(&rwsem->wait_lock, flags);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
#elif defined(HAVE_RWSEM_ATOMIC_LONG_COUNT)
|
#elif defined(RWSEM_ACTIVE_MASK)
|
||||||
|
#if defined(HAVE_RWSEM_ATOMIC_LONG_COUNT)
|
||||||
static int
|
static int
|
||||||
__rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
__rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
||||||
{
|
{
|
||||||
@ -104,6 +105,13 @@ __rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
|||||||
return (val == SPL_RWSEM_SINGLE_READER_VALUE);
|
return (val == SPL_RWSEM_SINGLE_READER_VALUE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
static int
|
||||||
|
__rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
rwsem_tryupgrade(struct rw_semaphore *rwsem)
|
||||||
|
@ -214,6 +214,7 @@ dmu_zfetch(zfetch_t *zf, uint64_t blkid, uint64_t nblks, boolean_t fetch_data)
|
|||||||
uint64_t end_of_access_blkid;
|
uint64_t end_of_access_blkid;
|
||||||
end_of_access_blkid = blkid + nblks;
|
end_of_access_blkid = blkid + nblks;
|
||||||
spa_t *spa = zf->zf_dnode->dn_objset->os_spa;
|
spa_t *spa = zf->zf_dnode->dn_objset->os_spa;
|
||||||
|
krw_t rw = RW_READER;
|
||||||
|
|
||||||
if (zfs_prefetch_disable)
|
if (zfs_prefetch_disable)
|
||||||
return;
|
return;
|
||||||
@ -234,7 +235,8 @@ dmu_zfetch(zfetch_t *zf, uint64_t blkid, uint64_t nblks, boolean_t fetch_data)
|
|||||||
if (blkid == 0)
|
if (blkid == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rw_enter(&zf->zf_rwlock, RW_READER);
|
retry:
|
||||||
|
rw_enter(&zf->zf_rwlock, rw);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find matching prefetch stream. Depending on whether the accesses
|
* Find matching prefetch stream. Depending on whether the accesses
|
||||||
@ -272,7 +274,12 @@ dmu_zfetch(zfetch_t *zf, uint64_t blkid, uint64_t nblks, boolean_t fetch_data)
|
|||||||
* a new stream for it.
|
* a new stream for it.
|
||||||
*/
|
*/
|
||||||
ZFETCHSTAT_BUMP(zfetchstat_misses);
|
ZFETCHSTAT_BUMP(zfetchstat_misses);
|
||||||
if (rw_tryupgrade(&zf->zf_rwlock))
|
if (rw == RW_READER && !rw_tryupgrade(&zf->zf_rwlock)) {
|
||||||
|
rw_exit(&zf->zf_rwlock);
|
||||||
|
rw = RW_WRITER;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
dmu_zfetch_stream_create(zf, end_of_access_blkid);
|
dmu_zfetch_stream_create(zf, end_of_access_blkid);
|
||||||
rw_exit(&zf->zf_rwlock);
|
rw_exit(&zf->zf_rwlock);
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user