320 smd = kmem_zalloc(sizeof (struct segmap_data), KM_SLEEP);
321
322 seg->s_data = (void *)smd;
323 seg->s_ops = &segmap_ops;
324 smd->smd_prot = a->prot;
325
326 /*
327 * Scale the number of smap freelists to be
328 * proportional to max_ncpus * number of virtual colors.
329 * The caller can over-ride this scaling by providing
330 * a non-zero a->nfreelist argument.
331 */
332 nfreelist = a->nfreelist;
333 if (nfreelist == 0)
334 nfreelist = max_ncpus;
335 else if (nfreelist < 0 || nfreelist > 4 * max_ncpus) {
336 cmn_err(CE_WARN, "segmap_create: nfreelist out of range "
337 "%d, using %d", nfreelist, max_ncpus);
338 nfreelist = max_ncpus;
339 }
340 if (nfreelist & (nfreelist - 1)) {
341 /* round up nfreelist to the next power of two. */
342 nfreelist = 1 << (highbit(nfreelist));
343 }
344
345 /*
346 * Get the number of virtual colors - must be a power of 2.
347 */
348 if (a->shmsize)
349 smd_ncolor = a->shmsize >> MAXBSHIFT;
350 else
351 smd_ncolor = 1;
352 ASSERT((smd_ncolor & (smd_ncolor - 1)) == 0);
353 ASSERT(smd_ncolor <= SEGMAP_MAXCOLOR);
354 smd_colormsk = smd_ncolor - 1;
355 smd->smd_nfree = smd_nfree = smd_ncolor * nfreelist;
356 smd_freemsk = smd_nfree - 1;
357
358 /*
359 * Allocate and initialize the freelist headers.
360 * Note that sm_freeq[1] starts out as the release queue. This
|
320 smd = kmem_zalloc(sizeof (struct segmap_data), KM_SLEEP);
321
322 seg->s_data = (void *)smd;
323 seg->s_ops = &segmap_ops;
324 smd->smd_prot = a->prot;
325
326 /*
327 * Scale the number of smap freelists to be
328 * proportional to max_ncpus * number of virtual colors.
329 * The caller can over-ride this scaling by providing
330 * a non-zero a->nfreelist argument.
331 */
332 nfreelist = a->nfreelist;
333 if (nfreelist == 0)
334 nfreelist = max_ncpus;
335 else if (nfreelist < 0 || nfreelist > 4 * max_ncpus) {
336 cmn_err(CE_WARN, "segmap_create: nfreelist out of range "
337 "%d, using %d", nfreelist, max_ncpus);
338 nfreelist = max_ncpus;
339 }
340 if (!ISP2(nfreelist)) {
341 /* round up nfreelist to the next power of two. */
342 nfreelist = 1 << (highbit(nfreelist));
343 }
344
345 /*
346 * Get the number of virtual colors - must be a power of 2.
347 */
348 if (a->shmsize)
349 smd_ncolor = a->shmsize >> MAXBSHIFT;
350 else
351 smd_ncolor = 1;
352 ASSERT((smd_ncolor & (smd_ncolor - 1)) == 0);
353 ASSERT(smd_ncolor <= SEGMAP_MAXCOLOR);
354 smd_colormsk = smd_ncolor - 1;
355 smd->smd_nfree = smd_nfree = smd_ncolor * nfreelist;
356 smd_freemsk = smd_nfree - 1;
357
358 /*
359 * Allocate and initialize the freelist headers.
360 * Note that sm_freeq[1] starts out as the release queue. This
|