Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35190506 authored by Dean Nelson's avatar Dean Nelson Committed by Tony Luck
Browse files

[IA64] run rest drivers/misc/sgi-xp through scripts/Lindent



Ran patches through scripts/Lindent (part 2).

Signed-off-by: default avatarDean Nelson <dcn@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 4a3ad2dd
Loading
Loading
Loading
Loading
+148 −242
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@
 * Copyright (c) 2004-2008 Silicon Graphics, Inc.  All Rights Reserved.
 */


/*
 * Cross Partition Communication (XPC) channel support.
 *
@@ -15,7 +14,6 @@
 *
 */


#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
@@ -27,7 +25,6 @@
#include <asm/sn/sn_sal.h>
#include "xpc.h"


/*
 * Guarantee that the kzalloc'd memory is cacheline aligned.
 */
@@ -52,7 +49,6 @@ xpc_kzalloc_cacheline_aligned(size_t size, gfp_t flags, void **base)
	return (void *)L1_CACHE_ALIGN((u64)*base);
}


/*
 * Set up the initial values for the XPartition Communication channels.
 */
@@ -62,7 +58,6 @@ xpc_initialize_channels(struct xpc_partition *part, partid_t partid)
	int ch_number;
	struct xpc_channel *ch;


	for (ch_number = 0; ch_number < part->nchannels; ch_number++) {
		ch = &part->channels[ch_number];

@@ -91,7 +86,6 @@ xpc_initialize_channels(struct xpc_partition *part, partid_t partid)
	}
}


/*
 * Setup the infrastructure necessary to support XPartition Communication
 * between the specified remote partition and the local one.
@@ -103,7 +97,6 @@ xpc_setup_infrastructure(struct xpc_partition *part)
	struct timer_list *timer;
	partid_t partid = XPC_PARTID(part);


	/*
	 * Zero out MOST of the entry for this partition. Only the fields
	 * starting with `nchannels' will be zeroed. The preceding fields must
@@ -126,11 +119,11 @@ xpc_setup_infrastructure(struct xpc_partition *part)

	part->nchannels = XPC_NCHANNELS;


	/* allocate all the required GET/PUT values */

	part->local_GPs = xpc_kzalloc_cacheline_aligned(XPC_GP_SIZE,
					GFP_KERNEL, &part->local_GPs_base);
							GFP_KERNEL,
							&part->local_GPs_base);
	if (part->local_GPs == NULL) {
		kfree(part->channels);
		part->channels = NULL;
@@ -140,7 +133,9 @@ xpc_setup_infrastructure(struct xpc_partition *part)
	}

	part->remote_GPs = xpc_kzalloc_cacheline_aligned(XPC_GP_SIZE,
					GFP_KERNEL, &part->remote_GPs_base);
							 GFP_KERNEL,
							 &part->
							 remote_GPs_base);
	if (part->remote_GPs == NULL) {
		dev_err(xpc_chan, "can't get memory for remote get/put "
			"values\n");
@@ -151,11 +146,10 @@ xpc_setup_infrastructure(struct xpc_partition *part)
		return xpcNoMemory;
	}


	/* allocate all the required open and close args */

	part->local_openclose_args = xpc_kzalloc_cacheline_aligned(
					XPC_OPENCLOSE_ARGS_SIZE, GFP_KERNEL,
	part->local_openclose_args =
	    xpc_kzalloc_cacheline_aligned(XPC_OPENCLOSE_ARGS_SIZE, GFP_KERNEL,
					  &part->local_openclose_args_base);
	if (part->local_openclose_args == NULL) {
		dev_err(xpc_chan, "can't get memory for local connect args\n");
@@ -168,8 +162,8 @@ xpc_setup_infrastructure(struct xpc_partition *part)
		return xpcNoMemory;
	}

	part->remote_openclose_args = xpc_kzalloc_cacheline_aligned(
					XPC_OPENCLOSE_ARGS_SIZE, GFP_KERNEL,
	part->remote_openclose_args =
	    xpc_kzalloc_cacheline_aligned(XPC_OPENCLOSE_ARGS_SIZE, GFP_KERNEL,
					  &part->remote_openclose_args_base);
	if (part->remote_openclose_args == NULL) {
		dev_err(xpc_chan, "can't get memory for remote connect args\n");
@@ -184,13 +178,11 @@ xpc_setup_infrastructure(struct xpc_partition *part)
		return xpcNoMemory;
	}


	xpc_initialize_channels(part, partid);

	atomic_set(&part->nchannels_active, 0);
	atomic_set(&part->nchannels_engaged, 0);


	/* local_IPI_amo were set to 0 by an earlier memset() */

	/* Initialize this partitions AMO_t structure */
@@ -234,7 +226,6 @@ xpc_setup_infrastructure(struct xpc_partition *part)
	 */
	part->setup_state = XPC_P_SETUP;


	/*
	 * Setup the per partition specific variables required by the
	 * remote partition to establish channel connections with us.
@@ -255,7 +246,6 @@ xpc_setup_infrastructure(struct xpc_partition *part)
	return xpcSuccess;
}


/*
 * Create a wrapper that hides the underlying mechanism for pulling a cacheline
 * (or multiple cachelines) from a remote partition.
@@ -270,7 +260,6 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst,
{
	bte_result_t bte_ret;


	DBUG_ON((u64)src != L1_CACHE_ALIGN((u64)src));
	DBUG_ON((u64)dst != L1_CACHE_ALIGN((u64)dst));
	DBUG_ON(cnt != L1_CACHE_ALIGN(cnt));
@@ -291,7 +280,6 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst,
	return xpc_map_bte_errors(bte_ret);
}


/*
 * Pull the remote per partition specific variables from the specified
 * partition.
@@ -307,7 +295,6 @@ xpc_pull_remote_vars_part(struct xpc_partition *part)
	partid_t partid = XPC_PARTID(part);
	enum xpc_retval ret;


	/* pull the cacheline that contains the variables we're interested in */

	DBUG_ON(part->remote_vars_part_pa !=
@@ -320,7 +307,8 @@ xpc_pull_remote_vars_part(struct xpc_partition *part)
	remote_entry_cacheline_pa = (remote_entry_pa & ~(L1_CACHE_BYTES - 1));

	pulled_entry = (struct xpc_vars_part *)((u64)pulled_entry_cacheline +
				(remote_entry_pa & (L1_CACHE_BYTES - 1)));
						(remote_entry_pa &
						 (L1_CACHE_BYTES - 1)));

	ret = xpc_pull_remote_cachelines(part, pulled_entry_cacheline,
					 (void *)remote_entry_cacheline_pa,
@@ -331,7 +319,6 @@ xpc_pull_remote_vars_part(struct xpc_partition *part)
		return ret;
	}


	/* see if they've been set up yet */

	if (pulled_entry->magic != XPC_VP_MAGIC1 &&
@@ -388,7 +375,6 @@ xpc_pull_remote_vars_part(struct xpc_partition *part)
	return xpcSuccess;
}


/*
 * Get the IPI flags and pull the openclose args and/or remote GPs as needed.
 */
@@ -399,7 +385,6 @@ xpc_get_IPI_flags(struct xpc_partition *part)
	u64 IPI_amo;
	enum xpc_retval ret;


	/*
	 * See if there are any IPI flags to be handled.
	 */
@@ -410,11 +395,11 @@ xpc_get_IPI_flags(struct xpc_partition *part)
	}
	spin_unlock_irqrestore(&part->IPI_lock, irq_flags);


	if (XPC_ANY_OPENCLOSE_IPI_FLAGS_SET(IPI_amo)) {
		ret = xpc_pull_remote_cachelines(part,
						 part->remote_openclose_args,
					(void *) part->remote_openclose_args_pa,
						 (void *)part->
						 remote_openclose_args_pa,
						 XPC_OPENCLOSE_ARGS_SIZE);
		if (ret != xpcSuccess) {
			XPC_DEACTIVATE_PARTITION(part, ret);
@@ -446,7 +431,6 @@ xpc_get_IPI_flags(struct xpc_partition *part)
	return IPI_amo;
}


/*
 * Allocate the local message queue and the notify queue.
 */
@@ -457,7 +441,6 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch)
	int nentries;
	size_t nbytes;


	// >>> may want to check for ch->flags & XPC_C_DISCONNECTING between
	// >>> iterations of the for-loop, bail if set?

@@ -467,7 +450,8 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch)
		nbytes = nentries * ch->msg_size;
		ch->local_msgqueue = xpc_kzalloc_cacheline_aligned(nbytes,
								   GFP_KERNEL,
						&ch->local_msgqueue_base);
								   &ch->
								   local_msgqueue_base);
		if (ch->local_msgqueue == NULL) {
			continue;
		}
