All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ax25: use GFP_KERNEL over GFP_ATOMIC where possible
@ 2022-06-02 11:21 Peter Lafreniere
  2022-06-03  2:47 ` Jakub Kicinski
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Peter Lafreniere @ 2022-06-02 11:21 UTC (permalink / raw)
  To: linux-hams; +Cc: ralf, netdev, Peter Lafreniere

There are a few functions that can sleep that use GFP_ATOMIC.
Here we change allocations to use the more reliable GFP_KERNEL
flag.

ax25_dev_device_up() is only called during device setup, which is
done in user context. In addition, ax25_dev_device_up()
unconditionally calls ax25_register_dev_sysctl(), which already
allocates with GFP_KERNEL.

ax25_rt_add() is a static function that is only called from
ax25_rt_ioctl(), which must run in user context already due to
copy_from_user() usage.

Since it is allowed to sleep in both of these functions, here we
change the functions to use GFP_KERNEL to reduce unnecessary
out-of-memory errors.

Signed-off-by: Peter Lafreniere <pjlafren@mtu.edu>
---
 net/ax25/ax25_dev.c   | 4 ++--
 net/ax25/ax25_route.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/ax25/ax25_dev.c b/net/ax25/ax25_dev.c
index d2a244e1c260..b264904980a8 100644
--- a/net/ax25/ax25_dev.c
+++ b/net/ax25/ax25_dev.c
@@ -52,7 +52,7 @@ void ax25_dev_device_up(struct net_device *dev)
 {
 	ax25_dev *ax25_dev;
 
-	if ((ax25_dev = kzalloc(sizeof(*ax25_dev), GFP_ATOMIC)) == NULL) {
+	if ((ax25_dev = kzalloc(sizeof(*ax25_dev), GFP_KERNEL)) == NULL) {
 		printk(KERN_ERR "AX.25: ax25_dev_device_up - out of memory\n");
 		return;
 	}
@@ -60,7 +60,7 @@ void ax25_dev_device_up(struct net_device *dev)
 	refcount_set(&ax25_dev->refcount, 1);
 	dev->ax25_ptr     = ax25_dev;
 	ax25_dev->dev     = dev;
-	dev_hold_track(dev, &ax25_dev->dev_tracker, GFP_ATOMIC);
+	dev_hold_track(dev, &ax25_dev->dev_tracker, GFP_KERNEL);
 	ax25_dev->forward = NULL;
 
 	ax25_dev->values[AX25_VALUES_IPDEFMODE] = AX25_DEF_IPDEFMODE;
diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c
index b7c4d656a94b..c77b848ccfc7 100644
--- a/net/ax25/ax25_route.c
+++ b/net/ax25/ax25_route.c
@@ -91,7 +91,7 @@ static int __must_check ax25_rt_add(struct ax25_routes_struct *route)
 			kfree(ax25_rt->digipeat);
 			ax25_rt->digipeat = NULL;
 			if (route->digi_count != 0) {
-				if ((ax25_rt->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
+				if ((ax25_rt->digipeat = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
 					write_unlock_bh(&ax25_route_lock);
 					ax25_dev_put(ax25_dev);
 					return -ENOMEM;
@@ -110,7 +110,7 @@ static int __must_check ax25_rt_add(struct ax25_routes_struct *route)
 		ax25_rt = ax25_rt->next;
 	}
 
-	if ((ax25_rt = kmalloc(sizeof(ax25_route), GFP_ATOMIC)) == NULL) {
+	if ((ax25_rt = kmalloc(sizeof(ax25_route), GFP_KERNEL)) == NULL) {
 		write_unlock_bh(&ax25_route_lock);
 		ax25_dev_put(ax25_dev);
 		return -ENOMEM;
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread
* Re: [PATCH] ax25: use GFP_KERNEL over GFP_ATOMIC where possible
  2022-06-02 11:21 [PATCH] ax25: use GFP_KERNEL over GFP_ATOMIC where possible Peter Lafreniere
@ 2022-06-06 11:54 ` Dan Carpenter
  2022-06-06 11:50 ` Dan Carpenter
  2022-06-06 11:54 ` Dan Carpenter
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-06-03  7:37 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 7510 bytes --]

CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220602112138.8200-1-pjlafren@mtu.edu>
References: <20220602112138.8200-1-pjlafren@mtu.edu>
TO: Peter Lafreniere <pjlafren@mtu.edu>
TO: linux-hams(a)vger.kernel.org
CC: ralf(a)linux-mips.org
CC: netdev(a)vger.kernel.org
CC: Peter Lafreniere <pjlafren@mtu.edu>

