scsi_dma.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:16k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  scsi_dma.c Copyright (C) 2000 Eric Youngdale
  3.  *
  4.  *  mid-level SCSI DMA bounce buffer allocator
  5.  *
  6.  */
  7. #define __NO_VERSION__
  8. #include <linux/config.h>
  9. #include <linux/module.h>
  10. #include <linux/blk.h>
  11. #include "scsi.h"
  12. #include "hosts.h"
  13. #include "constants.h"
  14. #ifdef CONFIG_KMOD
  15. #include <linux/kmod.h>
  16. #endif
  17. /*
  18.  * PAGE_SIZE must be a multiple of the sector size (512).  True
  19.  * for all reasonably recent architectures (even the VAX...).
  20.  */
  21. #define SECTOR_SIZE 512
  22. #define SECTORS_PER_PAGE (PAGE_SIZE/SECTOR_SIZE)
  23. #if SECTORS_PER_PAGE <= 8
  24. typedef unsigned char FreeSectorBitmap;
  25. #elif SECTORS_PER_PAGE <= 32
  26. typedef unsigned int FreeSectorBitmap;
  27. #elif SECTORS_PER_PAGE <= 64
  28. #if 0
  29. typedef unsigned long long FreeSectorBitmap;
  30. #else
  31. typedef struct {
  32. unsigned long l,h;
  33. } FreeSectorBitmap;
  34. #define LARGE_MALLOC
  35. #endif
  36. #else
  37. #error You lose.
  38. #endif
  39. /*
  40.  * Used for access to internal allocator used for DMA safe buffers.
  41.  */
  42. static spinlock_t allocator_request_lock = SPIN_LOCK_UNLOCKED;
  43. static FreeSectorBitmap *dma_malloc_freelist = NULL;
  44. static int need_isa_bounce_buffers;
  45. static unsigned int dma_sectors = 0;
  46. unsigned int scsi_dma_free_sectors = 0;
  47. unsigned int scsi_need_isa_buffer = 0;
  48. static unsigned char **dma_malloc_pages = NULL;
  49. /*
  50.  * Function:    scsi_malloc
  51.  *
  52.  * Purpose:     Allocate memory from the DMA-safe pool.
  53.  *
  54.  * Arguments:   len       - amount of memory we need.
  55.  *
  56.  * Lock status: No locks assumed to be held.  This function is SMP-safe.
  57.  *
  58.  * Returns:     Pointer to memory block.
  59.  *
  60.  * Notes:       Prior to the new queue code, this function was not SMP-safe.
  61.  *              This function can only allocate in units of sectors
  62.  *              (i.e. 512 bytes).
  63.  *
  64.  *              We cannot use the normal system allocator becuase we need
  65.  *              to be able to guarantee that we can process a complete disk
  66.  *              I/O request without touching the system allocator.  Think
  67.  *              about it - if the system were heavily swapping, and tried to
  68.  *              write out a block of memory to disk, and the SCSI code needed
  69.  *              to allocate more memory in order to be able to write the
  70.  *              data to disk, you would wedge the system.
  71.  */
  72. #ifndef LARGE_MALLOC
  73. void *scsi_malloc(unsigned int len)
  74. {
  75. unsigned int nbits, mask;
  76. unsigned long flags;
  77. int i, j;
  78. if (len % SECTOR_SIZE != 0 || len > PAGE_SIZE)
  79. return NULL;
  80. nbits = len >> 9;
  81. mask = (1 << nbits) - 1;
  82. spin_lock_irqsave(&allocator_request_lock, flags);
  83. for (i = 0; i < dma_sectors / SECTORS_PER_PAGE; i++)
  84. for (j = 0; j <= SECTORS_PER_PAGE - nbits; j++) {
  85. if ((dma_malloc_freelist[i] & (mask << j)) == 0) {
  86. dma_malloc_freelist[i] |= (mask << j);
  87. scsi_dma_free_sectors -= nbits;
  88. #ifdef DEBUG
  89. SCSI_LOG_MLQUEUE(3, printk("SMalloc: %d %p [From:%p]n", len, dma_malloc_pages[i] + (j << 9)));
  90. printk("SMalloc: %d %p [From:%p]n", len, dma_malloc_pages[i] + (j << 9));
  91. #endif
  92. spin_unlock_irqrestore(&allocator_request_lock, flags);
  93. return (void *) ((unsigned long) dma_malloc_pages[i] + (j << 9));
  94. }
  95. }
  96. spin_unlock_irqrestore(&allocator_request_lock, flags);
  97. return NULL; /* Nope.  No more */
  98. }
  99. /*
  100.  * Function:    scsi_free
  101.  *
  102.  * Purpose:     Free memory into the DMA-safe pool.
  103.  *
  104.  * Arguments:   ptr       - data block we are freeing.
  105.  *              len       - size of block we are freeing.
  106.  *
  107.  * Lock status: No locks assumed to be held.  This function is SMP-safe.
  108.  *
  109.  * Returns:     Nothing
  110.  *
  111.  * Notes:       This function *must* only be used to free memory
  112.  *              allocated from scsi_malloc().
  113.  *
  114.  *              Prior to the new queue code, this function was not SMP-safe.
  115.  *              This function can only allocate in units of sectors
  116.  *              (i.e. 512 bytes).
  117.  */
  118. int scsi_free(void *obj, unsigned int len)
  119. {
  120. unsigned int page, sector, nbits, mask;
  121. unsigned long flags;
  122. #ifdef DEBUG
  123. unsigned long ret = 0;
  124. #ifdef __mips__
  125. __asm__ __volatile__("movet%0,$31":"=r"(ret));
  126. #else
  127. ret = __builtin_return_address(0);
  128. #endif
  129. printk("scsi_free %p %dn", obj, len);
  130. SCSI_LOG_MLQUEUE(3, printk("SFree: %p %dn", obj, len));
  131. #endif
  132. spin_lock_irqsave(&allocator_request_lock, flags);
  133. for (page = 0; page < dma_sectors / SECTORS_PER_PAGE; page++) {
  134. unsigned long page_addr = (unsigned long) dma_malloc_pages[page];
  135. if ((unsigned long) obj >= page_addr &&
  136.     (unsigned long) obj < page_addr + PAGE_SIZE) {
  137. sector = (((unsigned long) obj) - page_addr) >> 9;
  138. nbits = len >> 9;
  139. mask = (1 << nbits) - 1;
  140. if (sector + nbits > SECTORS_PER_PAGE)
  141. panic("scsi_free:Bad memory alignment");
  142. if ((dma_malloc_freelist[page] &
  143.      (mask << sector)) != (mask << sector)) {
  144. #ifdef DEBUG
  145. printk("scsi_free(obj=%p, len=%d) called from %08lxn",
  146.        obj, len, ret);
  147. #endif
  148. panic("scsi_free:Trying to free unused memory");
  149. }
  150. scsi_dma_free_sectors += nbits;
  151. dma_malloc_freelist[page] &= ~(mask << sector);
  152. spin_unlock_irqrestore(&allocator_request_lock, flags);
  153. return 0;
  154. }
  155. }
  156. panic("scsi_free:Bad offset");
  157. }
  158. #else
  159. void *scsi_malloc(unsigned int len)
  160. {
  161. unsigned int nbits;
  162. unsigned long maskl, maskh, flags;
  163. FreeSectorBitmap *fsb;
  164. int i;
  165. if (len % SECTOR_SIZE != 0 || len > PAGE_SIZE)
  166. return NULL;
  167. save_flags_cli (flags);
  168. nbits = len >> 9;
  169. if (nbits < 32) {
  170. maskl = (1 << nbits) - 1;
  171. maskh = 0;
  172. } else {
  173. maskl = (unsigned long)-1;
  174. maskh = (1 << (nbits - 32)) - 1;
  175. }
  176. fsb = dma_malloc_freelist;
  177. for (i = 0; i < dma_sectors / SECTORS_PER_PAGE; i++) {
  178. unsigned long mml, mmh;
  179. int j;
  180. mml = maskl;
  181. mmh = maskh;
  182. j = 0;
  183. do {
  184. if ((fsb->l & mml) == 0 && (fsb->h & mmh) == 0) {
  185. fsb->h |= mmh;
  186. fsb->l |= mml;
  187. restore_flags (flags);
  188. scsi_dma_free_sectors -= nbits;
  189. #ifdef DEBUG
  190. printk("SMalloc: %d %pn",len, dma_malloc_pages[i] + (j << 9));
  191. #endif
  192. return (void *) ((unsigned long) dma_malloc_pages[i] + (j << 9));
  193. }
  194. mmh = (mmh << 1) | (mml >> 31);
  195. mml <<= 1;
  196. j++;
  197. } while (!(mmh & (1 << 31)));
  198. fsb ++;
  199. }
  200. return NULL;  /* Nope.  No more */
  201. }
  202. int scsi_free(void *obj, unsigned int len)
  203. {
  204. unsigned int page, sector, nbits;
  205. unsigned long maskl, maskh, flags;
  206. #ifdef DEBUG
  207. printk("scsi_free %p %dn",obj, len);
  208. #endif
  209. for (page = 0; page < dma_sectors / SECTORS_PER_PAGE; page++) {
  210. unsigned long page_addr = (unsigned long) dma_malloc_pages[page];
  211. if ((unsigned long) obj >= page_addr &&
  212.     (unsigned long) obj < page_addr + PAGE_SIZE) {
  213. sector = (((unsigned long) obj) - page_addr) >> 9;
  214. nbits = len >> 9;
  215. if (nbits < 32) {
  216. maskl = (1 << nbits) - 1;
  217. maskh = 0;
  218. } else {
  219. maskl = (unsigned long)-1;
  220. maskh = (1 << (nbits - 32)) - 1;
  221. }
  222. if ((sector + nbits) > SECTORS_PER_PAGE)
  223. panic ("scsi_free:Bad memory alignment");
  224. maskh = (maskh << sector) | (maskl >> (32 - sector));
  225. maskl = maskl << sector;
  226. save_flags_cli(flags);
  227. if (((dma_malloc_freelist[page].l & maskl) != maskl) ||
  228.     ((dma_malloc_freelist[page].h & maskh) != maskh))
  229. panic("scsi_free:Trying to free unused memory");
  230. scsi_dma_free_sectors += nbits;
  231. dma_malloc_freelist[page].l &= ~maskl;
  232. dma_malloc_freelist[page].h &= ~maskh;
  233. restore_flags(flags);
  234. return 0;
  235. }
  236. }
  237. panic("scsi_free:Bad offset");
  238. }
  239. #endif
  240. /*
  241.  * Function:    scsi_resize_dma_pool
  242.  *
  243.  * Purpose:     Ensure that the DMA pool is sufficiently large to be
  244.  *              able to guarantee that we can always process I/O requests
  245.  *              without calling the system allocator.
  246.  *
  247.  * Arguments:   None.
  248.  *
  249.  * Lock status: No locks assumed to be held.  This function is SMP-safe.
  250.  *
  251.  * Returns:     Nothing
  252.  *
  253.  * Notes:       Prior to the new queue code, this function was not SMP-safe.
  254.  *              Go through the device list and recompute the most appropriate
  255.  *              size for the dma pool.  Then grab more memory (as required).
  256.  */
  257. void scsi_resize_dma_pool(void)
  258. {
  259. int i, k;
  260. unsigned long size;
  261. unsigned long flags;
  262. struct Scsi_Host *shpnt;
  263. struct Scsi_Host *host = NULL;
  264. Scsi_Device *SDpnt;
  265. FreeSectorBitmap *new_dma_malloc_freelist = NULL;
  266. unsigned int new_dma_sectors = 0;
  267. unsigned int new_need_isa_buffer = 0;
  268. unsigned char **new_dma_malloc_pages = NULL;
  269. int out_of_space = 0;
  270. spin_lock_irqsave(&allocator_request_lock, flags);
  271. if (!scsi_hostlist) {
  272. /*
  273.  * Free up the DMA pool.
  274.  */
  275. if (scsi_dma_free_sectors != dma_sectors)
  276. panic("SCSI DMA pool memory leak %d %dn", scsi_dma_free_sectors, dma_sectors);
  277. for (i = 0; i < dma_sectors / SECTORS_PER_PAGE; i++)
  278. free_pages((unsigned long) dma_malloc_pages[i], 0);
  279. if (dma_malloc_pages)
  280. kfree((char *) dma_malloc_pages);
  281. dma_malloc_pages = NULL;
  282. if (dma_malloc_freelist)
  283. kfree((char *) dma_malloc_freelist);
  284. dma_malloc_freelist = NULL;
  285. dma_sectors = 0;
  286. scsi_dma_free_sectors = 0;
  287. spin_unlock_irqrestore(&allocator_request_lock, flags);
  288. return;
  289. }
  290. /* Next, check to see if we need to extend the DMA buffer pool */
  291. new_dma_sectors = 2 * SECTORS_PER_PAGE; /* Base value we use */
  292. if (__pa(high_memory) - 1 > ISA_DMA_THRESHOLD)
  293. need_isa_bounce_buffers = 1;
  294. else
  295. need_isa_bounce_buffers = 0;
  296. if (scsi_devicelist)
  297. for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next)
  298. new_dma_sectors += SECTORS_PER_PAGE; /* Increment for each host */
  299. for (host = scsi_hostlist; host; host = host->next) {
  300. for (SDpnt = host->host_queue; SDpnt; SDpnt = SDpnt->next) {
  301. /*
  302.  * sd and sr drivers allocate scatterlists.
  303.  * sr drivers may allocate for each command 1x2048 or 2x1024 extra
  304.  * buffers for 2k sector size and 1k fs.
  305.  * sg driver allocates buffers < 4k.
  306.  * st driver does not need buffers from the dma pool.
  307.  * estimate 4k buffer/command for devices of unknown type (should panic).
  308.  */
  309. if (SDpnt->type == TYPE_WORM || SDpnt->type == TYPE_ROM ||
  310.     SDpnt->type == TYPE_DISK || SDpnt->type == TYPE_MOD) {
  311. int nents = host->sg_tablesize;
  312. #ifdef DMA_CHUNK_SIZE
  313. /* If the architecture does DMA sg merging, make sure
  314.    we count with at least 64 entries even for HBAs
  315.    which handle very few sg entries.  */
  316. if (nents < 64) nents = 64;
  317. #endif
  318. new_dma_sectors += ((nents *
  319. sizeof(struct scatterlist) + 511) >> 9) *
  320.  SDpnt->queue_depth;
  321. if (SDpnt->type == TYPE_WORM || SDpnt->type == TYPE_ROM)
  322. new_dma_sectors += (2048 >> 9) * SDpnt->queue_depth;
  323. } else if (SDpnt->type == TYPE_SCANNER ||
  324.    SDpnt->type == TYPE_PRINTER ||
  325.    SDpnt->type == TYPE_PROCESSOR ||
  326.    SDpnt->type == TYPE_COMM ||
  327.    SDpnt->type == TYPE_MEDIUM_CHANGER ||
  328.    SDpnt->type == TYPE_ENCLOSURE) {
  329. new_dma_sectors += (4096 >> 9) * SDpnt->queue_depth;
  330. } else {
  331. if (SDpnt->type != TYPE_TAPE) {
  332. printk("resize_dma_pool: unknown device type %dn", SDpnt->type);
  333. new_dma_sectors += (4096 >> 9) * SDpnt->queue_depth;
  334. }
  335. }
  336. if (host->unchecked_isa_dma &&
  337.     need_isa_bounce_buffers &&
  338.     SDpnt->type != TYPE_TAPE) {
  339. new_dma_sectors += (PAGE_SIZE >> 9) * host->sg_tablesize *
  340.     SDpnt->queue_depth;
  341. new_need_isa_buffer++;
  342. }
  343. }
  344. }
  345. #ifdef DEBUG_INIT
  346. printk("resize_dma_pool: needed dma sectors = %dn", new_dma_sectors);
  347. #endif
  348. /* limit DMA memory to 32MB: */
  349. new_dma_sectors = (new_dma_sectors + 15) & 0xfff0;
  350. /*
  351.  * We never shrink the buffers - this leads to
  352.  * race conditions that I would rather not even think
  353.  * about right now.
  354.  */
  355. #if 0 /* Why do this? No gain and risks out_of_space */
  356. if (new_dma_sectors < dma_sectors)
  357. new_dma_sectors = dma_sectors;
  358. #endif
  359. if (new_dma_sectors <= dma_sectors) {
  360. spin_unlock_irqrestore(&allocator_request_lock, flags);
  361. return; /* best to quit while we are in front */
  362.         }
  363. for (k = 0; k < 20; ++k) { /* just in case */
  364. out_of_space = 0;
  365. size = (new_dma_sectors / SECTORS_PER_PAGE) *
  366.     sizeof(FreeSectorBitmap);
  367. new_dma_malloc_freelist = (FreeSectorBitmap *)
  368.     kmalloc(size, GFP_ATOMIC);
  369. if (new_dma_malloc_freelist) {
  370.                         memset(new_dma_malloc_freelist, 0, size);
  371. size = (new_dma_sectors / SECTORS_PER_PAGE) *
  372.     sizeof(*new_dma_malloc_pages);
  373. new_dma_malloc_pages = (unsigned char **)
  374.     kmalloc(size, GFP_ATOMIC);
  375. if (!new_dma_malloc_pages) {
  376. size = (new_dma_sectors / SECTORS_PER_PAGE) *
  377.     sizeof(FreeSectorBitmap);
  378. kfree((char *) new_dma_malloc_freelist);
  379. out_of_space = 1;
  380. } else {
  381.                                 memset(new_dma_malloc_pages, 0, size);
  382.                         }
  383. } else
  384. out_of_space = 1;
  385. if ((!out_of_space) && (new_dma_sectors > dma_sectors)) {
  386. for (i = dma_sectors / SECTORS_PER_PAGE;
  387.    i < new_dma_sectors / SECTORS_PER_PAGE; i++) {
  388. new_dma_malloc_pages[i] = (unsigned char *)
  389.     __get_free_pages(GFP_ATOMIC | GFP_DMA, 0);
  390. if (!new_dma_malloc_pages[i])
  391. break;
  392. }
  393. if (i != new_dma_sectors / SECTORS_PER_PAGE) { /* clean up */
  394. int k = i;
  395. out_of_space = 1;
  396. for (i = 0; i < k; ++i)
  397. free_pages((unsigned long) new_dma_malloc_pages[i], 0);
  398. }
  399. }
  400. if (out_of_space) { /* try scaling down new_dma_sectors request */
  401. printk("scsi::resize_dma_pool: WARNING, dma_sectors=%u, "
  402.        "wanted=%u, scalingn", dma_sectors, new_dma_sectors);
  403. if (new_dma_sectors < (8 * SECTORS_PER_PAGE))
  404. break; /* pretty well hopeless ... */
  405. new_dma_sectors = (new_dma_sectors * 3) / 4;
  406. new_dma_sectors = (new_dma_sectors + 15) & 0xfff0;
  407. if (new_dma_sectors <= dma_sectors)
  408. break; /* stick with what we have got */
  409. } else
  410. break; /* found space ... */
  411. } /* end of for loop */
  412. if (out_of_space) {
  413. spin_unlock_irqrestore(&allocator_request_lock, flags);
  414. scsi_need_isa_buffer = new_need_isa_buffer; /* some useful info */
  415. printk("      WARNING, not enough memory, pool not expandedn");
  416. return;
  417. }
  418. /* When we dick with the actual DMA list, we need to
  419.  * protect things
  420.  */
  421. if (dma_malloc_freelist) {
  422. size = (dma_sectors / SECTORS_PER_PAGE) * sizeof(FreeSectorBitmap);
  423. memcpy(new_dma_malloc_freelist, dma_malloc_freelist, size);
  424. kfree((char *) dma_malloc_freelist);
  425. }
  426. dma_malloc_freelist = new_dma_malloc_freelist;
  427. if (dma_malloc_pages) {
  428. size = (dma_sectors / SECTORS_PER_PAGE) * sizeof(*dma_malloc_pages);
  429. memcpy(new_dma_malloc_pages, dma_malloc_pages, size);
  430. kfree((char *) dma_malloc_pages);
  431. }
  432. scsi_dma_free_sectors += new_dma_sectors - dma_sectors;
  433. dma_malloc_pages = new_dma_malloc_pages;
  434. dma_sectors = new_dma_sectors;
  435. scsi_need_isa_buffer = new_need_isa_buffer;
  436. spin_unlock_irqrestore(&allocator_request_lock, flags);
  437. #ifdef DEBUG_INIT
  438. printk("resize_dma_pool: dma free sectors   = %dn", scsi_dma_free_sectors);
  439. printk("resize_dma_pool: dma sectors        = %dn", dma_sectors);
  440. printk("resize_dma_pool: need isa buffers   = %dn", scsi_need_isa_buffer);
  441. #endif
  442. }
  443. /*
  444.  * Function:    scsi_init_minimal_dma_pool
  445.  *
  446.  * Purpose:     Allocate a minimal (1-page) DMA pool.
  447.  *
  448.  * Arguments:   None.
  449.  *
  450.  * Lock status: No locks assumed to be held.  This function is SMP-safe.
  451.  *
  452.  * Returns:     Nothing
  453.  *
  454.  * Notes:       
  455.  */
  456. int scsi_init_minimal_dma_pool(void)
  457. {
  458. unsigned long size;
  459. unsigned long flags;
  460. int has_space = 0;
  461. spin_lock_irqsave(&allocator_request_lock, flags);
  462. dma_sectors = PAGE_SIZE / SECTOR_SIZE;
  463. scsi_dma_free_sectors = dma_sectors;
  464. /*
  465.  * Set up a minimal DMA buffer list - this will be used during scan_scsis
  466.  * in some cases.
  467.  */
  468. /* One bit per sector to indicate free/busy */
  469. size = (dma_sectors / SECTORS_PER_PAGE) * sizeof(FreeSectorBitmap);
  470. dma_malloc_freelist = (FreeSectorBitmap *)
  471.     kmalloc(size, GFP_ATOMIC);
  472. if (dma_malloc_freelist) {
  473.                 memset(dma_malloc_freelist, 0, size);
  474. /* One pointer per page for the page list */
  475. dma_malloc_pages = (unsigned char **) kmalloc(
  476.                         (dma_sectors / SECTORS_PER_PAGE) * sizeof(*dma_malloc_pages),
  477.      GFP_ATOMIC);
  478. if (dma_malloc_pages) {
  479.                         memset(dma_malloc_pages, 0, size);
  480. dma_malloc_pages[0] = (unsigned char *)
  481.     __get_free_pages(GFP_ATOMIC | GFP_DMA, 0);
  482. if (dma_malloc_pages[0])
  483. has_space = 1;
  484. }
  485. }
  486. if (!has_space) {
  487. if (dma_malloc_freelist) {
  488. kfree((char *) dma_malloc_freelist);
  489. if (dma_malloc_pages)
  490. kfree((char *) dma_malloc_pages);
  491. }
  492. spin_unlock_irqrestore(&allocator_request_lock, flags);
  493. printk("scsi::init_module: failed, out of memoryn");
  494. return 1;
  495. }
  496. spin_unlock_irqrestore(&allocator_request_lock, flags);
  497. return 0;
  498. }