@@ -497,7 +481,6 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch)
	return xpcNoMemory;
}


/*
 * Allocate the cached remote message queue.
 */
@@ -508,7 +491,6 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch)
	int nentries;
	size_t nbytes;


	DBUG_ON(ch->remote_nentries <= 0);

	// >>> may want to check for ch->flags & XPC_C_DISCONNECTING between
@@ -520,7 +502,8 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch)
		nbytes = nentries * ch->msg_size;
		ch->remote_msgqueue = xpc_kzalloc_cacheline_aligned(nbytes,
								    GFP_KERNEL,
						&ch->remote_msgqueue_base);
								    &ch->
								    remote_msgqueue_base);
		if (ch->remote_msgqueue == NULL) {
			continue;
		}
@@ -542,7 +525,6 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch)
	return xpcNoMemory;
}


/*
 * Allocate message queues and other stuff associated with a channel.
 *
@@ -554,7 +536,6 @@ xpc_allocate_msgqueues(struct xpc_channel *ch)
	unsigned long irq_flags;
	enum xpc_retval ret;


	DBUG_ON(ch->flags & XPC_C_SETUP);

	if ((ret = xpc_allocate_local_msgqueue(ch)) != xpcSuccess) {
@@ -576,7 +557,6 @@ xpc_allocate_msgqueues(struct xpc_channel *ch)
	return xpcSuccess;
}


/*
 * Process a connect message from a remote partition.
 *
@@ -588,7 +568,6 @@ xpc_process_connect(struct xpc_channel *ch, unsigned long *irq_flags)
{
	enum xpc_retval ret;


	DBUG_ON(!spin_is_locked(&ch->lock));

	if (!(ch->flags & XPC_C_OPENREQUEST) ||
@@ -636,7 +615,6 @@ xpc_process_connect(struct xpc_channel *ch, unsigned long *irq_flags)
	spin_lock_irqsave(&ch->lock, *irq_flags);
}


/*
 * Notify those who wanted to be notified upon delivery of their message.
 */