Hi Peter,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on horms-ipvs/master]
[also build test WARNING on net/master net-next/master linus/master v5.18 next-20220603]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Peter-Lafreniere/ax25-use-GFP_KERNEL-over-GFP_ATOMIC-where-possible/20220602-192326
base:   https://git.kernel.org/pub/scm/linux/kernel/git/horms/ipvs.git master
:::::: branch date: 20 hours ago
:::::: commit date: 20 hours ago
config: nios2-randconfig-m031-20220601 (https://download.01.org/0day-ci/archive/20220603/202206031536.t0bHoh3z-lkp(a)intel.com/config)
compiler: nios2-linux-gcc (GCC) 11.3.0

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
net/ax25/ax25_route.c:94 ax25_rt_add() warn: sleeping in atomic context

Old smatch warnings:
arch/nios2/include/asm/thread_info.h:62 current_thread_info() error: uninitialized symbol 'sp'.
net/ax25/ax25_route.c:113 ax25_rt_add() warn: sleeping in atomic context

vim +94 net/ax25/ax25_route.c

^1da177e4c3f415 Linus Torvalds   2005-04-16   71  
c9266b99e2def0a Ralf Baechle     2006-12-14   72  static int __must_check ax25_rt_add(struct ax25_routes_struct *route)
^1da177e4c3f415 Linus Torvalds   2005-04-16   73  {
^1da177e4c3f415 Linus Torvalds   2005-04-16   74  	ax25_route *ax25_rt;
^1da177e4c3f415 Linus Torvalds   2005-04-16   75  	ax25_dev *ax25_dev;
^1da177e4c3f415 Linus Torvalds   2005-04-16   76  	int i;
^1da177e4c3f415 Linus Torvalds   2005-04-16   77  
^1da177e4c3f415 Linus Torvalds   2005-04-16   78  	if (route->digi_count > AX25_MAX_DIGIS)
^1da177e4c3f415 Linus Torvalds   2005-04-16   79  		return -EINVAL;
^1da177e4c3f415 Linus Torvalds   2005-04-16   80  
87563a043cef044 Duoming Zhou     2022-02-03   81  	ax25_dev = ax25_addr_ax25dev(&route->port_addr);
87563a043cef044 Duoming Zhou     2022-02-03   82  	if (!ax25_dev)
87563a043cef044 Duoming Zhou     2022-02-03   83  		return -EINVAL;
87563a043cef044 Duoming Zhou     2022-02-03   84  
4de211f1a279275 Jarek Poplawski  2008-02-11   85  	write_lock_bh(&ax25_route_lock);
^1da177e4c3f415 Linus Torvalds   2005-04-16   86  
^1da177e4c3f415 Linus Torvalds   2005-04-16   87  	ax25_rt = ax25_route_list;
^1da177e4c3f415 Linus Torvalds   2005-04-16   88  	while (ax25_rt != NULL) {
^1da177e4c3f415 Linus Torvalds   2005-04-16   89  		if (ax25cmp(&ax25_rt->callsign, &route->dest_addr) == 0 &&
^1da177e4c3f415 Linus Torvalds   2005-04-16   90  			    ax25_rt->dev == ax25_dev->dev) {
^1da177e4c3f415 Linus Torvalds   2005-04-16   91  			kfree(ax25_rt->digipeat);
^1da177e4c3f415 Linus Torvalds   2005-04-16   92  			ax25_rt->digipeat = NULL;
^1da177e4c3f415 Linus Torvalds   2005-04-16   93  			if (route->digi_count != 0) {
10c95f710e8899b Peter Lafreniere 2022-06-02  @94  				if ((ax25_rt->digipeat = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
4de211f1a279275 Jarek Poplawski  2008-02-11   95  					write_unlock_bh(&ax25_route_lock);
87563a043cef044 Duoming Zhou     2022-02-03   96  					ax25_dev_put(ax25_dev);
^1da177e4c3f415 Linus Torvalds   2005-04-16   97  					return -ENOMEM;
^1da177e4c3f415 Linus Torvalds   2005-04-16   98  				}
^1da177e4c3f415 Linus Torvalds   2005-04-16   99  				ax25_rt->digipeat->lastrepeat = -1;
^1da177e4c3f415 Linus Torvalds   2005-04-16  100  				ax25_rt->digipeat->ndigi      = route->digi_count;
^1da177e4c3f415 Linus Torvalds   2005-04-16  101  				for (i = 0; i < route->digi_count; i++) {
^1da177e4c3f415 Linus Torvalds   2005-04-16  102  					ax25_rt->digipeat->repeated[i] = 0;
^1da177e4c3f415 Linus Torvalds   2005-04-16  103  					ax25_rt->digipeat->calls[i]    = route->digi_addr[i];
^1da177e4c3f415 Linus Torvalds   2005-04-16  104  				}
^1da177e4c3f415 Linus Torvalds   2005-04-16  105  			}
4de211f1a279275 Jarek Poplawski  2008-02-11  106  			write_unlock_bh(&ax25_route_lock);
87563a043cef044 Duoming Zhou     2022-02-03  107  			ax25_dev_put(ax25_dev);
^1da177e4c3f415 Linus Torvalds   2005-04-16  108  			return 0;
^1da177e4c3f415 Linus Torvalds   2005-04-16  109  		}
^1da177e4c3f415 Linus Torvalds   2005-04-16  110  		ax25_rt = ax25_rt->next;
^1da177e4c3f415 Linus Torvalds   2005-04-16  111  	}
^1da177e4c3f415 Linus Torvalds   2005-04-16  112  
10c95f710e8899b Peter Lafreniere 2022-06-02  113  	if ((ax25_rt = kmalloc(sizeof(ax25_route), GFP_KERNEL)) == NULL) {
4de211f1a279275 Jarek Poplawski  2008-02-11  114  		write_unlock_bh(&ax25_route_lock);
87563a043cef044 Duoming Zhou     2022-02-03  115  		ax25_dev_put(ax25_dev);
^1da177e4c3f415 Linus Torvalds   2005-04-16  116  		return -ENOMEM;
^1da177e4c3f415 Linus Torvalds   2005-04-16  117  	}
^1da177e4c3f415 Linus Torvalds   2005-04-16  118  
^1da177e4c3f415 Linus Torvalds   2005-04-16  119  	ax25_rt->callsign     = route->dest_addr;
^1da177e4c3f415 Linus Torvalds   2005-04-16  120  	ax25_rt->dev          = ax25_dev->dev;
^1da177e4c3f415 Linus Torvalds   2005-04-16  121  	ax25_rt->digipeat     = NULL;
^1da177e4c3f415 Linus Torvalds   2005-04-16  122  	ax25_rt->ip_mode      = ' ';
^1da177e4c3f415 Linus Torvalds   2005-04-16  123  	if (route->digi_count != 0) {
^1da177e4c3f415 Linus Torvalds   2005-04-16  124  		if ((ax25_rt->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
4de211f1a279275 Jarek Poplawski  2008-02-11  125  			write_unlock_bh(&ax25_route_lock);
^1da177e4c3f415 Linus Torvalds   2005-04-16  126  			kfree(ax25_rt);
87563a043cef044 Duoming Zhou     2022-02-03  127  			ax25_dev_put(ax25_dev);
^1da177e4c3f415 Linus Torvalds   2005-04-16  128  			return -ENOMEM;
^1da177e4c3f415 Linus Torvalds   2005-04-16  129  		}
^1da177e4c3f415 Linus Torvalds   2005-04-16  130  		ax25_rt->digipeat->lastrepeat = -1;
^1da177e4c3f415 Linus Torvalds   2005-04-16  131  		ax25_rt->digipeat->ndigi      = route->digi_count;
^1da177e4c3f415 Linus Torvalds   2005-04-16  132  		for (i = 0; i < route->digi_count; i++) {
^1da177e4c3f415 Linus Torvalds   2005-04-16  133  			ax25_rt->digipeat->repeated[i] = 0;
^1da177e4c3f415 Linus Torvalds   2005-04-16  134  			ax25_rt->digipeat->calls[i]    = route->digi_addr[i];
^1da177e4c3f415 Linus Torvalds   2005-04-16  135  		}
^1da177e4c3f415 Linus Torvalds   2005-04-16  136  	}
^1da177e4c3f415 Linus Torvalds   2005-04-16  137  	ax25_rt->next   = ax25_route_list;
^1da177e4c3f415 Linus Torvalds   2005-04-16  138  	ax25_route_list = ax25_rt;
4de211f1a279275 Jarek Poplawski  2008-02-11  139  	write_unlock_bh(&ax25_route_lock);
87563a043cef044 Duoming Zhou     2022-02-03  140  	ax25_dev_put(ax25_dev);
^1da177e4c3f415 Linus Torvalds   2005-04-16  141  
^1da177e4c3f415 Linus Torvalds   2005-04-16  142  	return 0;
^1da177e4c3f415 Linus Torvalds   2005-04-16  143  }
^1da177e4c3f415 Linus Torvalds   2005-04-16  144  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-06-06 11:54 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-02 11:21 [PATCH] ax25: use GFP_KERNEL over GFP_ATOMIC where possible Peter Lafreniere
2022-06-03  2:47 ` Jakub Kicinski
2022-06-06 11:50 ` Dan Carpenter
2022-06-06 11:54 ` Dan Carpenter
2022-06-03  7:37 kernel test robot
2022-06-06 11:54 ` Dan Carpenter

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.