/* 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; } } }
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; }
/* 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; }
/* *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); }