@@ -647,7 +625,6 @@ xpc_notify_senders(struct xpc_channel *ch, enum xpc_retval reason, s64 put)
	u8 notify_type;
	s64 get = ch->w_remote_GP.get - 1;


	while (++get < put && atomic_read(&ch->n_to_notify) > 0) {

		notify = &ch->notify_queue[get % ch->local_nentries];
@@ -660,8 +637,7 @@ xpc_notify_senders(struct xpc_channel *ch, enum xpc_retval reason, s64 put)
		 */
		notify_type = notify->type;
		if (notify_type == 0 ||
				cmpxchg(&notify->type, notify_type, 0) !=
								notify_type) {
		    cmpxchg(&notify->type, notify_type, 0) != notify_type) {
			continue;
		}

@@ -685,7 +661,6 @@ xpc_notify_senders(struct xpc_channel *ch, enum xpc_retval reason, s64 put)
	}
}


/*
 * Free up message queues and other stuff that were allocated for the specified
 * channel.
@@ -733,7 +708,6 @@ xpc_free_msgqueues(struct xpc_channel *ch)
	}
}


/*
 * spin_lock_irqsave() is expected to be held on entry.
 */
@@ -743,7 +717,6 @@ xpc_process_disconnect(struct xpc_channel *ch, unsigned long *irq_flags)
	struct xpc_partition *part = &xpc_partitions[ch->partid];
	u32 channel_was_connected = (ch->flags & XPC_C_WASCONNECTED);


	DBUG_ON(!spin_is_locked(&ch->lock));

	if (!(ch->flags & XPC_C_DISCONNECTING)) {
@@ -827,7 +800,6 @@ xpc_process_disconnect(struct xpc_channel *ch, unsigned long *irq_flags)
	}
}


/*
 * Process a change in the channel's remote connection state.
 */
@@ -841,14 +813,11 @@ xpc_process_openclose_IPI(struct xpc_partition *part, int ch_number,
	struct xpc_channel *ch = &part->channels[ch_number];
	enum xpc_retval reason;



	spin_lock_irqsave(&ch->lock, irq_flags);

      again:

	if ((ch->flags & XPC_C_DISCONNECTED) &&
					(ch->flags & XPC_C_WDISCONNECT)) {
	if ((ch->flags & XPC_C_DISCONNECTED) && (ch->flags & XPC_C_WDISCONNECT)) {
		/*
		 * Delay processing IPI flags until thread waiting disconnect
		 * has had a chance to see that the channel is disconnected.
@@ -858,7 +827,6 @@ again:
		return;
	}


	if (IPI_flags & XPC_IPI_CLOSEREQUEST) {

		dev_dbg(xpc_chan, "XPC_IPI_CLOSEREQUEST (reason=%d) received "
@@ -890,7 +858,8 @@ again:
		if (ch->flags & XPC_C_DISCONNECTED) {
			if (!(IPI_flags & XPC_IPI_OPENREQUEST)) {
				if ((XPC_GET_IPI_FLAGS(part->local_IPI_amo,
					 ch_number) & XPC_IPI_OPENREQUEST)) {
						       ch_number) &
				     XPC_IPI_OPENREQUEST)) {

					DBUG_ON(ch->delayed_IPI_flags != 0);
					spin_lock(&part->IPI_lock);
@@ -937,7 +906,6 @@ again:
		xpc_process_disconnect(ch, &irq_flags);
	}


	if (IPI_flags & XPC_IPI_CLOSEREPLY) {

		dev_dbg(xpc_chan, "XPC_IPI_CLOSEREPLY received from partid=%d,"
@@ -958,7 +926,8 @@ again:
				DBUG_ON(ch->delayed_IPI_flags != 0);
				spin_lock(&part->IPI_lock);
				XPC_SET_IPI_FLAGS(part->local_IPI_amo,
						ch_number, XPC_IPI_CLOSEREPLY);
						  ch_number,
						  XPC_IPI_CLOSEREPLY);
				spin_unlock(&part->IPI_lock);
			}
			spin_unlock_irqrestore(&ch->lock, irq_flags);
@@ -973,7 +942,6 @@ again:
		}
	}


	if (IPI_flags & XPC_IPI_OPENREQUEST) {

		dev_dbg(xpc_chan, "XPC_IPI_OPENREQUEST (msg_size=%d, "
@@ -1011,7 +979,6 @@ again:
		ch->flags |= (XPC_C_ROPENREQUEST | XPC_C_CONNECTING);
		ch->remote_nentries = args->local_nentries;


		if (ch->flags & XPC_C_OPENREQUEST) {
			if (args->msg_size != ch->msg_size) {
				XPC_DISCONNECT_CHANNEL(ch, xpcUnequalMsgSizes,
@@ -1031,7 +998,6 @@ again:
		xpc_process_connect(ch, &irq_flags);
	}


	if (IPI_flags & XPC_IPI_OPENREPLY) {

		dev_dbg(xpc_chan, "XPC_IPI_OPENREPLY (local_msgqueue_pa=0x%lx, "
@@ -1093,7 +1059,6 @@ again:
	spin_unlock_irqrestore(&ch->lock, irq_flags);
}


/*
 * Attempt to establish a channel connection to a remote partition.
 */
@@ -1103,7 +1068,6 @@ xpc_connect_channel(struct xpc_channel *ch)
	unsigned long irq_flags;
	struct xpc_registration *registration = &xpc_registrations[ch->number];


	if (mutex_trylock(&registration->mutex) == 0) {
		return xpcRetry;
	}
@@ -1124,7 +1088,6 @@ xpc_connect_channel(struct xpc_channel *ch)
		return ch->reason;
	}


	/* add info from the channel connect registration to the channel */

	ch->kthreads_assigned_limit = registration->assigned_limit;
@@ -1169,7 +1132,6 @@ xpc_connect_channel(struct xpc_channel *ch)

	mutex_unlock(&registration->mutex);


	/* initiate the connection */

	ch->flags |= (XPC_C_OPENREQUEST | XPC_C_CONNECTING);
@@ -1182,7 +1144,6 @@ xpc_connect_channel(struct xpc_channel *ch)
	return xpcSuccess;
}


/*
 * Clear some of the msg flags in the local message queue.
 */
@@ -1192,16 +1153,15 @@ xpc_clear_local_msgqueue_flags(struct xpc_channel *ch)
	struct xpc_msg *msg;
	s64 get;


	get = ch->w_remote_GP.get;
	do {
		msg = (struct xpc_msg *)((u64)ch->local_msgqueue +
				(get % ch->local_nentries) * ch->msg_size);
					 (get % ch->local_nentries) *
					 ch->msg_size);
		msg->flags = 0;
	} while (++get < (volatile s64)ch->remote_GP.get);
}


