Exemple #1
0
/* Caller must hold bond lock for read */
static struct slave *tlb_choose_channel(struct bonding *bond, u32 hash_index, u32 skb_len)
{
	struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
	struct tlb_client_info *hash_table;
	struct slave *assigned_slave,max_assigned_slave,slave;
	int i;

	_lock_tx_hashtbl(bond);

	hash_table = bond_info->tx_hashtbl;
	assigned_slave = hash_table[hash_index].tx_slave;
	if (!assigned_slave) {
		assigned_slave = tlb_get_least_loaded_slave(bond);
		if(assigned_slave == assigend_slave_old) {
			max_assigned_slave = assigned_slave;
			assigned_slave = max_assigned_slave->next;
			bond_for_each_slave_from(bond,slave,i) {
				if (IS_UP(slave->dev) && (slave->link == BOND_LINK_UP) 
					&& (slave->state == BOND_STATE_ACTIVE)) {
					if (compute_gap(slave) > compute_gap(assigned_slave) 
							&& slave != max_assigned_slave)
						assigned_slave = slave;
				}
			}
		}
Exemple #2
0
static int compute_chunks_per_sect(struct params *fd,
				    int tracksize,
				    int sizecode,
				    int *gap,
				    int mask,
				    int tailsize)
{
	int tot_size;

	if (! (mask & SET_FMTGAP))
		*gap = compute_gap(fd, tracksize);	
	while(1) {
		compute_chunk_size(fd, *gap, tailsize);
		tot_size=compute_tot_size(fd, fd->chunksize, *gap, tailsize);
		if(fd->raw_capacity >= tot_size)
			/* enough space available, ok */
			break;
		if ((mask & SET_FMTGAP) || *gap <= 0)
			/* does not fit on disk */
			return -1;

		*gap -= (tot_size-fd->raw_capacity) * GAP_DIVISOR / tracksize;
		if (*gap < 0)
			*gap = 0;
	}

	convert_chunksize(fd);
	
	if (mask & SET_INTERLEAVE)
		fd->actual_interleave = fd->preset_interleave;

	if(verbosity >= 9) {
		printf("%d raw bytes per cylinder\n", tot_size );
		printf("%d final gap\n",
			fd->raw_capacity - tot_size );
	}
	return 0;
}
Exemple #3
0
/* Caller must hold bond lock for read */
static struct slave *tlb_get_least_loaded_slave(struct bonding *bond)
{
	struct slave *slave, *least_loaded;
	long long max_gap;
	int i;

	least_loaded = NULL;
	max_gap = LLONG_MIN;

	/* Find the slave with the largest gap */
	bond_for_each_slave(bond, slave, i) {
		if (SLAVE_IS_OK(slave)) {
			long long gap = compute_gap(slave);

			if (max_gap < gap) {
				least_loaded = slave;
				max_gap = gap;
			}
		}
	}

	return least_loaded;
}
Exemple #4
0
/*
 *return the gap
 **/
double
compute_second_eigen_vector(pdism d_mat, double *vector){	
	int i, j, k;
	int size = d_mat->num_spc;
	double *data = (double*)malloc(sizeof(double)*size*size);
	for(i=0; i<size; i++)
		for(j=0; j<size; j++)
			data[i*size+j] = d_mat->q_mat[i][j];
	gsl_matrix_view m 
		= gsl_matrix_view_array (data, size, size);

	gsl_vector *eval = gsl_vector_alloc (size);
	gsl_matrix *evec = gsl_matrix_alloc (size, size);

	gsl_eigen_symmv_workspace * w = 
		gsl_eigen_symmv_alloc (size);

	gsl_eigen_symmv (&m.matrix, eval, evec, w);

	gsl_eigen_symmv_free (w);

	gsl_eigen_symmv_sort (eval, evec, 
			GSL_EIGEN_SORT_ABS_ASC);

	//for (i = 0; i < size; i++)
	//{
	//	double eval_i 
	//		= gsl_vector_get (eval, i);
	//	gsl_vector_view evec_i 
	//		= gsl_matrix_column (evec, i);

	//	printf ("eigenvalue = %g\n", eval_i);
	//	printf ("eigenvector = \n");
	//	gsl_vector_fprintf (stdout, 
	//			&evec_i.vector, "%g");
	//}

	double max=-1000000, second_max=-1000000;
	int second =0;
	for (i = 0; i < size; i++){
		double eval_i = gsl_vector_get (eval, i);
		if(eval_i>max)
			max=eval_i;
	}
	for (i = 0; i < size; i++){
		double eval_i = gsl_vector_get (eval, i);
		if(eval_i>second_max && eval_i < max){
			second_max = eval_i;
			second = i;	
		}
	}
	gsl_vector_view evec_i = gsl_matrix_column (evec, second);
	//printf("second largest is %d %f\n", second, second_max);
	for(i=0; i<size; i++){
		vector[i] = gsl_matrix_get(evec, i, second);
	}

	gsl_vector_free (eval);
	gsl_matrix_free (evec);
	double gap = compute_gap(vector, size);
	q_sort(vector, 0, size-1);
	return gap;
	//double **e_mat = (double**)malloc(sizeof(double*)*d_mat->num_spc);
	//double **u_mat = (double**)malloc(sizeof(double*)*d_mat->num_spc);
	//double **q_mat = (double**)malloc(sizeof(double*)*d_mat->num_spc);
	//double **r_mat = (double**)malloc(sizeof(double*)*d_mat->num_spc);
	//double **p_q = (double**)malloc(sizeof(double*)*d_mat->num_spc);
	//double **tmp_pq = (double**)malloc(sizeof(double*)*d_mat->num_spc);
	//for(i=0; i<d_mat->num_spc; i++){
	//	e_mat[i] = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//	u_mat[i] = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//	q_mat[i] = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//	r_mat[i] = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//	p_q[i] = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//	tmp_pq[i] = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//	p_q[i][i] = 1.0;
	//}
	//double *project = (double*)malloc(sizeof(double)*d_mat->num_spc);
	//int terminate = FALSE;
	////perform triagulalization
	//print_mat(d_mat->q_mat, d_mat->num_spc);
	////exit(1);
	//householder(d_mat->q_mat, d_mat->num_spc);
	////perform QR algorithm by using Gram–Schmidt process
	//int count=0;
	//while(terminate == FALSE && count<1000){
	//	count++;
	//	init_mat(e_mat, d_mat->num_spc);
	//	init_mat(u_mat, d_mat->num_spc);
	//	init_mat(q_mat, d_mat->num_spc);
	//	init_mat(r_mat, d_mat->num_spc);
	//	//compute e_0 and u_0
	//	for(i=0; i<d_mat->num_spc; i++)
	//		u_mat[i][0] = d_mat->q_mat[i][0];
	//	double two_norm = compute_two_norm(u_mat, 0, d_mat->num_spc);
	//	for(i=0; i<d_mat->num_spc; i++)
	//		e_mat[i][0] = u_mat[i][0]/two_norm;	
	//	//for(i=0; i<d_mat->num_spc; i++){
	//	//	printf("%3.1f\t", e_mat[i][0]);
	//	//}
	//	//printf("\n");

	//	for(i=1; i<d_mat->num_spc; i++){			
	//		for(j=0; j<d_mat->num_spc; j++)
	//			project[j] = 0;
	//		for(j=0;j<i; j++)
	//			compute_project(d_mat->q_mat, e_mat, project, i, j+1, d_mat->num_spc);
	//		minus(d_mat->q_mat, u_mat, project, i, d_mat->num_spc);
	//		two_norm = compute_two_norm(u_mat, i, d_mat->num_spc);
	//		for(j=0; j<d_mat->num_spc; j++)
	//			e_mat[j][i] = u_mat[j][i]/two_norm;
	//		//printf("%3.1f ", two_norm);
	//	}
	//	//
	//	mat_copy(e_mat, q_mat, d_mat->num_spc);
	//	for(i=0; i<d_mat->num_spc; i++)
	//		for(j=i; j<d_mat->num_spc; j++)
	//			r_mat[i][j] = compute_inner(d_mat->q_mat, e_mat, d_mat->num_spc, j, i);
	//	mat_mul(d_mat->q_mat, q_mat, r_mat, d_mat->num_spc);
	//	mat_copy(p_q, tmp_pq, d_mat->num_spc);
	//	mat_mul(p_q, q_mat, tmp_pq, d_mat->num_spc);
	//	//print_mat(d_mat->q_mat, d_mat->num_spc);
	//	//print_mat(q_mat, d_mat->num_spc);
	//	//print_mat(r_mat, d_mat->num_spc);
	//	terminate = compute_terminate(d_mat->q_mat, d_mat->num_spc);
	//}
	////find the second largest eigen value
	//int second_idx = second_largest(d_mat->q_mat, d_mat->num_spc);
	//for(i=0; i<d_mat->num_spc; i++)
	//	vector[i] = r_mat[i][second_idx];
	//print_mat(d_mat->q_mat, d_mat->num_spc);
	//print_mat(p_q, d_mat->num_spc);
	//exit(1);
	////frees
	//for(i=0; i<d_mat->num_spc; i++){
	//	free(e_mat[i]);
	//	free(u_mat[i]);
	//	free(q_mat[i]);
	//	free(r_mat[i]);
	//	free(p_q[i]);
	//	free(tmp_pq[i]);
	//}
	//free(e_mat);
	//free(u_mat);
	//free(q_mat);
	//free(r_mat);
	//free(project);
	//free(p_q);
	//free(tmp_pq);
}