Blame view

include/linux/devcoredump.h 2.78 KB
522566376   Aviya Erenfeld   devcoredump: add ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /*
   * This file is provided under the GPLv2 license.
   *
   * GPL LICENSE SUMMARY
   *
   * Copyright(c) 2015 Intel Deutschland GmbH
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of version 2 of the GNU General Public License as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   *
   * The full GNU General Public License is included in this distribution
   * in the file called COPYING.
   */
833c95456   Johannes Berg   device coredump: ...
20
21
22
23
24
25
  #ifndef __DEVCOREDUMP_H
  #define __DEVCOREDUMP_H
  
  #include <linux/device.h>
  #include <linux/module.h>
  #include <linux/vmalloc.h>
522566376   Aviya Erenfeld   devcoredump: add ...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  #include <linux/scatterlist.h>
  #include <linux/slab.h>
  
  /*
   * _devcd_free_sgtable - free all the memory of the given scatterlist table
   * (i.e. both pages and scatterlist instances)
   * NOTE: if two tables allocated and chained using the sg_chain function then
   * this function should be called only once on the first table
   * @table: pointer to sg_table to free
   */
  static inline void _devcd_free_sgtable(struct scatterlist *table)
  {
  	int i;
  	struct page *page;
  	struct scatterlist *iter;
  	struct scatterlist *delete_iter;
  
  	/* free pages */
  	iter = table;
  	for_each_sg(table, iter, sg_nents(table), i) {
  		page = sg_page(iter);
  		if (page)
  			__free_page(page);
  	}
  
  	/* then free all chained tables */
  	iter = table;
  	delete_iter = table;	/* always points on a head of a table */
  	while (!sg_is_last(iter)) {
  		iter++;
  		if (sg_is_chain(iter)) {
  			iter = sg_chain_ptr(iter);
  			kfree(delete_iter);
  			delete_iter = iter;
  		}
  	}
  
  	/* free the last table */
  	kfree(delete_iter);
  }
833c95456   Johannes Berg   device coredump: ...
66
  #ifdef CONFIG_DEV_COREDUMP
522566376   Aviya Erenfeld   devcoredump: add ...
67
  void dev_coredumpv(struct device *dev, void *data, size_t datalen,
833c95456   Johannes Berg   device coredump: ...
68
69
70
  		   gfp_t gfp);
  
  void dev_coredumpm(struct device *dev, struct module *owner,
522566376   Aviya Erenfeld   devcoredump: add ...
71
  		   void *data, size_t datalen, gfp_t gfp,
833c95456   Johannes Berg   device coredump: ...
72
  		   ssize_t (*read)(char *buffer, loff_t offset, size_t count,
522566376   Aviya Erenfeld   devcoredump: add ...
73
74
75
76
77
  				   void *data, size_t datalen),
  		   void (*free)(void *data));
  
  void dev_coredumpsg(struct device *dev, struct scatterlist *table,
  		    size_t datalen, gfp_t gfp);
833c95456   Johannes Berg   device coredump: ...
78
  #else
522566376   Aviya Erenfeld   devcoredump: add ...
79
  static inline void dev_coredumpv(struct device *dev, void *data,
833c95456   Johannes Berg   device coredump: ...
80
81
82
83
84
85
86
  				 size_t datalen, gfp_t gfp)
  {
  	vfree(data);
  }
  
  static inline void
  dev_coredumpm(struct device *dev, struct module *owner,
522566376   Aviya Erenfeld   devcoredump: add ...
87
  	      void *data, size_t datalen, gfp_t gfp,
833c95456   Johannes Berg   device coredump: ...
88
  	      ssize_t (*read)(char *buffer, loff_t offset, size_t count,
522566376   Aviya Erenfeld   devcoredump: add ...
89
90
  			      void *data, size_t datalen),
  	      void (*free)(void *data))
833c95456   Johannes Berg   device coredump: ...
91
92
93
  {
  	free(data);
  }
522566376   Aviya Erenfeld   devcoredump: add ...
94
95
96
97
98
99
  
  static inline void dev_coredumpsg(struct device *dev, struct scatterlist *table,
  				  size_t datalen, gfp_t gfp)
  {
  	_devcd_free_sgtable(table);
  }
833c95456   Johannes Berg   device coredump: ...
100
101
102
  #endif /* CONFIG_DEV_COREDUMP */
  
  #endif /* __DEVCOREDUMP_H */