/*
 * Clear some of the msg flags in the remote message queue.
 */
@@ -1211,26 +1171,23 @@ xpc_clear_remote_msgqueue_flags(struct xpc_channel *ch)
	struct xpc_msg *msg;
	s64 put;


	put = ch->w_remote_GP.put;
	do {
		msg = (struct xpc_msg *)((u64)ch->remote_msgqueue +
				(put % ch->remote_nentries) * ch->msg_size);
					 (put % ch->remote_nentries) *
					 ch->msg_size);
		msg->flags = 0;
	} while (++put < (volatile s64)ch->remote_GP.put);
}


static void
xpc_process_msg_IPI(struct xpc_partition *part, int ch_number)
{
	struct xpc_channel *ch = &part->channels[ch_number];
	int nmsgs_sent;


	ch->remote_GP = part->remote_GPs[ch_number];


	/* See what, if anything, has changed for each connected channel */

	xpc_msgqueue_ref(ch);
@@ -1247,7 +1204,6 @@ xpc_process_msg_IPI(struct xpc_partition *part, int ch_number)
		return;
	}


	/*
	 * First check to see if messages recently sent by us have been
	 * received by the other side. (The remote GET value will have
@@ -1293,7 +1249,6 @@ xpc_process_msg_IPI(struct xpc_partition *part, int ch_number)
		}
	}


	/*
	 * Now check for newly sent messages by the other side. (The remote
	 * PUT value will have changed since we last looked at it.)
@@ -1327,7 +1282,6 @@ xpc_process_msg_IPI(struct xpc_partition *part, int ch_number)
	xpc_msgqueue_deref(ch);
}


void
xpc_process_channel_activity(struct xpc_partition *part)
{
@@ -1337,7 +1291,6 @@ xpc_process_channel_activity(struct xpc_partition *part)
	int ch_number;
	u32 ch_flags;


	IPI_amo = xpc_get_IPI_flags(part);

	/*
@@ -1350,7 +1303,6 @@ xpc_process_channel_activity(struct xpc_partition *part)
	for (ch_number = 0; ch_number < part->nchannels; ch_number++) {
		ch = &part->channels[ch_number];


		/*
		 * Process any open or close related IPI flags, and then deal
		 * with connecting or disconnecting the channel as required.
@@ -1387,7 +1339,6 @@ xpc_process_channel_activity(struct xpc_partition *part)
			continue;
		}


		/*
		 * Process any message related IPI flags, this may involve the
		 * activation of kthreads to deliver any pending messages sent
@@ -1400,7 +1351,6 @@ xpc_process_channel_activity(struct xpc_partition *part)
	}
}


/*
 * XPC's heartbeat code calls this function to inform XPC that a partition is
 * going down.  XPC responds by tearing down the XPartition Communication
@@ -1417,7 +1367,6 @@ xpc_partition_going_down(struct xpc_partition *part, enum xpc_retval reason)
	int ch_number;
	struct xpc_channel *ch;


	dev_dbg(xpc_chan, "deactivating partition %d, reason=%d\n",
		XPC_PARTID(part), reason);

@@ -1426,7 +1375,6 @@ xpc_partition_going_down(struct xpc_partition *part, enum xpc_retval reason)
		return;
	}


	/* disconnect channels associated with the partition going down */

	for (ch_number = 0; ch_number < part->nchannels; ch_number++) {
@@ -1446,7 +1394,6 @@ xpc_partition_going_down(struct xpc_partition *part, enum xpc_retval reason)
	xpc_part_deref(part);
}


/*
 * Teardown the infrastructure necessary to support XPartition Communication
 * between the specified remote partition and the local one.
@@ -1456,7 +1403,6 @@ xpc_teardown_infrastructure(struct xpc_partition *part)
{
	partid_t partid = XPC_PARTID(part);


	/*
	 * We start off by making this partition inaccessible to local
	 * processes by marking it as no longer setup. Then we make it
@@ -1473,17 +1419,14 @@ xpc_teardown_infrastructure(struct xpc_partition *part)

	xpc_vars_part[partid].magic = 0;


	free_irq(SGI_XPC_NOTIFY, (void *)(u64)partid);


	/*
	 * Before proceeding with the teardown we have to wait until all
	 * existing references cease.
	 */
	wait_event(part->teardown_wq, (atomic_read(&part->references) == 0));


	/* now we can begin tearing down the infrastructure */

	part->setup_state = XPC_P_TORNDOWN;
