lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 28 Jul 2023 04:23:03 +0000
From:   "Tian, Kevin" <kevin.tian@...el.com>
To:     Nicolin Chen <nicolinc@...dia.com>,
        "jgg@...dia.com" <jgg@...dia.com>
CC:     "Liu, Yi L" <yi.l.liu@...el.com>,
        "joro@...tes.org" <joro@...tes.org>,
        "will@...nel.org" <will@...nel.org>,
        "robin.murphy@....com" <robin.murphy@....com>,
        "alex.williamson@...hat.com" <alex.williamson@...hat.com>,
        "shuah@...nel.org" <shuah@...nel.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
        "iommu@...ts.linux.dev" <iommu@...ts.linux.dev>,
        "kvm@...r.kernel.org" <kvm@...r.kernel.org>,
        "linux-kselftest@...r.kernel.org" <linux-kselftest@...r.kernel.org>,
        "mjrosato@...ux.ibm.com" <mjrosato@...ux.ibm.com>,
        "farman@...ux.ibm.com" <farman@...ux.ibm.com>
Subject: RE: [PATCH v10 3/6] iommufd: Add iommufd_access_change_ioas(_id)
 helpers

> From: Nicolin Chen <nicolinc@...dia.com>
> Sent: Friday, July 28, 2023 4:25 AM
> 
> +static int iommufd_access_change_ioas(struct iommufd_access *access,
> +				      struct iommufd_ioas *new_ioas)
> +{
> +	u32 iopt_access_list_id = access->iopt_access_list_id;
> +	struct iommufd_ioas *cur_ioas = access->ioas;
> +	int rc;
> +
> +	lockdep_assert_held(&access->ioas_lock);
> +
> +	/* We are racing with a concurrent detach, bail */
> +	if (cur_ioas != access->ioas_unpin)
> +		return -EBUSY;
> +
> +	if (IS_ERR(new_ioas))
> +		return PTR_ERR(new_ioas);

iommufd_access_change_ioas_id() already checks errors.

> +
>  void iommufd_access_destroy_object(struct iommufd_object *obj)
>  {
>  	struct iommufd_access *access =
>  		container_of(obj, struct iommufd_access, obj);
> 
> -	if (access->ioas) {
> -		iopt_remove_access(&access->ioas->iopt, access,
> -				   access->iopt_access_list_id);
> -		refcount_dec(&access->ioas->obj.users);
> -		access->ioas = NULL;
> -	}
> +	mutex_lock(&access->ioas_lock);
> +	if (access->ioas)
> +		WARN_ON(iommufd_access_change_ioas(access, NULL));
> +	mutex_unlock(&access->ioas_lock);
>  	iommufd_ctx_put(access->ictx);
>  }

this changes the behavior of destroy. Previously it always removes
the access w/o detecting race while now it will give up and throw
out a warning. While I'm fine with this change from bisec p.o.v.
it might be good to split this into a separate patch.

>  void iommufd_access_detach(struct iommufd_access *access)
>  {
> -	struct iommufd_ioas *cur_ioas = access->ioas;
> +	int rc;
> 
>  	mutex_lock(&access->ioas_lock);
> -	if (WARN_ON(!access->ioas))
> -		goto out;
> -	/*
> -	 * Set ioas to NULL to block any further iommufd_access_pin_pages().
> -	 * iommufd_access_unpin_pages() can continue using access-
> >ioas_unpin.
> -	 */
> -	access->ioas = NULL;
> -
> -	if (access->ops->unmap) {
> +	if (WARN_ON(!access->ioas)) {
>  		mutex_unlock(&access->ioas_lock);
> -		access->ops->unmap(access->data, 0, ULONG_MAX);
> -		mutex_lock(&access->ioas_lock);
> +		return;
>  	}
> -	iopt_remove_access(&cur_ioas->iopt, access,
> -			   access->iopt_access_list_id);
> -	refcount_dec(&cur_ioas->obj.users);
> -out:
> -	access->ioas_unpin = NULL;
> +	rc = iommufd_access_change_ioas(access, NULL);
> +	WARN_ON(rc);

'rc' can be removed. 

Just "WARN_ON(iommufd_access_change_ioas(access, NULL));"

otherwise looks good to me,

Reviewed-by: Kevin Tian <kevin.tian@...el.com>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