linux/drivers/gpu/drm/i915/gem/i915_gem_pages.c
<<
>>
Prefs
   1/*
   2 * SPDX-License-Identifier: MIT
   3 *
   4 * Copyright © 2014-2016 Intel Corporation
   5 */
   6
   7#include "i915_drv.h"
   8#include "i915_gem_object.h"
   9#include "i915_scatterlist.h"
  10
  11void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
  12                                 struct sg_table *pages,
  13                                 unsigned int sg_page_sizes)
  14{
  15        struct drm_i915_private *i915 = to_i915(obj->base.dev);
  16        unsigned long supported = INTEL_INFO(i915)->page_sizes;
  17        int i;
  18
  19        lockdep_assert_held(&obj->mm.lock);
  20
  21        /* Make the pages coherent with the GPU (flushing any swapin). */
  22        if (obj->cache_dirty) {
  23                obj->write_domain = 0;
  24                if (i915_gem_object_has_struct_page(obj))
  25                        drm_clflush_sg(pages);
  26                obj->cache_dirty = false;
  27        }
  28
  29        obj->mm.get_page.sg_pos = pages->sgl;
  30        obj->mm.get_page.sg_idx = 0;
  31
  32        obj->mm.pages = pages;
  33
  34        if (i915_gem_object_is_tiled(obj) &&
  35            i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
  36                GEM_BUG_ON(obj->mm.quirked);
  37                __i915_gem_object_pin_pages(obj);
  38                obj->mm.quirked = true;
  39        }
  40
  41        GEM_BUG_ON(!sg_page_sizes);
  42        obj->mm.page_sizes.phys = sg_page_sizes;
  43
  44        /*
  45         * Calculate the supported page-sizes which fit into the given
  46         * sg_page_sizes. This will give us the page-sizes which we may be able
  47         * to use opportunistically when later inserting into the GTT. For
  48         * example if phys=2G, then in theory we should be able to use 1G, 2M,
  49         * 64K or 4K pages, although in practice this will depend on a number of
  50         * other factors.
  51         */
  52        obj->mm.page_sizes.sg = 0;
  53        for_each_set_bit(i, &supported, ilog2(I915_GTT_MAX_PAGE_SIZE) + 1) {
  54                if (obj->mm.page_sizes.phys & ~0u << i)
  55                        obj->mm.page_sizes.sg |= BIT(i);
  56        }
  57        GEM_BUG_ON(!HAS_PAGE_SIZES(i915, obj->mm.page_sizes.sg));
  58
  59        if (i915_gem_object_is_shrinkable(obj)) {
  60                struct list_head *list;
  61                unsigned long flags;
  62
  63                spin_lock_irqsave(&i915->mm.obj_lock, flags);
  64
  65                i915->mm.shrink_count++;
  66                i915->mm.shrink_memory += obj->base.size;
  67
  68                if (obj->mm.madv != I915_MADV_WILLNEED)
  69                        list = &i915->mm.purge_list;
  70                else
  71                        list = &i915->mm.shrink_list;
  72                list_add_tail(&obj->mm.link, list);
  73
  74                spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
  75        }
  76}
  77
  78int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
  79{
  80        int err;
  81
  82        if (unlikely(obj->mm.madv != I915_MADV_WILLNEED)) {
  83                DRM_DEBUG("Attempting to obtain a purgeable object\n");
  84                return -EFAULT;
  85        }
  86
  87        err = obj->ops->get_pages(obj);
  88        GEM_BUG_ON(!err && !i915_gem_object_has_pages(obj));
  89
  90        return err;
  91}
  92
  93/* Ensure that the associated pages are gathered from the backing storage
  94 * and pinned into our object. i915_gem_object_pin_pages() may be called
  95 * multiple times before they are released by a single call to
  96 * i915_gem_object_unpin_pages() - once the pages are no longer referenced
  97 * either as a result of memory pressure (reaping pages under the shrinker)
  98 * or as the object is itself released.
  99 */
 100int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 101{
 102        int err;
 103
 104        err = mutex_lock_interruptible(&obj->mm.lock);
 105        if (err)
 106                return err;
 107
 108        if (unlikely(!i915_gem_object_has_pages(obj))) {
 109                GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
 110
 111                err = ____i915_gem_object_get_pages(obj);
 112                if (err)
 113                        goto unlock;
 114
 115                smp_mb__before_atomic();
 116        }
 117        atomic_inc(&obj->mm.pages_pin_count);
 118
 119unlock:
 120        mutex_unlock(&obj->mm.lock);
 121        return err;
 122}
 123
 124/* Immediately discard the backing storage */
 125void i915_gem_object_truncate(struct drm_i915_gem_object *obj)
 126{
 127        drm_gem_free_mmap_offset(&obj->base);
 128        if (obj->ops->truncate)
 129                obj->ops->truncate(obj);
 130}
 131
 132/* Try to discard unwanted pages */
 133void i915_gem_object_writeback(struct drm_i915_gem_object *obj)
 134{
 135        lockdep_assert_held(&obj->mm.lock);
 136        GEM_BUG_ON(i915_gem_object_has_pages(obj));
 137
 138        if (obj->ops->writeback)
 139                obj->ops->writeback(obj);
 140}
 141
 142static void __i915_gem_object_reset_page_iter(struct drm_i915_gem_object *obj)
 143{
 144        struct radix_tree_iter iter;
 145        void __rcu **slot;
 146
 147        rcu_read_lock();
 148        radix_tree_for_each_slot(slot, &obj->mm.get_page.radix, &iter, 0)
 149                radix_tree_delete(&obj->mm.get_page.radix, iter.index);
 150        rcu_read_unlock();
 151}
 152
 153struct sg_table *
 154__i915_gem_object_unset_pages(struct drm_i915_gem_object *obj)
 155{
 156        struct sg_table *pages;
 157
 158        pages = fetch_and_zero(&obj->mm.pages);
 159        if (IS_ERR_OR_NULL(pages))
 160                return pages;
 161
 162        i915_gem_object_make_unshrinkable(obj);
 163
 164        if (obj->mm.mapping) {
 165                void *ptr;
 166
 167                ptr = page_mask_bits(obj->mm.mapping);
 168                if (is_vmalloc_addr(ptr))
 169                        vunmap(ptr);
 170                else
 171                        kunmap(kmap_to_page(ptr));
 172
 173                obj->mm.mapping = NULL;
 174        }
 175
 176        __i915_gem_object_reset_page_iter(obj);
 177        obj->mm.page_sizes.phys = obj->mm.page_sizes.sg = 0;
 178
 179        return pages;
 180}
 181
 182int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj,
 183                                enum i915_mm_subclass subclass)
 184{
 185        struct sg_table *pages;
 186        int err;
 187
 188        if (i915_gem_object_has_pinned_pages(obj))
 189                return -EBUSY;
 190
 191        GEM_BUG_ON(atomic_read(&obj->bind_count));
 192
 193        /* May be called by shrinker from within get_pages() (on another bo) */
 194        mutex_lock_nested(&obj->mm.lock, subclass);
 195        if (unlikely(atomic_read(&obj->mm.pages_pin_count))) {
 196                err = -EBUSY;
 197                goto unlock;
 198        }
 199
 200        /*
 201         * ->put_pages might need to allocate memory for the bit17 swizzle
 202         * array, hence protect them from being reaped by removing them from gtt
 203         * lists early.
 204         */
 205        pages = __i915_gem_object_unset_pages(obj);
 206
 207        /*
 208         * XXX Temporary hijinx to avoid updating all backends to handle
 209         * NULL pages. In the future, when we have more asynchronous
 210         * get_pages backends we should be better able to handle the
 211         * cancellation of the async task in a more uniform manner.
 212         */
 213        if (!pages && !i915_gem_object_needs_async_cancel(obj))
 214                pages = ERR_PTR(-EINVAL);
 215
 216        if (!IS_ERR(pages))
 217                obj->ops->put_pages(obj, pages);
 218
 219        err = 0;
 220unlock:
 221        mutex_unlock(&obj->mm.lock);
 222
 223        return err;
 224}
 225
 226/* The 'mapping' part of i915_gem_object_pin_map() below */
 227static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,
 228                                 enum i915_map_type type)
 229{
 230        unsigned long n_pages = obj->base.size >> PAGE_SHIFT;
 231        struct sg_table *sgt = obj->mm.pages;
 232        struct sgt_iter sgt_iter;
 233        struct page *page;
 234        struct page *stack_pages[32];
 235        struct page **pages = stack_pages;
 236        unsigned long i = 0;
 237        pgprot_t pgprot;
 238        void *addr;
 239
 240        /* A single page can always be kmapped */
 241        if (n_pages == 1 && type == I915_MAP_WB)
 242                return kmap(sg_page(sgt->sgl));
 243
 244        if (n_pages > ARRAY_SIZE(stack_pages)) {
 245                /* Too big for stack -- allocate temporary array instead */
 246                pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL);
 247                if (!pages)
 248                        return NULL;
 249        }
 250
 251        for_each_sgt_page(page, sgt_iter, sgt)
 252                pages[i++] = page;
 253
 254        /* Check that we have the expected number of pages */
 255        GEM_BUG_ON(i != n_pages);
 256
 257        switch (type) {
 258        default:
 259                MISSING_CASE(type);
 260                /* fallthrough - to use PAGE_KERNEL anyway */
 261        case I915_MAP_WB:
 262                pgprot = PAGE_KERNEL;
 263                break;
 264        case I915_MAP_WC:
 265                pgprot = pgprot_writecombine(PAGE_KERNEL_IO);
 266                break;
 267        }
 268        addr = vmap(pages, n_pages, 0, pgprot);
 269
 270        if (pages != stack_pages)
 271                kvfree(pages);
 272
 273        return addr;
 274}
 275
 276/* get, pin, and map the pages of the object into kernel space */
 277void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
 278                              enum i915_map_type type)
 279{
 280        enum i915_map_type has_type;
 281        bool pinned;
 282        void *ptr;
 283        int err;
 284
 285        if (unlikely(!i915_gem_object_has_struct_page(obj)))
 286                return ERR_PTR(-ENXIO);
 287
 288        err = mutex_lock_interruptible(&obj->mm.lock);
 289        if (err)
 290                return ERR_PTR(err);
 291
 292        pinned = !(type & I915_MAP_OVERRIDE);
 293        type &= ~I915_MAP_OVERRIDE;
 294
 295        if (!atomic_inc_not_zero(&obj->mm.pages_pin_count)) {
 296                if (unlikely(!i915_gem_object_has_pages(obj))) {
 297                        GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
 298
 299                        err = ____i915_gem_object_get_pages(obj);
 300                        if (err)
 301                                goto err_unlock;
 302
 303                        smp_mb__before_atomic();
 304                }
 305                atomic_inc(&obj->mm.pages_pin_count);
 306                pinned = false;
 307        }
 308        GEM_BUG_ON(!i915_gem_object_has_pages(obj));
 309
 310        ptr = page_unpack_bits(obj->mm.mapping, &has_type);
 311        if (ptr && has_type != type) {
 312                if (pinned) {
 313                        err = -EBUSY;
 314                        goto err_unpin;
 315                }
 316
 317                if (is_vmalloc_addr(ptr))
 318                        vunmap(ptr);
 319                else
 320                        kunmap(kmap_to_page(ptr));
 321
 322                ptr = obj->mm.mapping = NULL;
 323        }
 324
 325        if (!ptr) {
 326                ptr = i915_gem_object_map(obj, type);
 327                if (!ptr) {
 328                        err = -ENOMEM;
 329                        goto err_unpin;
 330                }
 331
 332                obj->mm.mapping = page_pack_bits(ptr, type);
 333        }
 334
 335out_unlock:
 336        mutex_unlock(&obj->mm.lock);
 337        return ptr;
 338
 339err_unpin:
 340        atomic_dec(&obj->mm.pages_pin_count);
 341err_unlock:
 342        ptr = ERR_PTR(err);
 343        goto out_unlock;
 344}
 345
 346void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
 347                                 unsigned long offset,
 348                                 unsigned long size)
 349{
 350        enum i915_map_type has_type;
 351        void *ptr;
 352
 353        GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
 354        GEM_BUG_ON(range_overflows_t(typeof(obj->base.size),
 355                                     offset, size, obj->base.size));
 356
 357        obj->mm.dirty = true;
 358
 359        if (obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE)
 360                return;
 361
 362        ptr = page_unpack_bits(obj->mm.mapping, &has_type);
 363        if (has_type == I915_MAP_WC)
 364                return;
 365
 366        drm_clflush_virt_range(ptr + offset, size);
 367        if (size == obj->base.size) {
 368                obj->write_domain &= ~I915_GEM_DOMAIN_CPU;
 369                obj->cache_dirty = false;
 370        }
 371}
 372
 373struct scatterlist *
 374i915_gem_object_get_sg(struct drm_i915_gem_object *obj,
 375                       unsigned int n,
 376                       unsigned int *offset)
 377{
 378        struct i915_gem_object_page_iter *iter = &obj->mm.get_page;
 379        struct scatterlist *sg;
 380        unsigned int idx, count;
 381
 382        might_sleep();
 383        GEM_BUG_ON(n >= obj->base.size >> PAGE_SHIFT);
 384        GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
 385
 386        /* As we iterate forward through the sg, we record each entry in a
 387         * radixtree for quick repeated (backwards) lookups. If we have seen
 388         * this index previously, we will have an entry for it.
 389         *
 390         * Initial lookup is O(N), but this is amortized to O(1) for
 391         * sequential page access (where each new request is consecutive
 392         * to the previous one). Repeated lookups are O(lg(obj->base.size)),
 393         * i.e. O(1) with a large constant!
 394         */
 395        if (n < READ_ONCE(iter->sg_idx))
 396                goto lookup;
 397
 398        mutex_lock(&iter->lock);
 399
 400        /* We prefer to reuse the last sg so that repeated lookup of this
 401         * (or the subsequent) sg are fast - comparing against the last
 402         * sg is faster than going through the radixtree.
 403         */
 404
 405        sg = iter->sg_pos;
 406        idx = iter->sg_idx;
 407        count = __sg_page_count(sg);
 408
 409        while (idx + count <= n) {
 410                void *entry;
 411                unsigned long i;
 412                int ret;
 413
 414                /* If we cannot allocate and insert this entry, or the
 415                 * individual pages from this range, cancel updating the
 416                 * sg_idx so that on this lookup we are forced to linearly
 417                 * scan onwards, but on future lookups we will try the
 418                 * insertion again (in which case we need to be careful of
 419                 * the error return reporting that we have already inserted
 420                 * this index).
 421                 */
 422                ret = radix_tree_insert(&iter->radix, idx, sg);
 423                if (ret && ret != -EEXIST)
 424                        goto scan;
 425
 426                entry = xa_mk_value(idx);
 427                for (i = 1; i < count; i++) {
 428                        ret = radix_tree_insert(&iter->radix, idx + i, entry);
 429                        if (ret && ret != -EEXIST)
 430                                goto scan;
 431                }
 432
 433                idx += count;
 434                sg = ____sg_next(sg);
 435                count = __sg_page_count(sg);
 436        }
 437
 438scan:
 439        iter->sg_pos = sg;
 440        iter->sg_idx = idx;
 441
 442        mutex_unlock(&iter->lock);
 443
 444        if (unlikely(n < idx)) /* insertion completed by another thread */
 445                goto lookup;
 446
 447        /* In case we failed to insert the entry into the radixtree, we need
 448         * to look beyond the current sg.
 449         */
 450        while (idx + count <= n) {
 451                idx += count;
 452                sg = ____sg_next(sg);
 453                count = __sg_page_count(sg);
 454        }
 455
 456        *offset = n - idx;
 457        return sg;
 458
 459lookup:
 460        rcu_read_lock();
 461
 462        sg = radix_tree_lookup(&iter->radix, n);
 463        GEM_BUG_ON(!sg);
 464
 465        /* If this index is in the middle of multi-page sg entry,
 466         * the radix tree will contain a value entry that points
 467         * to the start of that range. We will return the pointer to
 468         * the base page and the offset of this page within the
 469         * sg entry's range.
 470         */
 471        *offset = 0;
 472        if (unlikely(xa_is_value(sg))) {
 473                unsigned long base = xa_to_value(sg);
 474
 475                sg = radix_tree_lookup(&iter->radix, base);
 476                GEM_BUG_ON(!sg);
 477
 478                *offset = n - base;
 479        }
 480
 481        rcu_read_unlock();
 482
 483        return sg;
 484}
 485
 486struct page *
 487i915_gem_object_get_page(struct drm_i915_gem_object *obj, unsigned int n)
 488{
 489        struct scatterlist *sg;
 490        unsigned int offset;
 491
 492        GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
 493
 494        sg = i915_gem_object_get_sg(obj, n, &offset);
 495        return nth_page(sg_page(sg), offset);
 496}
 497
 498/* Like i915_gem_object_get_page(), but mark the returned page dirty */
 499struct page *
 500i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj,
 501                               unsigned int n)
 502{
 503        struct page *page;
 504
 505        page = i915_gem_object_get_page(obj, n);
 506        if (!obj->mm.dirty)
 507                set_page_dirty(page);
 508
 509        return page;
 510}
 511
 512dma_addr_t
 513i915_gem_object_get_dma_address_len(struct drm_i915_gem_object *obj,
 514                                    unsigned long n,
 515                                    unsigned int *len)
 516{
 517        struct scatterlist *sg;
 518        unsigned int offset;
 519
 520        sg = i915_gem_object_get_sg(obj, n, &offset);
 521
 522        if (len)
 523                *len = sg_dma_len(sg) - (offset << PAGE_SHIFT);
 524
 525        return sg_dma_address(sg) + (offset << PAGE_SHIFT);
 526}
 527
 528dma_addr_t
 529i915_gem_object_get_dma_address(struct drm_i915_gem_object *obj,
 530                                unsigned long n)
 531{
 532        return i915_gem_object_get_dma_address_len(obj, n, NULL);
 533}
 534