@@ -1504,7 +1447,6 @@ xpc_teardown_infrastructure(struct xpc_partition *part)
	part->local_IPI_amo_va = NULL;
}


/*
 * Called by XP at the time of channel connection registration to cause
 * XPC to establish connections to all currently active partitions.
@@ -1516,7 +1458,6 @@ xpc_initiate_connect(int ch_number)
	struct xpc_partition *part;
	struct xpc_channel *ch;


	DBUG_ON(ch_number < 0 || ch_number >= XPC_NCHANNELS);

	for (partid = 1; partid < XP_MAX_PARTITIONS; partid++) {
@@ -1535,7 +1476,6 @@ xpc_initiate_connect(int ch_number)
	}
}


void
xpc_connected_callout(struct xpc_channel *ch)
{
@@ -1553,7 +1493,6 @@ xpc_connected_callout(struct xpc_channel *ch)
	}
}


/*
 * Called by XP at the time of channel connection unregistration to cause
 * XPC to teardown all current connections for the specified channel.
@@ -1575,7 +1514,6 @@ xpc_initiate_disconnect(int ch_number)
	struct xpc_partition *part;
	struct xpc_channel *ch;


	DBUG_ON(ch_number < 0 || ch_number >= XPC_NCHANNELS);

	/* initiate the channel disconnect for every active partition */
@@ -1605,7 +1543,6 @@ xpc_initiate_disconnect(int ch_number)
	xpc_disconnect_wait(ch_number);
}


/*
 * To disconnect a channel, and reflect it back to all who may be waiting.
 *
@@ -1621,7 +1558,6 @@ xpc_disconnect_channel(const int line, struct xpc_channel *ch,
{
	u32 channel_was_connected = (ch->flags & XPC_C_CONNECTED);


	DBUG_ON(!spin_is_locked(&ch->lock));

	if (ch->flags & (XPC_C_DISCONNECTING | XPC_C_DISCONNECTED)) {
@@ -1666,7 +1602,6 @@ xpc_disconnect_channel(const int line, struct xpc_channel *ch,
	spin_lock_irqsave(&ch->lock, *irq_flags);
}


void
xpc_disconnect_callout(struct xpc_channel *ch, enum xpc_retval reason)
{
@@ -1687,7 +1622,6 @@ xpc_disconnect_callout(struct xpc_channel *ch, enum xpc_retval reason)
	}
}


/*
 * Wait for a message entry to become available for the specified channel,
 * but don't wait any longer than 1 jiffy.
@@ -1697,7 +1631,6 @@ xpc_allocate_msg_wait(struct xpc_channel *ch)
{
	enum xpc_retval ret;


	if (ch->flags & XPC_C_DISCONNECTING) {
		DBUG_ON(ch->reason == xpcInterrupted);	// >>> Is this true?
		return ch->reason;
@@ -1719,7 +1652,6 @@ xpc_allocate_msg_wait(struct xpc_channel *ch)
	return ret;
}


/*
 * Allocate an entry for a message from the message queue associated with the
 * specified channel.
@@ -1732,7 +1664,6 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags,
	enum xpc_retval ret;
	s64 put;


	/* this reference will be dropped in xpc_send_msg() */
	xpc_msgqueue_ref(ch);

@@ -1745,7 +1676,6 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags,
		return xpcNotConnected;
	}


	/*
	 * Get the next available message entry from the local message queue.
	 * If none are available, we'll make sure that we grab the latest
@@ -1765,15 +1695,13 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags,
			 * doesn't beat us to it. If they do, we'll have to
			 * try again.
			 */
			if (cmpxchg(&ch->w_local_GP.put, put, put + 1) ==
									put) {
			if (cmpxchg(&ch->w_local_GP.put, put, put + 1) == put) {
				/* we got the entry referenced by put */
				break;
			}
			continue;	/* try again */
		}


		/*
		 * There aren't any available msg entries at this time.
		 *
@@ -1799,12 +1727,10 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags,
		}
	}


	/* get the message's address and initialize it */
	msg = (struct xpc_msg *)((u64)ch->local_msgqueue +
				 (put % ch->local_nentries) * ch->msg_size);


	DBUG_ON(msg->flags != 0);
	msg->number = put;

@@ -1817,7 +1743,6 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags,
	return xpcSuccess;
}


