Page MenuHomeFreeBSD

D15073.1781351285.diff
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

D15073.1781351285.diff

Index: mpr/mpr.c
===================================================================
--- mpr/mpr.c
+++ mpr/mpr.c
@@ -2493,12 +2493,13 @@
mpr_intr_locked(void *data)
{
MPI2_REPLY_DESCRIPTORS_UNION *desc;
+ MPI2_DIAG_RELEASE_REPLY *rel_rep;
+ mpr_fw_diagnostic_buffer_t *pBuffer;
struct mpr_softc *sc;
+ uint64_t tdesc;
struct mpr_command *cm = NULL;
uint8_t flags;
u_int pq;
- MPI2_DIAG_RELEASE_REPLY *rel_rep;
- mpr_fw_diagnostic_buffer_t *pBuffer;
sc = (struct mpr_softc *)data;
@@ -2510,6 +2511,17 @@
for ( ;; ) {
cm = NULL;
desc = &sc->post_queue[sc->replypostindex];
+
+ /*
+ * Copy and clear out the descriptor so that any reentry will
+ * immediately know that this descriptor has already been
+ * looked at. There is unfortunate casting magic because the
+ * MPI API doesn't have a cardinal 64bit type.
+ */
+ tdesc = 0xffffffffffffffff;
+ tdesc = atomic_swap_64((uint64_t *)desc, tdesc);
+ desc = (MPI2_REPLY_DESCRIPTORS_UNION *)&tdesc;
+
flags = desc->Default.ReplyFlags &
MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK;
if ((flags == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) ||
@@ -2604,7 +2616,8 @@
cm = &sc->commands[
le16toh(desc->AddressReply.SMID)];
KASSERT(cm->cm_state == MPR_CM_STATE_INQUEUE,
- ("command not inqueue\n"));
+ ("command SMID %d not inqueue\n",
+ desc->AddressReply.SMID));
cm->cm_state = MPR_CM_STATE_BUSY;
cm->cm_reply = reply;
cm->cm_reply_data =
@@ -2630,9 +2643,6 @@
mpr_display_reply_info(sc,cm->cm_reply);
mpr_complete_command(sc, cm);
}
-
- desc->Words.Low = 0xffffffff;
- desc->Words.High = 0xffffffff;
}
if (pq != sc->replypostindex) {
Index: mps/mps.c
===================================================================
--- mps/mps.c
+++ mps/mps.c
@@ -2361,12 +2361,13 @@
mps_intr_locked(void *data)
{
MPI2_REPLY_DESCRIPTORS_UNION *desc;
+ MPI2_DIAG_RELEASE_REPLY *rel_rep;
+ mps_fw_diagnostic_buffer_t *pBuffer;
struct mps_softc *sc;
struct mps_command *cm = NULL;
+ uint64_t tdesc;
uint8_t flags;
u_int pq;
- MPI2_DIAG_RELEASE_REPLY *rel_rep;
- mps_fw_diagnostic_buffer_t *pBuffer;
sc = (struct mps_softc *)data;
@@ -2378,6 +2379,17 @@
for ( ;; ) {
cm = NULL;
desc = &sc->post_queue[sc->replypostindex];
+
+ /*
+ * Copy and clear out the descriptor so that any reentry will
+ * immediately know that this descriptor has already been
+ * looked at. There is unfortunate casting magic because the
+ * MPI API doesn't have a cardinal 64bit type.
+ */
+ tdesc = 0xffffffffffffffff;
+ tdesc = atomic_swap_64((uint64_t *)desc, tdesc);
+ desc = (MPI2_REPLY_DESCRIPTORS_UNION *)&tdesc;
+
flags = desc->Default.ReplyFlags &
MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK;
if ((flags == MPI2_RPY_DESCRIPT_FLAGS_UNUSED)
@@ -2496,9 +2508,6 @@
mps_display_reply_info(sc,cm->cm_reply);
mps_complete_command(sc, cm);
}
-
- desc->Words.Low = 0xffffffff;
- desc->Words.High = 0xffffffff;
}
if (pq != sc->replypostindex) {

File Metadata

Mime Type
text/plain
Expires
Sat, Jun 13, 11:48 AM (16 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28897433
Default Alt Text
D15073.1781351285.diff (2 KB)

Event Timeline