mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
net/vdpa: Use readers/writers semaphore instead of cf_mutex
Replace cf_mutex with rw_semaphore to reflect the fact that some calls could be called concurrently but can suffice with read lock. Suggested-by: Si-Wei Liu <si-wei.liu@oracle.com> Signed-off-by: Eli Cohen <elic@nvidia.com> Message-Id: <20220518133804.1075129-5-elic@nvidia.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0078ad905d
commit
a6a51adc6e
@ -23,9 +23,9 @@ static DEFINE_IDA(vdpa_index_ida);
|
||||
|
||||
void vdpa_set_status(struct vdpa_device *vdev, u8 status)
|
||||
{
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_write(&vdev->cf_lock);
|
||||
vdev->config->set_status(vdev, status);
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_write(&vdev->cf_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(vdpa_set_status);
|
||||
|
||||
@ -148,7 +148,6 @@ static void vdpa_release_dev(struct device *d)
|
||||
ops->free(vdev);
|
||||
|
||||
ida_simple_remove(&vdpa_index_ida, vdev->index);
|
||||
mutex_destroy(&vdev->cf_mutex);
|
||||
kfree(vdev->driver_override);
|
||||
kfree(vdev);
|
||||
}
|
||||
@ -211,7 +210,7 @@ struct vdpa_device *__vdpa_alloc_device(struct device *parent,
|
||||
if (err)
|
||||
goto err_name;
|
||||
|
||||
mutex_init(&vdev->cf_mutex);
|
||||
init_rwsem(&vdev->cf_lock);
|
||||
device_initialize(&vdev->dev);
|
||||
|
||||
return vdev;
|
||||
@ -407,9 +406,9 @@ static void vdpa_get_config_unlocked(struct vdpa_device *vdev,
|
||||
void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
|
||||
void *buf, unsigned int len)
|
||||
{
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_read(&vdev->cf_lock);
|
||||
vdpa_get_config_unlocked(vdev, offset, buf, len);
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_read(&vdev->cf_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vdpa_get_config);
|
||||
|
||||
@ -423,9 +422,9 @@ EXPORT_SYMBOL_GPL(vdpa_get_config);
|
||||
void vdpa_set_config(struct vdpa_device *vdev, unsigned int offset,
|
||||
const void *buf, unsigned int length)
|
||||
{
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_write(&vdev->cf_lock);
|
||||
vdev->config->set_config(vdev, offset, buf, length);
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_write(&vdev->cf_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vdpa_set_config);
|
||||
|
||||
@ -866,7 +865,7 @@ vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid,
|
||||
u8 status;
|
||||
int err;
|
||||
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_read(&vdev->cf_lock);
|
||||
status = vdev->config->get_status(vdev);
|
||||
if (!(status & VIRTIO_CONFIG_S_FEATURES_OK)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Features negotiation not completed");
|
||||
@ -903,14 +902,14 @@ vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid,
|
||||
if (err)
|
||||
goto msg_err;
|
||||
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_read(&vdev->cf_lock);
|
||||
genlmsg_end(msg, hdr);
|
||||
return 0;
|
||||
|
||||
msg_err:
|
||||
genlmsg_cancel(msg, hdr);
|
||||
out:
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_read(&vdev->cf_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -954,7 +953,7 @@ static int vendor_stats_fill(struct vdpa_device *vdev, struct sk_buff *msg,
|
||||
{
|
||||
int err;
|
||||
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_read(&vdev->cf_lock);
|
||||
if (!vdev->config->get_vendor_vq_stats) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out;
|
||||
@ -962,7 +961,7 @@ static int vendor_stats_fill(struct vdpa_device *vdev, struct sk_buff *msg,
|
||||
|
||||
err = vdpa_fill_stats_rec(vdev, msg, info, index);
|
||||
out:
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_read(&vdev->cf_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -66,7 +66,7 @@ struct vdpa_mgmt_dev;
|
||||
* @dma_dev: the actual device that is performing DMA
|
||||
* @driver_override: driver name to force a match
|
||||
* @config: the configuration ops for this device.
|
||||
* @cf_mutex: Protects get and set access to configuration layout.
|
||||
* @cf_lock: Protects get and set access to configuration layout.
|
||||
* @index: device index
|
||||
* @features_valid: were features initialized? for legacy guests
|
||||
* @use_va: indicate whether virtual address must be used by this device
|
||||
@ -79,7 +79,7 @@ struct vdpa_device {
|
||||
struct device *dma_dev;
|
||||
const char *driver_override;
|
||||
const struct vdpa_config_ops *config;
|
||||
struct mutex cf_mutex; /* Protects get/set config */
|
||||
struct rw_semaphore cf_lock; /* Protects get/set config */
|
||||
unsigned int index;
|
||||
bool features_valid;
|
||||
bool use_va;
|
||||
@ -398,10 +398,10 @@ static inline int vdpa_reset(struct vdpa_device *vdev)
|
||||
const struct vdpa_config_ops *ops = vdev->config;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_write(&vdev->cf_lock);
|
||||
vdev->features_valid = false;
|
||||
ret = ops->reset(vdev);
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_write(&vdev->cf_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -420,9 +420,9 @@ static inline int vdpa_set_features(struct vdpa_device *vdev, u64 features)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&vdev->cf_mutex);
|
||||
down_write(&vdev->cf_lock);
|
||||
ret = vdpa_set_features_unlocked(vdev, features);
|
||||
mutex_unlock(&vdev->cf_mutex);
|
||||
up_write(&vdev->cf_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user