tree:   
https://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git master
head:   bb4f21f1ae06af0da93077b493a550d472bf18ac
commit: e4da156335d4cc6a6da53aa74409fbfe12c9d684 [12/38] Merge remote-tracking 
branch 'drm/drm-next' into renesas-drivers
config: i386-defconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        git checkout e4da156335d4cc6a6da53aa74409fbfe12c9d684
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers/gpu//drm/i915/i915_gem.c: In function 
'i915_gem_object_get_pages_gtt':
>> drivers/gpu//drm/i915/i915_gem.c:2562:19: error: called object 
>> 'totalram_pages' is not a function or function pointer
     if (page_count > totalram_pages())
                      ^~~~~~~~~~~~~~
   In file included from include/linux/shmem_fs.h:6:0,
                    from drivers/gpu//drm/i915/i915_drv.h:47,
                    from drivers/gpu//drm/i915/i915_gem.c:31:
   include/linux/swap.h:313:22: note: declared here
    extern unsigned long totalram_pages;
                         ^~~~~~~~~~~~~~

vim +/totalram_pages +2562 drivers/gpu//drm/i915/i915_gem.c

  2532  
  2533  static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object 
*obj)
  2534  {
  2535          struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
  2536          const unsigned long page_count = obj->base.size / PAGE_SIZE;
  2537          unsigned long i;
  2538          struct address_space *mapping;
  2539          struct sg_table *st;
  2540          struct scatterlist *sg;
  2541          struct sgt_iter sgt_iter;
  2542          struct page *page;
  2543          unsigned long last_pfn = 0;     /* suppress gcc warning */
  2544          unsigned int max_segment = i915_sg_segment_size();
  2545          unsigned int sg_page_sizes;
  2546          struct pagevec pvec;
  2547          gfp_t noreclaim;
  2548          int ret;
  2549  
  2550          /*
  2551           * Assert that the object is not currently in any GPU domain. 
As it
  2552           * wasn't in the GTT, there shouldn't be any way it could have 
been in
  2553           * a GPU cache
  2554           */
  2555          GEM_BUG_ON(obj->read_domains & I915_GEM_GPU_DOMAINS);
  2556          GEM_BUG_ON(obj->write_domain & I915_GEM_GPU_DOMAINS);
  2557  
  2558          /*
  2559           * If there's no chance of allocating enough pages for the whole
  2560           * object, bail early.
  2561           */
> 2562          if (page_count > totalram_pages())
  2563                  return -ENOMEM;
  2564  
  2565          st = kmalloc(sizeof(*st), GFP_KERNEL);
  2566          if (st == NULL)
  2567                  return -ENOMEM;
  2568  
  2569  rebuild_st:
  2570          if (sg_alloc_table(st, page_count, GFP_KERNEL)) {
  2571                  kfree(st);
  2572                  return -ENOMEM;
  2573          }
  2574  
  2575          /*
  2576           * Get the list of pages out of our struct file.  They'll be 
pinned
  2577           * at this point until we release them.
  2578           *
  2579           * Fail silently without starting the shrinker
  2580           */
  2581          mapping = obj->base.filp->f_mapping;
  2582          mapping_set_unevictable(mapping);
  2583          noreclaim = mapping_gfp_constraint(mapping, ~__GFP_RECLAIM);
  2584          noreclaim |= __GFP_NORETRY | __GFP_NOWARN;
  2585  
  2586          sg = st->sgl;
  2587          st->nents = 0;
  2588          sg_page_sizes = 0;
  2589          for (i = 0; i < page_count; i++) {
  2590                  const unsigned int shrink[] = {
  2591                          I915_SHRINK_BOUND | I915_SHRINK_UNBOUND | 
I915_SHRINK_PURGEABLE,
  2592                          0,
  2593                  }, *s = shrink;
  2594                  gfp_t gfp = noreclaim;
  2595  
  2596                  do {
  2597                          cond_resched();
  2598                          page = shmem_read_mapping_page_gfp(mapping, i, 
gfp);
  2599                          if (likely(!IS_ERR(page)))
  2600                                  break;
  2601  
  2602                          if (!*s) {
  2603                                  ret = PTR_ERR(page);
  2604                                  goto err_sg;
  2605                          }
  2606  
  2607                          i915_gem_shrink(dev_priv, 2 * page_count, NULL, 
*s++);
  2608  
  2609                          /*
  2610                           * We've tried hard to allocate the memory by 
reaping
  2611                           * our own buffer, now let the real VM do its 
job and
  2612                           * go down in flames if truly OOM.
  2613                           *
  2614                           * However, since graphics tend to be 
disposable,
  2615                           * defer the oom here by reporting the ENOMEM 
back
  2616                           * to userspace.
  2617                           */
  2618                          if (!*s) {
  2619                                  /* reclaim and warn, but no oom */
  2620                                  gfp = mapping_gfp_mask(mapping);
  2621  
  2622                                  /*
  2623                                   * Our bo are always dirty and so we 
require
  2624                                   * kswapd to reclaim our pages (direct 
reclaim
  2625                                   * does not effectively begin pageout 
of our
  2626                                   * buffers on its own). However, direct 
reclaim
  2627                                   * only waits for kswapd when under 
allocation
  2628                                   * congestion. So as a result 
__GFP_RECLAIM is
  2629                                   * unreliable and fails to actually 
reclaim our
  2630                                   * dirty pages -- unless you try over 
and over
  2631                                   * again with !__GFP_NORETRY. However, 
we still
  2632                                   * want to fail this allocation rather 
than
  2633                                   * trigger the out-of-memory killer and 
for
  2634                                   * this we want __GFP_RETRY_MAYFAIL.
  2635                                   */
  2636                                  gfp |= __GFP_RETRY_MAYFAIL;
  2637                          }
  2638                  } while (1);
  2639  
  2640                  if (!i ||
  2641                      sg->length >= max_segment ||
  2642                      page_to_pfn(page) != last_pfn + 1) {
  2643                          if (i) {
  2644                                  sg_page_sizes |= sg->length;
  2645                                  sg = sg_next(sg);
  2646                          }
  2647                          st->nents++;
  2648                          sg_set_page(sg, page, PAGE_SIZE, 0);
  2649                  } else {
  2650                          sg->length += PAGE_SIZE;
  2651                  }
  2652                  last_pfn = page_to_pfn(page);
  2653  
  2654                  /* Check that the i965g/gm workaround works. */
  2655                  WARN_ON((gfp & __GFP_DMA32) && (last_pfn >= 
0x00100000UL));
  2656          }
  2657          if (sg) { /* loop terminated early; short sg table */
  2658                  sg_page_sizes |= sg->length;
  2659                  sg_mark_end(sg);
  2660          }
  2661  
  2662          /* Trim unused sg entries to avoid wasting memory. */
  2663          i915_sg_trim(st);
  2664  
  2665          ret = i915_gem_gtt_prepare_pages(obj, st);
  2666          if (ret) {
  2667                  /*
  2668                   * DMA remapping failed? One possible cause is that
  2669                   * it could not reserve enough large entries, asking
  2670                   * for PAGE_SIZE chunks instead may be helpful.
  2671                   */
  2672                  if (max_segment > PAGE_SIZE) {
  2673                          for_each_sgt_page(page, sgt_iter, st)
  2674                                  put_page(page);
  2675                          sg_free_table(st);
  2676  
  2677                          max_segment = PAGE_SIZE;
  2678                          goto rebuild_st;
  2679                  } else {
  2680                          dev_warn(&dev_priv->drm.pdev->dev,
  2681                                   "Failed to DMA remap %lu pages\n",
  2682                                   page_count);
  2683                          goto err_pages;
  2684                  }
  2685          }
  2686  
  2687          if (i915_gem_object_needs_bit17_swizzle(obj))
  2688                  i915_gem_object_do_bit_17_swizzle(obj, st);
  2689  
  2690          __i915_gem_object_set_pages(obj, st, sg_page_sizes);
  2691  
  2692          return 0;
  2693  
  2694  err_sg:
  2695          sg_mark_end(sg);
  2696  err_pages:
  2697          mapping_clear_unevictable(mapping);
  2698          pagevec_init(&pvec);
  2699          for_each_sgt_page(page, sgt_iter, st) {
  2700                  if (!pagevec_add(&pvec, page))
  2701                          check_release_pagevec(&pvec);
  2702          }
  2703          if (pagevec_count(&pvec))
  2704                  check_release_pagevec(&pvec);
  2705          sg_free_table(st);
  2706          kfree(st);
  2707  
  2708          /*
  2709           * shmemfs first checks if there is enough memory to allocate 
the page
  2710           * and reports ENOSPC should there be insufficient, along with 
the usual
  2711           * ENOMEM for a genuine allocation failure.
  2712           *
  2713           * We use ENOSPC in our driver to mean that we have run out of 
aperture
  2714           * space and so want to translate the error from shmemfs back 
to our
  2715           * usual understanding of ENOMEM.
  2716           */
  2717          if (ret == -ENOSPC)
  2718                  ret = -ENOMEM;
  2719  
  2720          return ret;
  2721  }
  2722  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to