/*
 * Allocate an entry for a message from the message queue associated with the
 * specified channel. NOTE that this routine can sleep waiting for a message
@@ -1838,7 +1763,6 @@ xpc_initiate_allocate(partid_t partid, int ch_number, u32 flags, void **payload)
	enum xpc_retval ret = xpcUnknownReason;
	struct xpc_msg *msg = NULL;


	DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS);
	DBUG_ON(ch_number < 0 || ch_number >= part->nchannels);

@@ -1856,7 +1780,6 @@ xpc_initiate_allocate(partid_t partid, int ch_number, u32 flags, void **payload)
	return ret;
}


/*
 * Now we actually send the messages that are ready to be sent by advancing
 * the local message queue's Put value and then send an IPI to the recipient
@@ -1869,7 +1792,6 @@ xpc_send_msgs(struct xpc_channel *ch, s64 initial_put)
	s64 put = initial_put + 1;
	int send_IPI = 0;


	while (1) {

		while (1) {
@@ -1878,7 +1800,8 @@ xpc_send_msgs(struct xpc_channel *ch, s64 initial_put)
			}

			msg = (struct xpc_msg *)((u64)ch->local_msgqueue +
			       (put % ch->local_nentries) * ch->msg_size);
						 (put % ch->local_nentries) *
						 ch->msg_size);

			if (!(msg->flags & XPC_M_READY)) {
				break;
@@ -1919,7 +1842,6 @@ xpc_send_msgs(struct xpc_channel *ch, s64 initial_put)
	}
}


/*
 * Common code that does the actual sending of the message by advancing the
 * local message queue's Put value and sends an IPI to the partition the
@@ -1933,7 +1855,6 @@ xpc_send_msg(struct xpc_channel *ch, struct xpc_msg *msg, u8 notify_type,
	struct xpc_notify *notify = notify;
	s64 put, msg_number = msg->number;


	DBUG_ON(notify_type == XPC_N_CALL && func == NULL);
	DBUG_ON((((u64)msg - (u64)ch->local_msgqueue) / ch->msg_size) !=
		msg_number % ch->local_nentries);
@@ -2001,7 +1922,6 @@ xpc_send_msg(struct xpc_channel *ch, struct xpc_msg *msg, u8 notify_type,
	return ret;
}


/*
 * Send a message previously allocated using xpc_initiate_allocate() on the
 * specified channel connected to the specified partition.
@@ -2029,7 +1949,6 @@ xpc_initiate_send(partid_t partid, int ch_number, void *payload)
	struct xpc_msg *msg = XPC_MSG_ADDRESS(payload);
	enum xpc_retval ret;


	dev_dbg(xpc_chan, "msg=0x%p, partid=%d, channel=%d\n", (void *)msg,
		partid, ch_number);

@@ -2042,7 +1961,6 @@ xpc_initiate_send(partid_t partid, int ch_number, void *payload)
	return ret;
}


/*
 * Send a message previously allocated using xpc_initiate_allocate on the
 * specified channel connected to the specified partition.
@@ -2081,7 +1999,6 @@ xpc_initiate_send_notify(partid_t partid, int ch_number, void *payload,
	struct xpc_msg *msg = XPC_MSG_ADDRESS(payload);
	enum xpc_retval ret;


	dev_dbg(xpc_chan, "msg=0x%p, partid=%d, channel=%d\n", (void *)msg,
		partid, ch_number);

@@ -2095,7 +2012,6 @@ xpc_initiate_send_notify(partid_t partid, int ch_number, void *payload,
	return ret;
}


static struct xpc_msg *
xpc_pull_remote_msg(struct xpc_channel *ch, s64 get)
{
@@ -2105,7 +2021,6 @@ xpc_pull_remote_msg(struct xpc_channel *ch, s64 get)
	u64 msg_offset;
	enum xpc_retval ret;


	if (mutex_lock_interruptible(&ch->msg_to_pull_mutex) != 0) {
		/* we were interrupted by a signal */
		return NULL;
@@ -2127,13 +2042,13 @@ xpc_pull_remote_msg(struct xpc_channel *ch, s64 get)
		}

		msg_offset = msg_index * ch->msg_size;
		msg = (struct xpc_msg *) ((u64) ch->remote_msgqueue +
								msg_offset);
		msg = (struct xpc_msg *)((u64)ch->remote_msgqueue + msg_offset);
		remote_msg = (struct xpc_msg *)(ch->remote_msgqueue_pa +
						msg_offset);

		if ((ret = xpc_pull_remote_cachelines(part, msg, remote_msg,
				nmsgs * ch->msg_size)) != xpcSuccess) {
						      nmsgs * ch->msg_size)) !=
		    xpcSuccess) {

			dev_dbg(xpc_chan, "failed to pull %d msgs starting with"
				" msg %ld from partition %d, channel=%d, "
@@ -2160,7 +2075,6 @@ xpc_pull_remote_msg(struct xpc_channel *ch, s64 get)
	return msg;
}


/*
 * Get a message to be delivered.
 */
@@ -2170,7 +2084,6 @@ xpc_get_deliverable_msg(struct xpc_channel *ch)
	struct xpc_msg *msg = NULL;
	s64 get;


	do {
		if ((volatile u32)ch->flags & XPC_C_DISCONNECTING) {
			break;
@@ -2211,7 +2124,6 @@ xpc_get_deliverable_msg(struct xpc_channel *ch)
	return msg;
}


/*
 * Deliver a message to its intended recipient.
 */
@@ -2220,7 +2132,6 @@ xpc_deliver_msg(struct xpc_channel *ch)
{
	struct xpc_msg *msg;


	if ((msg = xpc_get_deliverable_msg(ch)) != NULL) {

		/*
@@ -2252,7 +2163,6 @@ xpc_deliver_msg(struct xpc_channel *ch)
	}
}


/*
 * Now we actually acknowledge the messages that have been delivered and ack'd
 * by advancing the cached remote message queue's Get value and if requested
@@ -2265,7 +2175,6 @@ xpc_acknowledge_msgs(struct xpc_channel *ch, s64 initial_get, u8 msg_flags)
	s64 get = initial_get + 1;
	int send_IPI = 0;


	while (1) {

		while (1) {
@@ -2274,7 +2183,8 @@ xpc_acknowledge_msgs(struct xpc_channel *ch, s64 initial_get, u8 msg_flags)
			}

			msg = (struct xpc_msg *)((u64)ch->remote_msgqueue +
			       (get % ch->remote_nentries) * ch->msg_size);
						 (get % ch->remote_nentries) *
						 ch->msg_size);

			if (!(msg->flags & XPC_M_DONE)) {
				break;
@@ -2292,8 +2202,7 @@ xpc_acknowledge_msgs(struct xpc_channel *ch, s64 initial_get, u8 msg_flags)
		if (cmpxchg_rel(&ch->local_GP->get, initial_get, get) !=
		    initial_get) {
			/* someone else beat us to it */
			DBUG_ON((volatile s64) ch->local_GP->get <=
								initial_get);
			DBUG_ON((volatile s64)ch->local_GP->get <= initial_get);
			break;
		}

@@ -2317,7 +2226,6 @@ xpc_acknowledge_msgs(struct xpc_channel *ch, s64 initial_get, u8 msg_flags)
	}
}


/*
 * Acknowledge receipt of a delivered message.
 *
@@ -2343,7 +2251,6 @@ xpc_initiate_received(partid_t partid, int ch_number, void *payload)
	struct xpc_msg *msg = XPC_MSG_ADDRESS(payload);
	s64 get, msg_number = msg->number;


	DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS);
	DBUG_ON(ch_number < 0 || ch_number >= part->nchannels);

@@ -2376,4 +2283,3 @@ xpc_initiate_received(partid_t partid, int ch_number, void *payload)
	/* the call to xpc_msgqueue_ref() was done by xpc_deliver_msg()  */
	xpc_msgqueue_deref(ch);
}
+138 −191

