From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild@lists.01.org
Subject: [baolu:iommu/next/20200514 4/16] drivers/iommu/intel-svm.c:369 intel_svm_bind_gpasid() error: 'svm' dereferencing possible ERR_PTR()
Date: Wed, 20 May 2020 16:40:17 +0300 [thread overview]
Message-ID: <20200520133718.GS2078@kadam> (raw)
[-- Attachment #1: Type: text/plain, Size: 12038 bytes --]
tree: baolu/iommu/next/20200514
head: 28c528ddc9501f8caba71dba375bd1d35403dd4b
commit: 64e95c1afbadc5601bc100f6424b1848888613f7 [4/16] iommu/vt-d: Add bind guest PASID support
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/iommu/intel-svm.c:369 intel_svm_bind_gpasid() error: 'svm' dereferencing possible ERR_PTR()
git remote add baolu git://bee.sh.intel.com/git/blu2/usb.git
git remote update baolu
git checkout 64e95c1afbadc5601bc100f6424b1848888613f7
vim +/svm +369 drivers/iommu/intel-svm.c
64e95c1afbadc5 Jacob Pan 2020-05-14 229 int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 230 struct iommu_gpasid_bind_data *data)
64e95c1afbadc5 Jacob Pan 2020-05-14 231 {
64e95c1afbadc5 Jacob Pan 2020-05-14 232 struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
64e95c1afbadc5 Jacob Pan 2020-05-14 233 struct dmar_domain *dmar_domain;
64e95c1afbadc5 Jacob Pan 2020-05-14 234 struct intel_svm_dev *sdev;
64e95c1afbadc5 Jacob Pan 2020-05-14 235 struct intel_svm *svm;
64e95c1afbadc5 Jacob Pan 2020-05-14 236 int ret = 0;
64e95c1afbadc5 Jacob Pan 2020-05-14 237
64e95c1afbadc5 Jacob Pan 2020-05-14 238 if (WARN_ON(!iommu) || !data)
64e95c1afbadc5 Jacob Pan 2020-05-14 239 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 240
64e95c1afbadc5 Jacob Pan 2020-05-14 241 if (data->version != IOMMU_GPASID_BIND_VERSION_1 ||
64e95c1afbadc5 Jacob Pan 2020-05-14 242 data->format != IOMMU_PASID_FORMAT_INTEL_VTD)
64e95c1afbadc5 Jacob Pan 2020-05-14 243 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 244
64e95c1afbadc5 Jacob Pan 2020-05-14 245 if (dev_is_pci(dev)) {
64e95c1afbadc5 Jacob Pan 2020-05-14 246 /* VT-d supports devices with full 20 bit PASIDs only */
64e95c1afbadc5 Jacob Pan 2020-05-14 247 if (pci_max_pasids(to_pci_dev(dev)) != PASID_MAX)
64e95c1afbadc5 Jacob Pan 2020-05-14 248 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 249 } else {
64e95c1afbadc5 Jacob Pan 2020-05-14 250 return -ENOTSUPP;
64e95c1afbadc5 Jacob Pan 2020-05-14 251 }
64e95c1afbadc5 Jacob Pan 2020-05-14 252
64e95c1afbadc5 Jacob Pan 2020-05-14 253 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 254 * We only check host PASID range, we have no knowledge to check
64e95c1afbadc5 Jacob Pan 2020-05-14 255 * guest PASID range.
64e95c1afbadc5 Jacob Pan 2020-05-14 256 */
64e95c1afbadc5 Jacob Pan 2020-05-14 257 if (data->hpasid <= 0 || data->hpasid >= PASID_MAX)
64e95c1afbadc5 Jacob Pan 2020-05-14 258 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 259
64e95c1afbadc5 Jacob Pan 2020-05-14 260 dmar_domain = to_dmar_domain(domain);
64e95c1afbadc5 Jacob Pan 2020-05-14 261
64e95c1afbadc5 Jacob Pan 2020-05-14 262 mutex_lock(&pasid_mutex);
64e95c1afbadc5 Jacob Pan 2020-05-14 263 svm = ioasid_find(NULL, data->hpasid, NULL);
64e95c1afbadc5 Jacob Pan 2020-05-14 264 if (IS_ERR(svm)) {
64e95c1afbadc5 Jacob Pan 2020-05-14 265 ret = PTR_ERR(svm);
64e95c1afbadc5 Jacob Pan 2020-05-14 266 goto out;
^^^^^^^^
Goto out is always a warning sign... The label name should say what the
goto does like "goto unlock;"
64e95c1afbadc5 Jacob Pan 2020-05-14 267 }
64e95c1afbadc5 Jacob Pan 2020-05-14 268
64e95c1afbadc5 Jacob Pan 2020-05-14 269 if (svm) {
64e95c1afbadc5 Jacob Pan 2020-05-14 270 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 271 * If we found svm for the PASID, there must be at
64e95c1afbadc5 Jacob Pan 2020-05-14 272 * least one device bond, otherwise svm should be freed.
64e95c1afbadc5 Jacob Pan 2020-05-14 273 */
64e95c1afbadc5 Jacob Pan 2020-05-14 274 if (WARN_ON(list_empty(&svm->devs))) {
64e95c1afbadc5 Jacob Pan 2020-05-14 275 ret = -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 276 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 277 }
64e95c1afbadc5 Jacob Pan 2020-05-14 278
64e95c1afbadc5 Jacob Pan 2020-05-14 279 for_each_svm_dev(sdev, svm, dev) {
64e95c1afbadc5 Jacob Pan 2020-05-14 280 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 281 * For devices with aux domains, we should allow
64e95c1afbadc5 Jacob Pan 2020-05-14 282 * multiple bind calls with the same PASID and pdev.
64e95c1afbadc5 Jacob Pan 2020-05-14 283 */
64e95c1afbadc5 Jacob Pan 2020-05-14 284 if (iommu_dev_feature_enabled(dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 285 IOMMU_DEV_FEAT_AUX)) {
64e95c1afbadc5 Jacob Pan 2020-05-14 286 sdev->users++;
64e95c1afbadc5 Jacob Pan 2020-05-14 287 } else {
64e95c1afbadc5 Jacob Pan 2020-05-14 288 dev_warn_ratelimited(dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 289 "Already bound with PASID %u\n",
64e95c1afbadc5 Jacob Pan 2020-05-14 290 svm->pasid);
64e95c1afbadc5 Jacob Pan 2020-05-14 291 ret = -EBUSY;
64e95c1afbadc5 Jacob Pan 2020-05-14 292 }
64e95c1afbadc5 Jacob Pan 2020-05-14 293 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 294 }
64e95c1afbadc5 Jacob Pan 2020-05-14 295 } else {
64e95c1afbadc5 Jacob Pan 2020-05-14 296 /* We come here when PASID has never been bond to a device. */
64e95c1afbadc5 Jacob Pan 2020-05-14 297 svm = kzalloc(sizeof(*svm), GFP_KERNEL);
64e95c1afbadc5 Jacob Pan 2020-05-14 298 if (!svm) {
64e95c1afbadc5 Jacob Pan 2020-05-14 299 ret = -ENOMEM;
64e95c1afbadc5 Jacob Pan 2020-05-14 300 goto out;
This is also a problem.
64e95c1afbadc5 Jacob Pan 2020-05-14 301 }
64e95c1afbadc5 Jacob Pan 2020-05-14 302 /* REVISIT: upper layer/VFIO can track host process that bind
64e95c1afbadc5 Jacob Pan 2020-05-14 303 * the PASID. ioasid_set = mm might be sufficient for vfio to
64e95c1afbadc5 Jacob Pan 2020-05-14 304 * check pasid VMM ownership. We can drop the following line
64e95c1afbadc5 Jacob Pan 2020-05-14 305 * once VFIO and IOASID set check is in place.
64e95c1afbadc5 Jacob Pan 2020-05-14 306 */
64e95c1afbadc5 Jacob Pan 2020-05-14 307 svm->mm = get_task_mm(current);
64e95c1afbadc5 Jacob Pan 2020-05-14 308 svm->pasid = data->hpasid;
64e95c1afbadc5 Jacob Pan 2020-05-14 309 if (data->flags & IOMMU_SVA_GPASID_VAL) {
64e95c1afbadc5 Jacob Pan 2020-05-14 310 svm->gpasid = data->gpasid;
64e95c1afbadc5 Jacob Pan 2020-05-14 311 svm->flags |= SVM_FLAG_GUEST_PASID;
64e95c1afbadc5 Jacob Pan 2020-05-14 312 }
64e95c1afbadc5 Jacob Pan 2020-05-14 313 ioasid_set_data(data->hpasid, svm);
64e95c1afbadc5 Jacob Pan 2020-05-14 314 INIT_LIST_HEAD_RCU(&svm->devs);
64e95c1afbadc5 Jacob Pan 2020-05-14 315 mmput(svm->mm);
64e95c1afbadc5 Jacob Pan 2020-05-14 316 }
64e95c1afbadc5 Jacob Pan 2020-05-14 317 sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
64e95c1afbadc5 Jacob Pan 2020-05-14 318 if (!sdev) {
64e95c1afbadc5 Jacob Pan 2020-05-14 319 ret = -ENOMEM;
64e95c1afbadc5 Jacob Pan 2020-05-14 320 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 321 }
64e95c1afbadc5 Jacob Pan 2020-05-14 322 sdev->dev = dev;
64e95c1afbadc5 Jacob Pan 2020-05-14 323
64e95c1afbadc5 Jacob Pan 2020-05-14 324 /* Only count users if device has aux domains */
64e95c1afbadc5 Jacob Pan 2020-05-14 325 if (iommu_dev_feature_enabled(dev, IOMMU_DEV_FEAT_AUX))
64e95c1afbadc5 Jacob Pan 2020-05-14 326 sdev->users = 1;
64e95c1afbadc5 Jacob Pan 2020-05-14 327
64e95c1afbadc5 Jacob Pan 2020-05-14 328 /* Set up device context entry for PASID if not enabled already */
64e95c1afbadc5 Jacob Pan 2020-05-14 329 ret = intel_iommu_enable_pasid(iommu, sdev->dev);
64e95c1afbadc5 Jacob Pan 2020-05-14 330 if (ret) {
64e95c1afbadc5 Jacob Pan 2020-05-14 331 dev_err_ratelimited(dev, "Failed to enable PASID capability\n");
64e95c1afbadc5 Jacob Pan 2020-05-14 332 kfree(sdev);
64e95c1afbadc5 Jacob Pan 2020-05-14 333 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 334 }
64e95c1afbadc5 Jacob Pan 2020-05-14 335
64e95c1afbadc5 Jacob Pan 2020-05-14 336 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 337 * PASID table is per device for better security. Therefore, for
64e95c1afbadc5 Jacob Pan 2020-05-14 338 * each bind of a new device even with an existing PASID, we need to
64e95c1afbadc5 Jacob Pan 2020-05-14 339 * call the nested mode setup function here.
64e95c1afbadc5 Jacob Pan 2020-05-14 340 */
64e95c1afbadc5 Jacob Pan 2020-05-14 341 spin_lock(&iommu->lock);
64e95c1afbadc5 Jacob Pan 2020-05-14 342 ret = intel_pasid_setup_nested(iommu,
64e95c1afbadc5 Jacob Pan 2020-05-14 343 dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 344 (pgd_t *)data->gpgd,
64e95c1afbadc5 Jacob Pan 2020-05-14 345 data->hpasid,
64e95c1afbadc5 Jacob Pan 2020-05-14 346 &data->vtd,
64e95c1afbadc5 Jacob Pan 2020-05-14 347 dmar_domain,
64e95c1afbadc5 Jacob Pan 2020-05-14 348 data->addr_width);
64e95c1afbadc5 Jacob Pan 2020-05-14 349 spin_unlock(&iommu->lock);
64e95c1afbadc5 Jacob Pan 2020-05-14 350 if (ret) {
64e95c1afbadc5 Jacob Pan 2020-05-14 351 dev_err_ratelimited(dev, "Failed to set up PASID %llu in nested mode, Err %d\n",
64e95c1afbadc5 Jacob Pan 2020-05-14 352 data->hpasid, ret);
64e95c1afbadc5 Jacob Pan 2020-05-14 353 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 354 * PASID entry should be in cleared state if nested mode
64e95c1afbadc5 Jacob Pan 2020-05-14 355 * set up failed. So we only need to clear IOASID tracking
64e95c1afbadc5 Jacob Pan 2020-05-14 356 * data such that free call will succeed.
64e95c1afbadc5 Jacob Pan 2020-05-14 357 */
64e95c1afbadc5 Jacob Pan 2020-05-14 358 kfree(sdev);
64e95c1afbadc5 Jacob Pan 2020-05-14 359 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 360 }
64e95c1afbadc5 Jacob Pan 2020-05-14 361
64e95c1afbadc5 Jacob Pan 2020-05-14 362 svm->flags |= SVM_FLAG_GUEST_MODE;
64e95c1afbadc5 Jacob Pan 2020-05-14 363
64e95c1afbadc5 Jacob Pan 2020-05-14 364 init_rcu_head(&sdev->rcu);
64e95c1afbadc5 Jacob Pan 2020-05-14 365 list_add_rcu(&sdev->list, &svm->devs);
64e95c1afbadc5 Jacob Pan 2020-05-14 366 out:
64e95c1afbadc5 Jacob Pan 2020-05-14 367 if (list_empty(&svm->devs)) {
^^^^^^^^^^
Oops.
64e95c1afbadc5 Jacob Pan 2020-05-14 368 ioasid_set_data(data->hpasid, NULL);
64e95c1afbadc5 Jacob Pan 2020-05-14 @369 kfree(svm);
64e95c1afbadc5 Jacob Pan 2020-05-14 370 }
64e95c1afbadc5 Jacob Pan 2020-05-14 371
64e95c1afbadc5 Jacob Pan 2020-05-14 372 mutex_unlock(&pasid_mutex);
64e95c1afbadc5 Jacob Pan 2020-05-14 373 return ret;
64e95c1afbadc5 Jacob Pan 2020-05-14 374 }
64e95c1afbadc5 Jacob Pan 2020-05-14 375
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild-all@lists.01.org
Subject: [baolu:iommu/next/20200514 4/16] drivers/iommu/intel-svm.c:369 intel_svm_bind_gpasid() error: 'svm' dereferencing possible ERR_PTR()
Date: Wed, 20 May 2020 16:40:17 +0300 [thread overview]
Message-ID: <20200520133718.GS2078@kadam> (raw)
[-- Attachment #1: Type: text/plain, Size: 12038 bytes --]
tree: baolu/iommu/next/20200514
head: 28c528ddc9501f8caba71dba375bd1d35403dd4b
commit: 64e95c1afbadc5601bc100f6424b1848888613f7 [4/16] iommu/vt-d: Add bind guest PASID support
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/iommu/intel-svm.c:369 intel_svm_bind_gpasid() error: 'svm' dereferencing possible ERR_PTR()
git remote add baolu git://bee.sh.intel.com/git/blu2/usb.git
git remote update baolu
git checkout 64e95c1afbadc5601bc100f6424b1848888613f7
vim +/svm +369 drivers/iommu/intel-svm.c
64e95c1afbadc5 Jacob Pan 2020-05-14 229 int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 230 struct iommu_gpasid_bind_data *data)
64e95c1afbadc5 Jacob Pan 2020-05-14 231 {
64e95c1afbadc5 Jacob Pan 2020-05-14 232 struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
64e95c1afbadc5 Jacob Pan 2020-05-14 233 struct dmar_domain *dmar_domain;
64e95c1afbadc5 Jacob Pan 2020-05-14 234 struct intel_svm_dev *sdev;
64e95c1afbadc5 Jacob Pan 2020-05-14 235 struct intel_svm *svm;
64e95c1afbadc5 Jacob Pan 2020-05-14 236 int ret = 0;
64e95c1afbadc5 Jacob Pan 2020-05-14 237
64e95c1afbadc5 Jacob Pan 2020-05-14 238 if (WARN_ON(!iommu) || !data)
64e95c1afbadc5 Jacob Pan 2020-05-14 239 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 240
64e95c1afbadc5 Jacob Pan 2020-05-14 241 if (data->version != IOMMU_GPASID_BIND_VERSION_1 ||
64e95c1afbadc5 Jacob Pan 2020-05-14 242 data->format != IOMMU_PASID_FORMAT_INTEL_VTD)
64e95c1afbadc5 Jacob Pan 2020-05-14 243 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 244
64e95c1afbadc5 Jacob Pan 2020-05-14 245 if (dev_is_pci(dev)) {
64e95c1afbadc5 Jacob Pan 2020-05-14 246 /* VT-d supports devices with full 20 bit PASIDs only */
64e95c1afbadc5 Jacob Pan 2020-05-14 247 if (pci_max_pasids(to_pci_dev(dev)) != PASID_MAX)
64e95c1afbadc5 Jacob Pan 2020-05-14 248 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 249 } else {
64e95c1afbadc5 Jacob Pan 2020-05-14 250 return -ENOTSUPP;
64e95c1afbadc5 Jacob Pan 2020-05-14 251 }
64e95c1afbadc5 Jacob Pan 2020-05-14 252
64e95c1afbadc5 Jacob Pan 2020-05-14 253 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 254 * We only check host PASID range, we have no knowledge to check
64e95c1afbadc5 Jacob Pan 2020-05-14 255 * guest PASID range.
64e95c1afbadc5 Jacob Pan 2020-05-14 256 */
64e95c1afbadc5 Jacob Pan 2020-05-14 257 if (data->hpasid <= 0 || data->hpasid >= PASID_MAX)
64e95c1afbadc5 Jacob Pan 2020-05-14 258 return -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 259
64e95c1afbadc5 Jacob Pan 2020-05-14 260 dmar_domain = to_dmar_domain(domain);
64e95c1afbadc5 Jacob Pan 2020-05-14 261
64e95c1afbadc5 Jacob Pan 2020-05-14 262 mutex_lock(&pasid_mutex);
64e95c1afbadc5 Jacob Pan 2020-05-14 263 svm = ioasid_find(NULL, data->hpasid, NULL);
64e95c1afbadc5 Jacob Pan 2020-05-14 264 if (IS_ERR(svm)) {
64e95c1afbadc5 Jacob Pan 2020-05-14 265 ret = PTR_ERR(svm);
64e95c1afbadc5 Jacob Pan 2020-05-14 266 goto out;
^^^^^^^^
Goto out is always a warning sign... The label name should say what the
goto does like "goto unlock;"
64e95c1afbadc5 Jacob Pan 2020-05-14 267 }
64e95c1afbadc5 Jacob Pan 2020-05-14 268
64e95c1afbadc5 Jacob Pan 2020-05-14 269 if (svm) {
64e95c1afbadc5 Jacob Pan 2020-05-14 270 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 271 * If we found svm for the PASID, there must be at
64e95c1afbadc5 Jacob Pan 2020-05-14 272 * least one device bond, otherwise svm should be freed.
64e95c1afbadc5 Jacob Pan 2020-05-14 273 */
64e95c1afbadc5 Jacob Pan 2020-05-14 274 if (WARN_ON(list_empty(&svm->devs))) {
64e95c1afbadc5 Jacob Pan 2020-05-14 275 ret = -EINVAL;
64e95c1afbadc5 Jacob Pan 2020-05-14 276 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 277 }
64e95c1afbadc5 Jacob Pan 2020-05-14 278
64e95c1afbadc5 Jacob Pan 2020-05-14 279 for_each_svm_dev(sdev, svm, dev) {
64e95c1afbadc5 Jacob Pan 2020-05-14 280 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 281 * For devices with aux domains, we should allow
64e95c1afbadc5 Jacob Pan 2020-05-14 282 * multiple bind calls with the same PASID and pdev.
64e95c1afbadc5 Jacob Pan 2020-05-14 283 */
64e95c1afbadc5 Jacob Pan 2020-05-14 284 if (iommu_dev_feature_enabled(dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 285 IOMMU_DEV_FEAT_AUX)) {
64e95c1afbadc5 Jacob Pan 2020-05-14 286 sdev->users++;
64e95c1afbadc5 Jacob Pan 2020-05-14 287 } else {
64e95c1afbadc5 Jacob Pan 2020-05-14 288 dev_warn_ratelimited(dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 289 "Already bound with PASID %u\n",
64e95c1afbadc5 Jacob Pan 2020-05-14 290 svm->pasid);
64e95c1afbadc5 Jacob Pan 2020-05-14 291 ret = -EBUSY;
64e95c1afbadc5 Jacob Pan 2020-05-14 292 }
64e95c1afbadc5 Jacob Pan 2020-05-14 293 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 294 }
64e95c1afbadc5 Jacob Pan 2020-05-14 295 } else {
64e95c1afbadc5 Jacob Pan 2020-05-14 296 /* We come here when PASID has never been bond to a device. */
64e95c1afbadc5 Jacob Pan 2020-05-14 297 svm = kzalloc(sizeof(*svm), GFP_KERNEL);
64e95c1afbadc5 Jacob Pan 2020-05-14 298 if (!svm) {
64e95c1afbadc5 Jacob Pan 2020-05-14 299 ret = -ENOMEM;
64e95c1afbadc5 Jacob Pan 2020-05-14 300 goto out;
This is also a problem.
64e95c1afbadc5 Jacob Pan 2020-05-14 301 }
64e95c1afbadc5 Jacob Pan 2020-05-14 302 /* REVISIT: upper layer/VFIO can track host process that bind
64e95c1afbadc5 Jacob Pan 2020-05-14 303 * the PASID. ioasid_set = mm might be sufficient for vfio to
64e95c1afbadc5 Jacob Pan 2020-05-14 304 * check pasid VMM ownership. We can drop the following line
64e95c1afbadc5 Jacob Pan 2020-05-14 305 * once VFIO and IOASID set check is in place.
64e95c1afbadc5 Jacob Pan 2020-05-14 306 */
64e95c1afbadc5 Jacob Pan 2020-05-14 307 svm->mm = get_task_mm(current);
64e95c1afbadc5 Jacob Pan 2020-05-14 308 svm->pasid = data->hpasid;
64e95c1afbadc5 Jacob Pan 2020-05-14 309 if (data->flags & IOMMU_SVA_GPASID_VAL) {
64e95c1afbadc5 Jacob Pan 2020-05-14 310 svm->gpasid = data->gpasid;
64e95c1afbadc5 Jacob Pan 2020-05-14 311 svm->flags |= SVM_FLAG_GUEST_PASID;
64e95c1afbadc5 Jacob Pan 2020-05-14 312 }
64e95c1afbadc5 Jacob Pan 2020-05-14 313 ioasid_set_data(data->hpasid, svm);
64e95c1afbadc5 Jacob Pan 2020-05-14 314 INIT_LIST_HEAD_RCU(&svm->devs);
64e95c1afbadc5 Jacob Pan 2020-05-14 315 mmput(svm->mm);
64e95c1afbadc5 Jacob Pan 2020-05-14 316 }
64e95c1afbadc5 Jacob Pan 2020-05-14 317 sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
64e95c1afbadc5 Jacob Pan 2020-05-14 318 if (!sdev) {
64e95c1afbadc5 Jacob Pan 2020-05-14 319 ret = -ENOMEM;
64e95c1afbadc5 Jacob Pan 2020-05-14 320 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 321 }
64e95c1afbadc5 Jacob Pan 2020-05-14 322 sdev->dev = dev;
64e95c1afbadc5 Jacob Pan 2020-05-14 323
64e95c1afbadc5 Jacob Pan 2020-05-14 324 /* Only count users if device has aux domains */
64e95c1afbadc5 Jacob Pan 2020-05-14 325 if (iommu_dev_feature_enabled(dev, IOMMU_DEV_FEAT_AUX))
64e95c1afbadc5 Jacob Pan 2020-05-14 326 sdev->users = 1;
64e95c1afbadc5 Jacob Pan 2020-05-14 327
64e95c1afbadc5 Jacob Pan 2020-05-14 328 /* Set up device context entry for PASID if not enabled already */
64e95c1afbadc5 Jacob Pan 2020-05-14 329 ret = intel_iommu_enable_pasid(iommu, sdev->dev);
64e95c1afbadc5 Jacob Pan 2020-05-14 330 if (ret) {
64e95c1afbadc5 Jacob Pan 2020-05-14 331 dev_err_ratelimited(dev, "Failed to enable PASID capability\n");
64e95c1afbadc5 Jacob Pan 2020-05-14 332 kfree(sdev);
64e95c1afbadc5 Jacob Pan 2020-05-14 333 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 334 }
64e95c1afbadc5 Jacob Pan 2020-05-14 335
64e95c1afbadc5 Jacob Pan 2020-05-14 336 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 337 * PASID table is per device for better security. Therefore, for
64e95c1afbadc5 Jacob Pan 2020-05-14 338 * each bind of a new device even with an existing PASID, we need to
64e95c1afbadc5 Jacob Pan 2020-05-14 339 * call the nested mode setup function here.
64e95c1afbadc5 Jacob Pan 2020-05-14 340 */
64e95c1afbadc5 Jacob Pan 2020-05-14 341 spin_lock(&iommu->lock);
64e95c1afbadc5 Jacob Pan 2020-05-14 342 ret = intel_pasid_setup_nested(iommu,
64e95c1afbadc5 Jacob Pan 2020-05-14 343 dev,
64e95c1afbadc5 Jacob Pan 2020-05-14 344 (pgd_t *)data->gpgd,
64e95c1afbadc5 Jacob Pan 2020-05-14 345 data->hpasid,
64e95c1afbadc5 Jacob Pan 2020-05-14 346 &data->vtd,
64e95c1afbadc5 Jacob Pan 2020-05-14 347 dmar_domain,
64e95c1afbadc5 Jacob Pan 2020-05-14 348 data->addr_width);
64e95c1afbadc5 Jacob Pan 2020-05-14 349 spin_unlock(&iommu->lock);
64e95c1afbadc5 Jacob Pan 2020-05-14 350 if (ret) {
64e95c1afbadc5 Jacob Pan 2020-05-14 351 dev_err_ratelimited(dev, "Failed to set up PASID %llu in nested mode, Err %d\n",
64e95c1afbadc5 Jacob Pan 2020-05-14 352 data->hpasid, ret);
64e95c1afbadc5 Jacob Pan 2020-05-14 353 /*
64e95c1afbadc5 Jacob Pan 2020-05-14 354 * PASID entry should be in cleared state if nested mode
64e95c1afbadc5 Jacob Pan 2020-05-14 355 * set up failed. So we only need to clear IOASID tracking
64e95c1afbadc5 Jacob Pan 2020-05-14 356 * data such that free call will succeed.
64e95c1afbadc5 Jacob Pan 2020-05-14 357 */
64e95c1afbadc5 Jacob Pan 2020-05-14 358 kfree(sdev);
64e95c1afbadc5 Jacob Pan 2020-05-14 359 goto out;
64e95c1afbadc5 Jacob Pan 2020-05-14 360 }
64e95c1afbadc5 Jacob Pan 2020-05-14 361
64e95c1afbadc5 Jacob Pan 2020-05-14 362 svm->flags |= SVM_FLAG_GUEST_MODE;
64e95c1afbadc5 Jacob Pan 2020-05-14 363
64e95c1afbadc5 Jacob Pan 2020-05-14 364 init_rcu_head(&sdev->rcu);
64e95c1afbadc5 Jacob Pan 2020-05-14 365 list_add_rcu(&sdev->list, &svm->devs);
64e95c1afbadc5 Jacob Pan 2020-05-14 366 out:
64e95c1afbadc5 Jacob Pan 2020-05-14 367 if (list_empty(&svm->devs)) {
^^^^^^^^^^
Oops.
64e95c1afbadc5 Jacob Pan 2020-05-14 368 ioasid_set_data(data->hpasid, NULL);
64e95c1afbadc5 Jacob Pan 2020-05-14 @369 kfree(svm);
64e95c1afbadc5 Jacob Pan 2020-05-14 370 }
64e95c1afbadc5 Jacob Pan 2020-05-14 371
64e95c1afbadc5 Jacob Pan 2020-05-14 372 mutex_unlock(&pasid_mutex);
64e95c1afbadc5 Jacob Pan 2020-05-14 373 return ret;
64e95c1afbadc5 Jacob Pan 2020-05-14 374 }
64e95c1afbadc5 Jacob Pan 2020-05-14 375
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
next reply other threads:[~2020-05-20 13:40 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-20 13:40 Dan Carpenter [this message]
2020-05-20 13:40 ` [baolu:iommu/next/20200514 4/16] drivers/iommu/intel-svm.c:369 intel_svm_bind_gpasid() error: 'svm' dereferencing possible ERR_PTR() Dan Carpenter
-- strict thread matches above, loose matches on Subject: below --
2020-05-14 10:34 kbuild test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200520133718.GS2078@kadam \
--to=dan.carpenter@oracle.com \
--cc=kbuild@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.