Commit 12e46c46 authored by NeilBrown's avatar NeilBrown Committed by Greg Kroah-Hartman
Browse files

staging: lustre: change some LIBCFS_ALLOC calls to k?alloc(GFP_KERNEL)



When an allocation happens from process context rather than
filesystem context, it is best to use GFP_KERNEL rather than
LIBCFS_ALLOC() which always uses GFP_NOFS.
This include initialization during, or prior to, mount,
and code run from separate worker threads.

So for some of these cases, switch to kmalloc, kvmalloc, or
kvmalloc_array() as appropriate.
In some cases we preserve __GFP_ZERO (via kzalloc/kvzalloc), but in
others it is clear that allocated memory is immediately initialized.

In each case, the matching LIBCFS_FREE() is converted to
kfree() or kvfree()

This is just a subset of locations that need changing.
As there are quite a lot, I've broken them up into several
ad-hoc sets to avoid review-fatigue.

Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2aa8b1b7
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -85,11 +85,11 @@ static inline void
cfs_expr_list_values_free(u32 *values, int num)
{
	/*
	 * This array is allocated by LIBCFS_ALLOC(), so it shouldn't be freed
	 * This array is allocated by kvalloc(), so it shouldn't be freed
	 * by OBD_FREE() if it's called by module other than libcfs & LNet,
	 * otherwise we will see fake memory leak
	 */
	LIBCFS_FREE(values, num * sizeof(values[0]));
	kvfree(values);
}

void cfs_expr_list_free(struct cfs_expr_list *expr_list);
+4 −7
Original line number Diff line number Diff line
@@ -2576,11 +2576,7 @@ static void kiblnd_base_shutdown(void)
		break;
	}

	if (kiblnd_data.kib_peers) {
		LIBCFS_FREE(kiblnd_data.kib_peers,
			    sizeof(struct list_head) *
			    kiblnd_data.kib_peer_hash_size);
	}
	kvfree(kiblnd_data.kib_peers);

	if (kiblnd_data.kib_scheds)
		cfs_percpt_free(kiblnd_data.kib_scheds);
@@ -2672,8 +2668,9 @@ static int kiblnd_base_startup(void)
	INIT_LIST_HEAD(&kiblnd_data.kib_failed_devs);

	kiblnd_data.kib_peer_hash_size = IBLND_PEER_HASH_SIZE;
	LIBCFS_ALLOC(kiblnd_data.kib_peers,
		     sizeof(struct list_head) * kiblnd_data.kib_peer_hash_size);
	kiblnd_data.kib_peers = kvmalloc_array(kiblnd_data.kib_peer_hash_size,
					       sizeof(struct list_head),
					       GFP_KERNEL);
	if (!kiblnd_data.kib_peers)
		goto failed;
	for (i = 0; i < kiblnd_data.kib_peer_hash_size; i++)
+9 −13
Original line number Diff line number Diff line
@@ -1070,8 +1070,9 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_route *route,
	conn->ksnc_tx_carrier = NULL;
	atomic_set(&conn->ksnc_tx_nob, 0);

	LIBCFS_ALLOC(hello, offsetof(struct ksock_hello_msg,
				     kshm_ips[LNET_MAX_INTERFACES]));
	hello = kvzalloc(offsetof(struct ksock_hello_msg,
				  kshm_ips[LNET_MAX_INTERFACES]),
			 GFP_KERNEL);
	if (!hello) {
		rc = -ENOMEM;
		goto failed_1;
@@ -1334,8 +1335,7 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_route *route,
		rc = ksocknal_send_hello(ni, conn, peerid.nid, hello);
	}

	LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
				    kshm_ips[LNET_MAX_INTERFACES]));
	kvfree(hello);

	/*
	 * setup the socket AFTER I've received hello (it disables
@@ -1415,9 +1415,7 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_route *route,
	ksocknal_peer_decref(peer);

failed_1:
	if (hello)
		LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
					    kshm_ips[LNET_MAX_INTERFACES]));
	kvfree(hello);

	kfree(conn);

@@ -2269,9 +2267,7 @@ ksocknal_free_buffers(void)
		cfs_percpt_free(ksocknal_data.ksnd_sched_info);
	}

	LIBCFS_FREE(ksocknal_data.ksnd_peers,
		    sizeof(struct list_head) *
		    ksocknal_data.ksnd_peer_hash_size);
	kvfree(ksocknal_data.ksnd_peers);

	spin_lock(&ksocknal_data.ksnd_tx_lock);

@@ -2401,9 +2397,9 @@ ksocknal_base_startup(void)
	memset(&ksocknal_data, 0, sizeof(ksocknal_data)); /* zero pointers */

	ksocknal_data.ksnd_peer_hash_size = SOCKNAL_PEER_HASH_SIZE;
	LIBCFS_ALLOC(ksocknal_data.ksnd_peers,
		     sizeof(struct list_head) *
		     ksocknal_data.ksnd_peer_hash_size);
	ksocknal_data.ksnd_peers = kvmalloc_array(ksocknal_data.ksnd_peer_hash_size,
						  sizeof(struct list_head),
						  GFP_KERNEL);
	if (!ksocknal_data.ksnd_peers)
		return -ENOMEM;