File changed.

Preview size limit exceeded, changes collapsed.

+36 −73
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@
 * Copyright (C) 1999-2008 Silicon Graphics, Inc. All rights reserved.
 */


/*
 * Cross Partition Network Interface (XPNET) support
 *
@@ -21,7 +20,6 @@
 *
 */


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
@@ -40,7 +38,6 @@
#include <asm/atomic.h>
#include "xp.h"


/*
 * The message payload transferred by XPC.
 *
@@ -79,7 +76,6 @@ struct xpnet_message {
#define XPNET_MSG_ALIGNED_SIZE	(L1_CACHE_ALIGN(XPNET_MSG_SIZE))
#define XPNET_MSG_NENTRIES	(PAGE_SIZE / XPNET_MSG_ALIGNED_SIZE)


#define XPNET_MAX_KTHREADS	(XPNET_MSG_NENTRIES + 1)
#define XPNET_MAX_IDLE_KTHREADS	(XPNET_MSG_NENTRIES + 1)

@@ -101,7 +97,6 @@ struct xpnet_message {

#define XPNET_DEVICE_NAME		"xp0"


/*
 * When messages are queued with xpc_send_notify, a kmalloc'd buffer
 * of the following type is passed as a notification cookie.  When the
@@ -145,7 +140,6 @@ static DEFINE_SPINLOCK(xpnet_broadcast_lock);
/* 32KB has been determined to be the ideal */
#define XPNET_DEF_MTU (0x8000UL)


/*
 * The partition id is encapsulated in the MAC address.  The following
 * define locates the octet the partid is in.
@@ -153,7 +147,6 @@ static DEFINE_SPINLOCK(xpnet_broadcast_lock);
#define XPNET_PARTID_OCTET	1
#define XPNET_LICENSE_OCTET	2


/*
 * Define the XPNET debug device structure that is to be used with dev_dbg(),
 * dev_err(), dev_warn(), and dev_info().
@@ -180,7 +173,6 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)
	struct xpnet_dev_private *priv =
	    (struct xpnet_dev_private *)xpnet_device->priv;


	if (!XPNET_VALID_MSG(msg)) {
		/*
		 * Packet with a different XPC version.  Ignore.
@@ -194,7 +186,6 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)
	dev_dbg(xpnet, "received 0x%lx, %d, %d, %d\n", msg->buf_pa, msg->size,
		msg->leadin_ignore, msg->tailout_ignore);


	/* reserve an extra cache line */
	skb = dev_alloc_skb(msg->size + L1_CACHE_BYTES);
	if (!skb) {
@@ -232,7 +223,8 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)
			"%lu)\n", skb->data, &msg->data,
			(size_t)msg->embedded_bytes);

		skb_copy_to_linear_data(skb, &msg->data, (size_t)msg->embedded_bytes);
		skb_copy_to_linear_data(skb, &msg->data,
					(size_t)msg->embedded_bytes);
	} else {
		dev_dbg(xpnet, "transferring buffer to the skb->data area;\n\t"
			"bte_copy(0x%p, 0x%p, %hu)\n", (void *)msg->buf_pa,
@@ -275,7 +267,6 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)
		(void *)skb->head, (void *)skb->data, skb_tail_pointer(skb),
		skb_end_pointer(skb), skb->len);


	xpnet_device->last_rx = jiffies;
	priv->stats.rx_packets++;
	priv->stats.rx_bytes += skb->len + ETH_HLEN;
@@ -284,7 +275,6 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)
	xpc_received(partid, channel, (void *)msg);
}


/*
 * This is the handler which XPC calls during any sort of change in
 * state or message reception on a connection.
@@ -295,7 +285,6 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel,
{
	long bp;


	DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS);
	DBUG_ON(channel != XPC_NET_CHANNEL);

@@ -337,13 +326,11 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel,
	}
}


static int
xpnet_dev_open(struct net_device *dev)
{
	enum xpc_retval ret;


	dev_dbg(xpnet, "calling xpc_connect(%d, 0x%p, NULL, %ld, %ld, %ld, "
		"%ld)\n", XPC_NET_CHANNEL, xpnet_connection_activity,
		XPNET_MSG_SIZE, XPNET_MSG_NENTRIES, XPNET_MAX_KTHREADS,
@@ -364,7 +351,6 @@ xpnet_dev_open(struct net_device *dev)
	return 0;
}


static int
xpnet_dev_stop(struct net_device *dev)
{
@@ -375,7 +361,6 @@ xpnet_dev_stop(struct net_device *dev)
	return 0;
}


static int
xpnet_dev_change_mtu(struct net_device *dev, int new_mtu)
{
@@ -392,7 +377,6 @@ xpnet_dev_change_mtu(struct net_device *dev, int new_mtu)
	return 0;
}


/*
 * Required for the net_device structure.
 */
