tech-misc archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Problem to make mpt driver work fine with SAS controllers



Hello all,

Recently, I got a IBM x3200 server (model 4363), i386 arch, with a LSI Logic
1064E SAS controller and an additional HDD. I'm interested about doing RAID 1
in this server.

Garret D'Amore months ago sent a patch that makes the mpt(4) recognizes SAS
controllers like that, but he said that he couldn't make it enable the
write-cache of the controllers. Link to the mail message is here:

http://mail-index.netbsd.org/tech-kern/2007/07/26/0022.html

Then NetBSD 4.0 recognizes it but it is very slooooow to write data to the
disk. I saw that PR 36900 presents this problem. First I thought about waiting
for someone solve this problem, but I couldn't just let the server down all
this time, so I realized: "Why not study NetBSD internals and try to improve
the driver myself?". I have a reasonable knowledge with C and the kernel code
looks really clean. I then started to study the NetBSD driver infrastructure
(NetBSD Device Driver Writing Guide and references - man pages etc.).

I cannot enable the write cache with dkctl(8) nor with scsictl(8) (with
`scsictl sd0 setcache rw`. Talked to a friend (also NetBSD lover) and he
recommended me to try to study the path between scsictl (actually, dkctl, but
I prefered to switch to scsictl) and the kernel. I did it and fell into the
scsipi_ioctl.c file, specially here:

http://opengrok.netbsd.org/source/xref/sys/dev/scsipi/scsipi_ioctl.c#325

In this block, there is a physio() function. The strategy function is
implemented above. My problem is that I don't know what I can do from there.
The function call flow looks like that:

  - physio()
  +- scsistrategy()
   +- scsipi_command()
    +- scsipi_make_xs()
    +- scsipi_execute_xs()

The scsipi_execute_xs() function is interesting because it has this line:

    (chan->chan_bustype->bustype_cmd)(xs);

Ah, a callback? How do the mpt driver sets that? I found the following line in
the mpt_scsipi_attach() function (int mpt_netbsd.c):

    chan->chan_bustype = &scsi_bustype;

This element of the scsi_bustype struct, though, points to the
scsi_scsipi_cmd() function, that doesn't seem to do anything! Or am I so dumb
that I can't understand it at all?

I even don't know if it is a good way to address the problem.  Should I keep
this methodology or have I to deep into the mpt(4) code directly? What do I
have to read/study in order to understand the mpt driver? Do you have any
recommendation?

Thank you very much.

-- 
Silas Silva


Home | Main Index | Thread Index | Old Index