Hi Igor,

[auto build test WARNING on linus/master]
[also build test WARNING on v4.12 next-20170710]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Igor-Stoppa/mm-security-ro-protection-for-dynamic-data/20170711-084116
config: i386-randconfig-x070-07101331 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

   mm/pmalloc.c: In function '__pmalloc_pool_show_avail':
   mm/pmalloc.c:78:25: warning: format '%lu' expects argument of type 'long 
unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
     return sprintf(buf, "%lu\n", gen_pool_avail(data->pool));
                            ^
   mm/pmalloc.c: In function '__pmalloc_pool_show_size':
   mm/pmalloc.c:88:25: warning: format '%lu' expects argument of type 'long 
unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
     return sprintf(buf, "%lu\n", gen_pool_size(data->pool));
                            ^
   In file included from include/linux/init.h:4:0,
                    from include/linux/printk.h:5,
                    from mm/pmalloc.c:13:
   mm/pmalloc.c: In function 'pmalloc':
   mm/pmalloc.c:263:5: warning: cast from pointer to integer of different size 
[-Wpointer-to-int-cast]
        (phys_addr_t)NULL, chunk_size, NUMA_NO_NODE));
        ^
   include/linux/compiler.h:175:42: note: in definition of macro 'unlikely'
    # define unlikely(x) __builtin_expect(!!(x), 0)
                                             ^
   mm/pmalloc.c:262:2: note: in expansion of macro 'BUG_ON'
     BUG_ON(gen_pool_add_virt(pool, (unsigned long)chunk,
     ^~~~~~
   mm/pmalloc.c: In function '__pmalloc_connect':
>> mm/pmalloc.c:118:2: warning: ignoring return value of 'sysfs_create_file', 
>> declared with attribute warn_unused_result [-Wunused-result]
     sysfs_create_file(data->pool_kobject, &data->attr_protected.attr);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/pmalloc.c:119:2: warning: ignoring return value of 'sysfs_create_file', 
declared with attribute warn_unused_result [-Wunused-result]
     sysfs_create_file(data->pool_kobject, &data->attr_avail.attr);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/pmalloc.c:120:2: warning: ignoring return value of 'sysfs_create_file', 
declared with attribute warn_unused_result [-Wunused-result]
     sysfs_create_file(data->pool_kobject, &data->attr_size.attr);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/pmalloc.c:121:2: warning: ignoring return value of 'sysfs_create_file', 
declared with attribute warn_unused_result [-Wunused-result]
     sysfs_create_file(data->pool_kobject, &data->attr_chunks.attr);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

vim +/sysfs_create_file +118 mm/pmalloc.c

   110  
   111  /**
   112   * Exposes the pool and its attributes through sysfs.
   113   */
   114  static void __pmalloc_connect(struct pmalloc_data *data)
   115  {
   116          data->pool_kobject = kobject_create_and_add(data->pool->name,
   117                                                      pmalloc_kobject);
 > 118          sysfs_create_file(data->pool_kobject, 
 > &data->attr_protected.attr);
   119          sysfs_create_file(data->pool_kobject, &data->attr_avail.attr);
   120          sysfs_create_file(data->pool_kobject, &data->attr_size.attr);
   121          sysfs_create_file(data->pool_kobject, &data->attr_chunks.attr);
   122  }
   123  
   124  /**
   125   * Removes the pool and its attributes from sysfs.
   126   */
   127  static void __pmalloc_disconnect(struct pmalloc_data *data)
   128  {
   129          sysfs_remove_file(data->pool_kobject, 
&data->attr_protected.attr);
   130          sysfs_remove_file(data->pool_kobject, &data->attr_avail.attr);
   131          sysfs_remove_file(data->pool_kobject, &data->attr_size.attr);
   132          sysfs_remove_file(data->pool_kobject, &data->attr_chunks.attr);
   133          kobject_put(data->pool_kobject);
   134  }
   135  
   136  /**
   137   * Declares an attribute of the pool.
   138   */
   139  
   140  
   141  #ifdef CONFIG_DEBUG_LOCK_ALLOC
   142  #define do_lock_dep(data, attr_name) \
   143          (data->attr_##attr_name.attr.ignore_lockdep = 1)
   144  #else
   145  #define do_lock_dep(data, attr_name) do {} while (0)
   146  #endif
   147  
   148  #define __pmalloc_attr_init(data, attr_name) \
   149  do { \
   150          data->attr_##attr_name.attr.name = #attr_name; \
   151          data->attr_##attr_name.attr.mode = 
VERIFY_OCTAL_PERMISSIONS(0444); \
   152          data->attr_##attr_name.show = __pmalloc_pool_show_##attr_name; \
   153          do_lock_dep(data, attr_name); \
   154  } while (0)
   155  
   156  struct gen_pool *pmalloc_create_pool(const char *name, int 
min_alloc_order)
   157  {
   158          struct gen_pool *pool;
   159          const char *pool_name;
   160          struct pmalloc_data *data;
   161  
   162          if (!name)
   163                  return NULL;
   164          pool_name = kstrdup(name, GFP_KERNEL);
   165          if (!pool_name)
   166                  return NULL;
   167          data = kzalloc(sizeof(struct pmalloc_data), GFP_KERNEL);
   168          if (!data)
   169                  return NULL;
   170          if (min_alloc_order < 0)
   171                  min_alloc_order = ilog2(sizeof(unsigned long));
   172          pool = gen_pool_create(min_alloc_order, NUMA_NO_NODE);
   173          if (!pool) {
   174                  kfree(pool_name);
   175                  kfree(data);
   176                  return NULL;
   177          }
   178          data->protected = false;
   179          data->pool = pool;
   180          mutex_init(&data->mutex);
   181          __pmalloc_attr_init(data, protected);
   182          __pmalloc_attr_init(data, avail);
   183          __pmalloc_attr_init(data, size);
   184          __pmalloc_attr_init(data, chunks);
   185          pool->data = data;
   186          pool->name = pool_name;
   187          mutex_lock(&pmalloc_mutex);
   188          list_add(&data->node, &pmalloc_tmp_list);
   189          if (pmalloc_list == &pmalloc_final_list)
   190                  __pmalloc_connect(data);
   191          mutex_unlock(&pmalloc_mutex);
   192          return pool;
   193  }
   194  
   195  
   196  bool is_pmalloc_page(struct page *page)
   197  {
   198          return page && page_private(page) &&
   199                  page->private == pmalloc_signature;
   200  }
   201  EXPORT_SYMBOL(is_pmalloc_page);
   202  
   203  /**
   204   * To support hardened usercopy, tag/untag pages supplied by pmalloc.
   205   * Pages are tagged when added to a pool and untagged when removed
   206   * from said pool.
   207   */
   208  #define PMALLOC_TAG_PAGE true
   209  #define PMALLOC_UNTAG_PAGE false
   210  static inline
   211  int __pmalloc_tag_pages(void *base, const size_t size, const bool 
set_tag)
   212  {
   213          void *end = base + size - 1;
   214  
   215          do {
   216                  struct page *page;
   217  
   218                  if (!is_vmalloc_addr(base))
   219                          return -EINVAL;
   220                  page = vmalloc_to_page(base);
   221                  if (set_tag) {
   222                          BUG_ON(page_private(page) || page->private);
   223                          set_page_private(page, 1);
   224                          page->private = pmalloc_signature;
   225                  } else {
   226                          BUG_ON(!(page_private(page) &&
   227                                   page->private == pmalloc_signature));
   228                          set_page_private(page, 0);
   229                          page->private = 0;
   230                  }
   231                  base += PAGE_SIZE;
   232          } while ((PAGE_MASK & (unsigned long)base) <=
   233                   (PAGE_MASK & (unsigned long)end));
   234          return 0;
   235  }
   236  
   237  
   238  static void __page_untag(struct gen_pool *pool,
   239                           struct gen_pool_chunk *chunk, void *data)
   240  {
   241          __pmalloc_tag_pages((void *)chunk->start_addr,
   242                              chunk->end_addr - chunk->start_addr + 1,
   243                              PMALLOC_UNTAG_PAGE);
   244  }
   245  
   246  void *pmalloc(struct gen_pool *pool, size_t size)
   247  {
   248          void *retval, *chunk;
   249          size_t chunk_size;
   250  
   251          if (!size || !pool || ((struct pmalloc_data 
*)pool->data)->protected)
   252                  return NULL;
   253          retval = (void *)gen_pool_alloc(pool, size);
   254          if (retval)
   255                  return retval;
   256          chunk_size = roundup(size, PAGE_SIZE);
   257          chunk = vmalloc(chunk_size);
   258          if (!chunk)
   259                  return NULL;
   260          __pmalloc_tag_pages(chunk, size, PMALLOC_TAG_PAGE);
   261          /* Locking is already done inside gen_pool_add_virt */
 > 262          BUG_ON(gen_pool_add_virt(pool, (unsigned long)chunk,
   263                                  (phys_addr_t)NULL, chunk_size, 
NUMA_NO_NODE));
   264          return (void *)gen_pool_alloc(pool, size);
   265  }
   266  

---
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