@@ -402,7 +386,6 @@ xpnet_dev_set_config(struct net_device *dev, struct ifmap *new_map)
	return 0;
}


/*
 * Return statistics to the caller.
 */
@@ -411,13 +394,11 @@ xpnet_dev_get_stats(struct net_device *dev)
{
	struct xpnet_dev_private *priv;


	priv = (struct xpnet_dev_private *)dev->priv;

	return &priv->stats;
}


/*
 * Notification that the other end has received the message and
 * DMA'd the skb information.  At this point, they are done with
@@ -428,9 +409,7 @@ static void
xpnet_send_completed(enum xpc_retval reason, partid_t partid, int channel,
		     void *__qm)
{
	struct xpnet_pending_msg *queued_msg =
		(struct xpnet_pending_msg *) __qm;

	struct xpnet_pending_msg *queued_msg = (struct xpnet_pending_msg *)__qm;

	DBUG_ON(queued_msg == NULL);

@@ -446,7 +425,6 @@ xpnet_send_completed(enum xpc_retval reason, partid_t partid, int channel,
	}
}


/*
 * Network layer has formatted a packet (skb) and is ready to place it
 * "on the wire".  Prepare and send an xpnet_message to all partitions
@@ -469,16 +447,13 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
	struct xpnet_dev_private *priv;
	u16 embedded_bytes;


	priv = (struct xpnet_dev_private *)dev->priv;


	dev_dbg(xpnet, ">skb->head=0x%p skb->data=0x%p skb->tail=0x%p "
		"skb->end=0x%p skb->len=%d\n", (void *)skb->head,
		(void *)skb->data, skb_tail_pointer(skb), skb_end_pointer(skb),
		skb->len);


	/*
	 * The xpnet_pending_msg tracks how many outstanding
	 * xpc_send_notifies are relying on this skb.  When none
@@ -494,7 +469,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
		return -ENOMEM;
	}


	/* get the beginning of the first cacheline and end of last */
	start_addr = ((u64)skb->data & ~(L1_CACHE_BYTES - 1));
	end_addr = L1_CACHE_ALIGN((u64)skb_tail_pointer(skb));
@@ -506,7 +480,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
		embedded_bytes = skb->len;
	}


	/*
	 * Since the send occurs asynchronously, we set the count to one
	 * and begin sending.  Any sends that happen to complete before
@@ -517,7 +490,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
	atomic_set(&queued_msg->use_count, 1);
	queued_msg->skb = skb;


	second_mac_octet = skb->data[XPNET_PARTID_OCTET];
	if (second_mac_octet == 0xff) {
		/* we are being asked to broadcast to all partitions */
@@ -543,7 +515,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
	for (dest_partid = 1; dp && dest_partid < XP_MAX_PARTITIONS;
	     dest_partid++) {


		if (!(dp & (1UL << (dest_partid - 1)))) {
			/* not destined for this partition */
			continue;
@@ -552,7 +523,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
		/* remove this partition from the destinations mask */
		dp &= ~(1UL << (dest_partid - 1));


		/* found a partition to send to */

		ret = xpc_allocate(dest_partid, XPC_NET_CHANNEL,
@@ -583,7 +553,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
			dest_partid, XPC_NET_CHANNEL, msg->buf_pa, msg->size,
			msg->leadin_ignore, msg->tailout_ignore);


		atomic_inc(&queued_msg->use_count);

		ret = xpc_send_notify(dest_partid, XPC_NET_CHANNEL, msg,
@@ -599,7 +568,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
		dev_dbg(xpnet, "no partitions to receive packet destined for "
			"%d\n", dest_partid);


		dev_kfree_skb(skb);
		kfree(queued_msg);
	}
@@ -610,7 +578,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
	return 0;
}


/*
 * Deal with transmit timeouts coming from the network layer.
 */
@@ -619,14 +586,12 @@ xpnet_dev_tx_timeout (struct net_device *dev)
{
	struct xpnet_dev_private *priv;


	priv = (struct xpnet_dev_private *)dev->priv;

	priv->stats.tx_errors++;
	return;
}


static int __init
xpnet_init(void)
{
@@ -634,7 +599,6 @@ xpnet_init(void)
	u32 license_num;
	int result = -ENOMEM;


	if (!ia64_platform_is("sn2")) {
		return -ENODEV;
	}
@@ -696,8 +660,8 @@ xpnet_init(void)

	return result;
}
module_init(xpnet_init);

module_init(xpnet_init);

static void __exit
xpnet_exit(void)
@@ -709,10 +673,9 @@ xpnet_exit(void)

	free_netdev(xpnet_device);
}
module_exit(xpnet_exit);

module_exit(xpnet_exit);

MODULE_AUTHOR("Silicon Graphics, Inc.");
MODULE_DESCRIPTION("Cross Partition Network adapter (XPNET)");
MODULE_LICENSE("GPL");