+8 −10
Original line number Diff line number Diff line
@@ -864,12 +864,10 @@ cfs_hash_buckets_free(struct cfs_hash_bucket **buckets,
{
	int i;

	for (i = prev_size; i < size; i++) {
		if (buckets[i])
			LIBCFS_FREE(buckets[i], bkt_size);
	}
	for (i = prev_size; i < size; i++)
		kfree(buckets[i]);

	LIBCFS_FREE(buckets, sizeof(buckets[0]) * size);
	kvfree(buckets);
}

/*
@@ -889,7 +887,7 @@ cfs_hash_buckets_realloc(struct cfs_hash *hs, struct cfs_hash_bucket **old_bkts,
	if (old_bkts && old_size == new_size)
		return old_bkts;

	LIBCFS_ALLOC(new_bkts, sizeof(new_bkts[0]) * new_size);
	new_bkts = kvmalloc_array(new_size, sizeof(new_bkts[0]), GFP_KERNEL);
	if (!new_bkts)
		return NULL;

@@ -902,7 +900,7 @@ cfs_hash_buckets_realloc(struct cfs_hash *hs, struct cfs_hash_bucket **old_bkts,
		struct hlist_head *hhead;
		struct cfs_hash_bd bd;

		LIBCFS_ALLOC(new_bkts[i], cfs_hash_bkt_size(hs));
		new_bkts[i] = kzalloc(cfs_hash_bkt_size(hs), GFP_KERNEL);
		if (!new_bkts[i]) {
			cfs_hash_buckets_free(new_bkts, cfs_hash_bkt_size(hs),
					      old_size, new_size);
@@ -1014,7 +1012,7 @@ cfs_hash_create(char *name, unsigned int cur_bits, unsigned int max_bits,

	len = !(flags & CFS_HASH_BIGNAME) ?
	      CFS_HASH_NAME_LEN : CFS_HASH_BIGNAME_LEN;
	LIBCFS_ALLOC(hs, offsetof(struct cfs_hash, hs_name[len]));
	hs = kzalloc(offsetof(struct cfs_hash, hs_name[len]), GFP_KERNEL);
	if (!hs)
		return NULL;

@@ -1046,7 +1044,7 @@ cfs_hash_create(char *name, unsigned int cur_bits, unsigned int max_bits,
	if (hs->hs_buckets)
		return hs;

	LIBCFS_FREE(hs, offsetof(struct cfs_hash, hs_name[len]));
	kfree(hs);
	return NULL;
}
EXPORT_SYMBOL(cfs_hash_create);
@@ -1109,7 +1107,7 @@ cfs_hash_destroy(struct cfs_hash *hs)
			      0, CFS_HASH_NBKT(hs));
	i = cfs_hash_with_bigname(hs) ?
	    CFS_HASH_BIGNAME_LEN : CFS_HASH_NAME_LEN;
	LIBCFS_FREE(hs, offsetof(struct cfs_hash, hs_name[i]));
	kfree(hs);
}

struct cfs_hash *cfs_hash_getref(struct cfs_hash *hs)
+4 −5
Original line number Diff line number Diff line
@@ -130,10 +130,9 @@ cfs_array_free(void *vars)
		if (!arr->va_ptrs[i])
			continue;

		LIBCFS_FREE(arr->va_ptrs[i], arr->va_size);
		kvfree(arr->va_ptrs[i]);
	}
	LIBCFS_FREE(arr, offsetof(struct cfs_var_array,
				  va_ptrs[arr->va_count]));
	kvfree(arr);
}
EXPORT_SYMBOL(cfs_array_free);

@@ -148,7 +147,7 @@ cfs_array_alloc(int count, unsigned int size)
	struct cfs_var_array *arr;
	int i;

	LIBCFS_ALLOC(arr, offsetof(struct cfs_var_array, va_ptrs[count]));
	arr = kvmalloc(offsetof(struct cfs_var_array, va_ptrs[count]), GFP_KERNEL);
	if (!arr)
		return NULL;

@@ -156,7 +155,7 @@ cfs_array_alloc(int count, unsigned int size)
	arr->va_size = size;

	for (i = 0; i < count; i++) {
		LIBCFS_ALLOC(arr->va_ptrs[i], size);
		arr->va_ptrs[i] = kvzalloc(size, GFP_KERNEL);

		if (!arr->va_ptrs[i]) {
			cfs_array_free((void *)&arr->va_ptrs[0]);
Loading